From 4be6df4b0151f88be045d463b9c29fc2a5dfa759 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Fri, 6 Sep 2024 22:24:01 +0300 Subject: [PATCH] meow --- .../aiogram-3.12.0.dist-info/INSTALLER | 1 - .../aiogram-3.12.0.dist-info/METADATA | 163 - .../aiogram-3.12.0.dist-info/RECORD | 961 ---- .../aiogram-3.12.0.dist-info/REQUESTED | 0 .../aiogram-3.12.0.dist-info/WHEEL | 4 - .../aiogram-3.12.0.dist-info/licenses/LICENSE | 18 - env/Lib/site-packages/aiogram/__init__.py | 41 - env/Lib/site-packages/aiogram/__meta__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 1614 -> 0 bytes .../__pycache__/__meta__.cpython-311.pyc | Bin 229 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 10244 -> 0 bytes .../__pycache__/loggers.cpython-311.pyc | Bin 598 -> 0 bytes .../site-packages/aiogram/client/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 184 -> 0 bytes .../client/__pycache__/bot.cpython-311.pyc | Bin 251914 -> 0 bytes .../context_controller.cpython-311.pyc | Bin 1844 -> 0 bytes .../__pycache__/default.cpython-311.pyc | Bin 3822 -> 0 bytes .../__pycache__/telegram.cpython-311.pyc | Bin 6080 -> 0 bytes env/Lib/site-packages/aiogram/client/bot.py | 4761 ----------------- .../aiogram/client/context_controller.py | 33 - .../site-packages/aiogram/client/default.py | 85 - .../aiogram/client/session/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 192 -> 0 bytes .../__pycache__/aiohttp.cpython-311.pyc | Bin 11243 -> 0 bytes .../session/__pycache__/base.cpython-311.pyc | Bin 11434 -> 0 bytes .../aiogram/client/session/aiohttp.py | 215 - .../aiogram/client/session/base.py | 265 - .../client/session/middlewares/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 204 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 2553 -> 0 bytes .../__pycache__/manager.cpython-311.pyc | Bin 3792 -> 0 bytes .../request_logging.cpython-311.pyc | Bin 2269 -> 0 bytes .../client/session/middlewares/base.py | 53 - .../client/session/middlewares/manager.py | 62 - .../session/middlewares/request_logging.py | 37 - .../site-packages/aiogram/client/telegram.py | 103 - .../aiogram/dispatcher/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 188 -> 0 bytes .../__pycache__/dispatcher.cpython-311.pyc | Bin 29372 -> 0 bytes .../__pycache__/flags.cpython-311.pyc | Bin 6939 -> 0 bytes .../__pycache__/router.cpython-311.pyc | Bin 12836 -> 0 bytes .../aiogram/dispatcher/dispatcher.py | 598 --- .../aiogram/dispatcher/event/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 194 -> 0 bytes .../event/__pycache__/bases.cpython-311.pyc | Bin 1806 -> 0 bytes .../event/__pycache__/event.cpython-311.pyc | Bin 2661 -> 0 bytes .../event/__pycache__/handler.cpython-311.pyc | Bin 6941 -> 0 bytes .../__pycache__/telegram.cpython-311.pyc | Bin 7459 -> 0 bytes .../aiogram/dispatcher/event/bases.py | 35 - .../aiogram/dispatcher/event/event.py | 53 - .../aiogram/dispatcher/event/handler.py | 99 - .../aiogram/dispatcher/event/telegram.py | 141 - .../site-packages/aiogram/dispatcher/flags.py | 127 - .../dispatcher/middlewares/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 200 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 1551 -> 0 bytes .../__pycache__/error.cpython-311.pyc | Bin 2260 -> 0 bytes .../__pycache__/manager.cpython-311.pyc | Bin 4299 -> 0 bytes .../__pycache__/user_context.cpython-311.pyc | Bin 7767 -> 0 bytes .../aiogram/dispatcher/middlewares/base.py | 29 - .../aiogram/dispatcher/middlewares/error.py | 36 - .../aiogram/dispatcher/middlewares/manager.py | 65 - .../dispatcher/middlewares/user_context.py | 178 - .../aiogram/dispatcher/router.py | 271 - .../site-packages/aiogram/enums/__init__.py | 59 - .../__pycache__/__init__.cpython-311.pyc | Bin 2410 -> 0 bytes .../bot_command_scope_type.cpython-311.pyc | Bin 946 -> 0 bytes .../__pycache__/chat_action.cpython-311.pyc | Bin 1446 -> 0 bytes .../chat_boost_source_type.cpython-311.pyc | Bin 731 -> 0 bytes .../chat_member_status.cpython-311.pyc | Bin 793 -> 0 bytes .../__pycache__/chat_type.cpython-311.pyc | Bin 727 -> 0 bytes .../__pycache__/content_type.cpython-311.pyc | Bin 2948 -> 0 bytes .../__pycache__/currency.cpython-311.pyc | Bin 2262 -> 0 bytes .../__pycache__/dice_emoji.cpython-311.pyc | Bin 772 -> 0 bytes ...encrypted_passport_element.cpython-311.pyc | Bin 1197 -> 0 bytes .../inline_query_result_type.cpython-311.pyc | Bin 951 -> 0 bytes .../input_media_type.cpython-311.pyc | Bin 745 -> 0 bytes .../input_paid_media_type.cpython-311.pyc | Bin 697 -> 0 bytes ...oard_button_poll_type_type.cpython-311.pyc | Bin 783 -> 0 bytes .../mask_position_point.cpython-311.pyc | Bin 744 -> 0 bytes .../menu_button_type.cpython-311.pyc | Bin 712 -> 0 bytes .../message_entity_type.cpython-311.pyc | Bin 1203 -> 0 bytes .../message_origin_type.cpython-311.pyc | Bin 733 -> 0 bytes .../paid_media_type.cpython-311.pyc | Bin 708 -> 0 bytes .../__pycache__/parse_mode.cpython-311.pyc | Bin 675 -> 0 bytes ...assport_element_error_type.cpython-311.pyc | Bin 950 -> 0 bytes .../__pycache__/poll_type.cpython-311.pyc | Bin 638 -> 0 bytes .../reaction_type_type.cpython-311.pyc | Bin 680 -> 0 bytes ...enue_withdrawal_state_type.cpython-311.pyc | Bin 751 -> 0 bytes .../sticker_format.cpython-311.pyc | Bin 681 -> 0 bytes .../__pycache__/sticker_type.cpython-311.pyc | Bin 722 -> 0 bytes .../topic_icon_color.cpython-311.pyc | Bin 838 -> 0 bytes .../transaction_partner_type.cpython-311.pyc | Bin 764 -> 0 bytes .../__pycache__/update_type.cpython-311.pyc | Bin 1599 -> 0 bytes .../aiogram/enums/bot_command_scope_type.py | 17 - .../aiogram/enums/chat_action.py | 32 - .../aiogram/enums/chat_boost_source_type.py | 13 - .../aiogram/enums/chat_member_status.py | 16 - .../site-packages/aiogram/enums/chat_type.py | 15 - .../aiogram/enums/content_type.py | 66 - .../site-packages/aiogram/enums/currency.py | 96 - .../site-packages/aiogram/enums/dice_emoji.py | 16 - .../enums/encrypted_passport_element.py | 23 - .../aiogram/enums/inline_query_result_type.py | 23 - .../aiogram/enums/input_media_type.py | 15 - .../aiogram/enums/input_paid_media_type.py | 12 - .../enums/keyboard_button_poll_type_type.py | 12 - .../aiogram/enums/mask_position_point.py | 14 - .../aiogram/enums/menu_button_type.py | 13 - .../aiogram/enums/message_entity_type.py | 29 - .../aiogram/enums/message_origin_type.py | 14 - .../aiogram/enums/paid_media_type.py | 13 - .../site-packages/aiogram/enums/parse_mode.py | 13 - .../enums/passport_element_error_type.py | 19 - .../site-packages/aiogram/enums/poll_type.py | 12 - .../aiogram/enums/reaction_type_type.py | 12 - .../enums/revenue_withdrawal_state_type.py | 13 - .../aiogram/enums/sticker_format.py | 13 - .../aiogram/enums/sticker_type.py | 13 - .../aiogram/enums/topic_icon_color.py | 16 - .../aiogram/enums/transaction_partner_type.py | 14 - .../aiogram/enums/update_type.py | 32 - env/Lib/site-packages/aiogram/exceptions.py | 199 - .../site-packages/aiogram/filters/__init__.py | 51 - .../__pycache__/__init__.cpython-311.pyc | Bin 1311 -> 0 bytes .../filters/__pycache__/base.cpython-311.pyc | Bin 3457 -> 0 bytes .../__pycache__/callback_data.cpython-311.pyc | Bin 10040 -> 0 bytes .../chat_member_updated.cpython-311.pyc | Bin 12390 -> 0 bytes .../__pycache__/command.cpython-311.pyc | Bin 13577 -> 0 bytes .../__pycache__/exception.cpython-311.pyc | Bin 3324 -> 0 bytes .../filters/__pycache__/logic.cpython-311.pyc | Bin 4841 -> 0 bytes .../__pycache__/magic_data.cpython-311.pyc | Bin 1773 -> 0 bytes .../filters/__pycache__/state.cpython-311.pyc | Bin 2624 -> 0 bytes env/Lib/site-packages/aiogram/filters/base.py | 55 - .../aiogram/filters/callback_data.py | 207 - .../aiogram/filters/chat_member_updated.py | 204 - .../site-packages/aiogram/filters/command.py | 298 -- .../aiogram/filters/exception.py | 55 - .../site-packages/aiogram/filters/logic.py | 77 - .../aiogram/filters/magic_data.py | 27 - .../site-packages/aiogram/filters/state.py | 43 - env/Lib/site-packages/aiogram/fsm/__init__.py | 0 .../fsm/__pycache__/__init__.cpython-311.pyc | Bin 181 -> 0 bytes .../fsm/__pycache__/context.cpython-311.pyc | Bin 3128 -> 0 bytes .../__pycache__/middleware.cpython-311.pyc | Bin 5408 -> 0 bytes .../fsm/__pycache__/scene.cpython-311.pyc | Bin 47876 -> 0 bytes .../fsm/__pycache__/state.cpython-311.pyc | Bin 10518 -> 0 bytes .../fsm/__pycache__/strategy.cpython-311.pyc | Bin 1548 -> 0 bytes env/Lib/site-packages/aiogram/fsm/context.py | 32 - .../site-packages/aiogram/fsm/middleware.py | 113 - env/Lib/site-packages/aiogram/fsm/scene.py | 912 ---- env/Lib/site-packages/aiogram/fsm/state.py | 172 - .../aiogram/fsm/storage/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 189 -> 0 bytes .../storage/__pycache__/base.cpython-311.pyc | Bin 8565 -> 0 bytes .../__pycache__/memory.cpython-311.pyc | Bin 5502 -> 0 bytes .../storage/__pycache__/mongo.cpython-311.pyc | Bin 7664 -> 0 bytes .../storage/__pycache__/redis.cpython-311.pyc | Bin 9175 -> 0 bytes .../site-packages/aiogram/fsm/storage/base.py | 183 - .../aiogram/fsm/storage/memory.py | 74 - .../aiogram/fsm/storage/mongo.py | 130 - .../aiogram/fsm/storage/redis.py | 169 - env/Lib/site-packages/aiogram/fsm/strategy.py | 37 - .../aiogram/handlers/__init__.py | 25 - .../__pycache__/__init__.cpython-311.pyc | Bin 1030 -> 0 bytes .../handlers/__pycache__/base.cpython-311.pyc | Bin 2918 -> 0 bytes .../callback_query.cpython-311.pyc | Bin 2033 -> 0 bytes .../__pycache__/chat_member.cpython-311.pyc | Bin 985 -> 0 bytes .../chosen_inline_result.cpython-311.pyc | Bin 1243 -> 0 bytes .../__pycache__/error.cpython-311.pyc | Bin 1169 -> 0 bytes .../__pycache__/inline_query.cpython-311.pyc | Bin 1198 -> 0 bytes .../__pycache__/message.cpython-311.pyc | Bin 2004 -> 0 bytes .../handlers/__pycache__/poll.cpython-311.pyc | Bin 1235 -> 0 bytes .../pre_checkout_query.cpython-311.pyc | Bin 998 -> 0 bytes .../shipping_query.cpython-311.pyc | Bin 986 -> 0 bytes .../site-packages/aiogram/handlers/base.py | 46 - .../aiogram/handlers/callback_query.py | 43 - .../aiogram/handlers/chat_member.py | 14 - .../aiogram/handlers/chosen_inline_result.py | 18 - .../site-packages/aiogram/handlers/error.py | 17 - .../aiogram/handlers/inline_query.py | 18 - .../site-packages/aiogram/handlers/message.py | 28 - .../site-packages/aiogram/handlers/poll.py | 19 - .../aiogram/handlers/pre_checkout_query.py | 14 - .../aiogram/handlers/shipping_query.py | 14 - env/Lib/site-packages/aiogram/loggers.py | 7 - .../site-packages/aiogram/methods/__init__.py | 259 - .../__pycache__/__init__.cpython-311.pyc | Bin 10593 -> 0 bytes .../add_sticker_to_set.cpython-311.pyc | Bin 1790 -> 0 bytes .../answer_callback_query.cpython-311.pyc | Bin 2471 -> 0 bytes .../answer_inline_query.cpython-311.pyc | Bin 4142 -> 0 bytes .../answer_pre_checkout_query.cpython-311.pyc | Bin 2066 -> 0 bytes .../answer_shipping_query.cpython-311.pyc | Bin 2153 -> 0 bytes .../answer_web_app_query.cpython-311.pyc | Bin 3394 -> 0 bytes .../approve_chat_join_request.cpython-311.pyc | Bin 1746 -> 0 bytes .../ban_chat_member.cpython-311.pyc | Bin 2250 -> 0 bytes .../ban_chat_sender_chat.cpython-311.pyc | Bin 1945 -> 0 bytes .../methods/__pycache__/base.cpython-311.pyc | Bin 5123 -> 0 bytes .../methods/__pycache__/close.cpython-311.pyc | Bin 1066 -> 0 bytes .../close_forum_topic.cpython-311.pyc | Bin 1772 -> 0 bytes .../close_general_forum_topic.cpython-311.pyc | Bin 1715 -> 0 bytes .../__pycache__/copy_message.cpython-311.pyc | Bin 4262 -> 0 bytes .../__pycache__/copy_messages.cpython-311.pyc | Bin 3008 -> 0 bytes .../create_chat_invite_link.cpython-311.pyc | Bin 2455 -> 0 bytes ...t_subscription_invite_link.cpython-311.pyc | Bin 2532 -> 0 bytes .../create_forum_topic.cpython-311.pyc | Bin 2114 -> 0 bytes .../create_invoice_link.cpython-311.pyc | Bin 3682 -> 0 bytes .../create_new_sticker_set.cpython-311.pyc | Bin 2362 -> 0 bytes .../decline_chat_join_request.cpython-311.pyc | Bin 1746 -> 0 bytes .../delete_chat_photo.cpython-311.pyc | Bin 1667 -> 0 bytes .../delete_chat_sticker_set.cpython-311.pyc | Bin 1834 -> 0 bytes .../delete_forum_topic.cpython-311.pyc | Bin 1770 -> 0 bytes .../delete_message.cpython-311.pyc | Bin 2335 -> 0 bytes .../delete_messages.cpython-311.pyc | Bin 1713 -> 0 bytes .../delete_my_commands.cpython-311.pyc | Bin 2491 -> 0 bytes .../delete_sticker_from_set.cpython-311.pyc | Bin 1528 -> 0 bytes .../delete_sticker_set.cpython-311.pyc | Bin 1477 -> 0 bytes .../delete_webhook.cpython-311.pyc | Bin 1643 -> 0 bytes .../edit_chat_invite_link.cpython-311.pyc | Bin 2413 -> 0 bytes ...t_subscription_invite_link.cpython-311.pyc | Bin 2026 -> 0 bytes .../edit_forum_topic.cpython-311.pyc | Bin 2023 -> 0 bytes .../edit_general_forum_topic.cpython-311.pyc | Bin 1778 -> 0 bytes .../edit_message_caption.cpython-311.pyc | Bin 3215 -> 0 bytes ...edit_message_live_location.cpython-311.pyc | Bin 3088 -> 0 bytes .../edit_message_media.cpython-311.pyc | Bin 3196 -> 0 bytes .../edit_message_reply_markup.cpython-311.pyc | Bin 2514 -> 0 bytes .../edit_message_text.cpython-311.pyc | Bin 3633 -> 0 bytes .../export_chat_invite_link.cpython-311.pyc | Bin 2282 -> 0 bytes .../forward_message.cpython-311.pyc | Bin 2408 -> 0 bytes .../forward_messages.cpython-311.pyc | Bin 2574 -> 0 bytes .../get_business_connection.cpython-311.pyc | Bin 1705 -> 0 bytes .../__pycache__/get_chat.cpython-311.pyc | Bin 1587 -> 0 bytes .../get_chat_administrators.cpython-311.pyc | Bin 2100 -> 0 bytes .../get_chat_member.cpython-311.pyc | Bin 2135 -> 0 bytes .../get_chat_member_count.cpython-311.pyc | Bin 1537 -> 0 bytes .../get_chat_menu_button.cpython-311.pyc | Bin 1907 -> 0 bytes .../get_custom_emoji_stickers.cpython-311.pyc | Bin 1722 -> 0 bytes .../__pycache__/get_file.cpython-311.pyc | Bin 2131 -> 0 bytes ..._forum_topic_icon_stickers.cpython-311.pyc | Bin 1123 -> 0 bytes .../get_game_high_scores.cpython-311.pyc | Bin 2352 -> 0 bytes .../__pycache__/get_me.cpython-311.pyc | Bin 934 -> 0 bytes .../get_my_commands.cpython-311.pyc | Bin 2513 -> 0 bytes ...fault_administrator_rights.cpython-311.pyc | Bin 1830 -> 0 bytes .../get_my_description.cpython-311.pyc | Bin 1707 -> 0 bytes .../__pycache__/get_my_name.cpython-311.pyc | Bin 1602 -> 0 bytes .../get_my_short_description.cpython-311.pyc | Bin 1761 -> 0 bytes .../get_star_transactions.cpython-311.pyc | Bin 1800 -> 0 bytes .../get_sticker_set.cpython-311.pyc | Bin 1530 -> 0 bytes .../__pycache__/get_updates.cpython-311.pyc | Bin 2228 -> 0 bytes .../get_user_chat_boosts.cpython-311.pyc | Bin 1743 -> 0 bytes .../get_user_profile_photos.cpython-311.pyc | Bin 1862 -> 0 bytes .../get_webhook_info.cpython-311.pyc | Bin 1070 -> 0 bytes .../hide_general_forum_topic.cpython-311.pyc | Bin 1759 -> 0 bytes .../__pycache__/leave_chat.cpython-311.pyc | Bin 1503 -> 0 bytes .../__pycache__/log_out.cpython-311.pyc | Bin 1135 -> 0 bytes .../pin_chat_message.cpython-311.pyc | Bin 2109 -> 0 bytes .../promote_chat_member.cpython-311.pyc | Bin 3546 -> 0 bytes .../refund_star_payment.cpython-311.pyc | Bin 1601 -> 0 bytes .../reopen_forum_topic.cpython-311.pyc | Bin 1780 -> 0 bytes ...reopen_general_forum_topic.cpython-311.pyc | Bin 1782 -> 0 bytes .../replace_sticker_in_set.cpython-311.pyc | Bin 2050 -> 0 bytes .../restrict_chat_member.cpython-311.pyc | Bin 2289 -> 0 bytes .../revoke_chat_invite_link.cpython-311.pyc | Bin 1943 -> 0 bytes .../send_animation.cpython-311.pyc | Bin 4883 -> 0 bytes .../__pycache__/send_audio.cpython-311.pyc | Bin 4730 -> 0 bytes .../send_chat_action.cpython-311.pyc | Bin 2502 -> 0 bytes .../__pycache__/send_contact.cpython-311.pyc | Bin 3570 -> 0 bytes .../__pycache__/send_dice.cpython-311.pyc | Bin 3369 -> 0 bytes .../__pycache__/send_document.cpython-311.pyc | Bin 4371 -> 0 bytes .../__pycache__/send_game.cpython-311.pyc | Bin 3092 -> 0 bytes .../__pycache__/send_invoice.cpython-311.pyc | Bin 5305 -> 0 bytes .../__pycache__/send_location.cpython-311.pyc | Bin 4006 -> 0 bytes .../send_media_group.cpython-311.pyc | Bin 3603 -> 0 bytes .../__pycache__/send_message.cpython-311.pyc | Bin 4212 -> 0 bytes .../send_paid_media.cpython-311.pyc | Bin 3219 -> 0 bytes .../__pycache__/send_photo.cpython-311.pyc | Bin 4271 -> 0 bytes .../__pycache__/send_poll.cpython-311.pyc | Bin 5237 -> 0 bytes .../__pycache__/send_sticker.cpython-311.pyc | Bin 3619 -> 0 bytes .../__pycache__/send_venue.cpython-311.pyc | Bin 4126 -> 0 bytes .../__pycache__/send_video.cpython-311.pyc | Bin 5024 -> 0 bytes .../send_video_note.cpython-311.pyc | Bin 3835 -> 0 bytes .../__pycache__/send_voice.cpython-311.pyc | Bin 4304 -> 0 bytes ...administrator_custom_title.cpython-311.pyc | Bin 1792 -> 0 bytes .../set_chat_description.cpython-311.pyc | Bin 1835 -> 0 bytes .../set_chat_menu_button.cpython-311.pyc | Bin 1942 -> 0 bytes .../set_chat_permissions.cpython-311.pyc | Bin 2008 -> 0 bytes .../set_chat_photo.cpython-311.pyc | Bin 1792 -> 0 bytes .../set_chat_sticker_set.cpython-311.pyc | Bin 1886 -> 0 bytes .../set_chat_title.cpython-311.pyc | Bin 1719 -> 0 bytes ...moji_sticker_set_thumbnail.cpython-311.pyc | Bin 1765 -> 0 bytes .../set_game_score.cpython-311.pyc | Bin 2465 -> 0 bytes .../set_message_reaction.cpython-311.pyc | Bin 2400 -> 0 bytes .../set_my_commands.cpython-311.pyc | Bin 2534 -> 0 bytes ...fault_administrator_rights.cpython-311.pyc | Bin 2054 -> 0 bytes .../set_my_description.cpython-311.pyc | Bin 1716 -> 0 bytes .../__pycache__/set_my_name.cpython-311.pyc | Bin 1612 -> 0 bytes .../set_my_short_description.cpython-311.pyc | Bin 1806 -> 0 bytes .../set_passport_data_errors.cpython-311.pyc | Bin 2967 -> 0 bytes .../set_sticker_emoji_list.cpython-311.pyc | Bin 1708 -> 0 bytes .../set_sticker_keywords.cpython-311.pyc | Bin 1777 -> 0 bytes .../set_sticker_mask_position.cpython-311.pyc | Bin 1891 -> 0 bytes ...et_sticker_position_in_set.cpython-311.pyc | Bin 1632 -> 0 bytes .../set_sticker_set_thumbnail.cpython-311.pyc | Bin 1993 -> 0 bytes .../set_sticker_set_title.cpython-311.pyc | Bin 1563 -> 0 bytes .../__pycache__/set_webhook.cpython-311.pyc | Bin 3400 -> 0 bytes ...stop_message_live_location.cpython-311.pyc | Bin 2376 -> 0 bytes .../__pycache__/stop_poll.cpython-311.pyc | Bin 1955 -> 0 bytes .../unban_chat_member.cpython-311.pyc | Bin 2189 -> 0 bytes .../unban_chat_sender_chat.cpython-311.pyc | Bin 1758 -> 0 bytes ...unhide_general_forum_topic.cpython-311.pyc | Bin 1718 -> 0 bytes .../unpin_all_chat_messages.cpython-311.pyc | Bin 1792 -> 0 bytes ...n_all_forum_topic_messages.cpython-311.pyc | Bin 1821 -> 0 bytes ...neral_forum_topic_messages.cpython-311.pyc | Bin 1793 -> 0 bytes .../unpin_chat_message.cpython-311.pyc | Bin 2047 -> 0 bytes .../upload_sticker_file.cpython-311.pyc | Bin 2010 -> 0 bytes .../aiogram/methods/add_sticker_to_set.py | 42 - .../aiogram/methods/answer_callback_query.py | 56 - .../aiogram/methods/answer_inline_query.py | 145 - .../methods/answer_pre_checkout_query.py | 46 - .../aiogram/methods/answer_shipping_query.py | 51 - .../aiogram/methods/answer_web_app_query.py | 103 - .../methods/approve_chat_join_request.py | 34 - .../aiogram/methods/ban_chat_member.py | 51 - .../aiogram/methods/ban_chat_sender_chat.py | 38 - env/Lib/site-packages/aiogram/methods/base.py | 95 - .../site-packages/aiogram/methods/close.py | 14 - .../aiogram/methods/close_forum_topic.py | 40 - .../methods/close_general_forum_topic.py | 32 - .../aiogram/methods/copy_message.py | 116 - .../aiogram/methods/copy_messages.py | 61 - .../methods/create_chat_invite_link.py | 56 - .../create_chat_subscription_invite_link.py | 52 - .../aiogram/methods/create_forum_topic.py | 51 - .../aiogram/methods/create_invoice_link.py | 115 - .../aiogram/methods/create_new_sticker_set.py | 68 - .../methods/decline_chat_join_request.py | 34 - .../aiogram/methods/delete_chat_photo.py | 32 - .../methods/delete_chat_sticker_set.py | 32 - .../aiogram/methods/delete_forum_topic.py | 40 - .../aiogram/methods/delete_message.py | 56 - .../aiogram/methods/delete_messages.py | 36 - .../aiogram/methods/delete_my_commands.py | 67 - .../methods/delete_sticker_from_set.py | 30 - .../aiogram/methods/delete_sticker_set.py | 30 - .../aiogram/methods/delete_webhook.py | 35 - .../aiogram/methods/edit_chat_invite_link.py | 60 - .../edit_chat_subscription_invite_link.py | 44 - .../aiogram/methods/edit_forum_topic.py | 50 - .../methods/edit_general_forum_topic.py | 34 - .../aiogram/methods/edit_message_caption.py | 74 - .../methods/edit_message_live_location.py | 79 - .../aiogram/methods/edit_message_media.py | 75 - .../methods/edit_message_reply_markup.py | 55 - .../aiogram/methods/edit_message_text.py | 91 - .../methods/export_chat_invite_link.py | 34 - .../aiogram/methods/forward_message.py | 61 - .../aiogram/methods/forward_messages.py | 57 - .../methods/get_business_connection.py | 34 - .../site-packages/aiogram/methods/get_chat.py | 33 - .../methods/get_chat_administrators.py | 62 - .../aiogram/methods/get_chat_member.py | 60 - .../aiogram/methods/get_chat_member_count.py | 32 - .../aiogram/methods/get_chat_menu_button.py | 35 - .../methods/get_custom_emoji_stickers.py | 33 - .../site-packages/aiogram/methods/get_file.py | 32 - .../methods/get_forum_topic_icon_stickers.py | 17 - .../aiogram/methods/get_game_high_scores.py | 53 - .../site-packages/aiogram/methods/get_me.py | 15 - .../aiogram/methods/get_my_commands.py | 68 - .../get_my_default_administrator_rights.py | 33 - .../aiogram/methods/get_my_description.py | 33 - .../aiogram/methods/get_my_name.py | 31 - .../methods/get_my_short_description.py | 33 - .../aiogram/methods/get_star_transactions.py | 39 - .../aiogram/methods/get_sticker_set.py | 31 - .../aiogram/methods/get_updates.py | 57 - .../aiogram/methods/get_user_chat_boosts.py | 33 - .../methods/get_user_profile_photos.py | 42 - .../aiogram/methods/get_webhook_info.py | 15 - .../methods/hide_general_forum_topic.py | 32 - .../aiogram/methods/leave_chat.py | 32 - .../site-packages/aiogram/methods/log_out.py | 14 - .../aiogram/methods/pin_chat_message.py | 50 - .../aiogram/methods/promote_chat_member.py | 102 - .../aiogram/methods/refund_star_payment.py | 42 - .../aiogram/methods/reopen_forum_topic.py | 40 - .../methods/reopen_general_forum_topic.py | 32 - .../aiogram/methods/replace_sticker_in_set.py | 51 - .../aiogram/methods/restrict_chat_member.py | 56 - .../methods/revoke_chat_invite_link.py | 39 - .../aiogram/methods/send_animation.py | 141 - .../aiogram/methods/send_audio.py | 132 - .../aiogram/methods/send_chat_action.py | 54 - .../aiogram/methods/send_contact.py | 113 - .../aiogram/methods/send_dice.py | 101 - .../aiogram/methods/send_document.py | 123 - .../aiogram/methods/send_game.py | 90 - .../aiogram/methods/send_invoice.py | 166 - .../aiogram/methods/send_location.py | 121 - .../aiogram/methods/send_media_group.py | 99 - .../aiogram/methods/send_message.py | 128 - .../aiogram/methods/send_paid_media.py | 97 - .../aiogram/methods/send_photo.py | 125 - .../aiogram/methods/send_poll.py | 156 - .../aiogram/methods/send_sticker.py | 106 - .../aiogram/methods/send_venue.py | 129 - .../aiogram/methods/send_video.py | 145 - .../aiogram/methods/send_video_note.py | 114 - .../aiogram/methods/send_voice.py | 119 - .../set_chat_administrator_custom_title.py | 43 - .../aiogram/methods/set_chat_description.py | 38 - .../aiogram/methods/set_chat_menu_button.py | 41 - .../aiogram/methods/set_chat_permissions.py | 47 - .../aiogram/methods/set_chat_photo.py | 39 - .../aiogram/methods/set_chat_sticker_set.py | 40 - .../aiogram/methods/set_chat_title.py | 34 - .../set_custom_emoji_sticker_set_thumbnail.py | 38 - .../aiogram/methods/set_game_score.py | 63 - .../aiogram/methods/set_message_reaction.py | 53 - .../aiogram/methods/set_my_commands.py | 73 - .../set_my_default_administrator_rights.py | 39 - .../aiogram/methods/set_my_description.py | 40 - .../aiogram/methods/set_my_name.py | 36 - .../methods/set_my_short_description.py | 42 - .../methods/set_passport_data_errors.py | 74 - .../aiogram/methods/set_sticker_emoji_list.py | 34 - .../aiogram/methods/set_sticker_keywords.py | 38 - .../methods/set_sticker_mask_position.py | 39 - .../methods/set_sticker_position_in_set.py | 34 - .../methods/set_sticker_set_thumbnail.py | 47 - .../aiogram/methods/set_sticker_set_title.py | 34 - .../aiogram/methods/set_webhook.py | 73 - .../methods/stop_message_live_location.py | 55 - .../aiogram/methods/stop_poll.py | 51 - .../aiogram/methods/unban_chat_member.py | 46 - .../aiogram/methods/unban_chat_sender_chat.py | 38 - .../methods/unhide_general_forum_topic.py | 32 - .../methods/unpin_all_chat_messages.py | 32 - .../methods/unpin_all_forum_topic_messages.py | 40 - .../unpin_all_general_forum_topic_messages.py | 30 - .../aiogram/methods/unpin_chat_message.py | 46 - .../aiogram/methods/upload_sticker_file.py | 47 - env/Lib/site-packages/aiogram/py.typed | 0 .../site-packages/aiogram/types/__init__.py | 490 -- .../__pycache__/__init__.cpython-311.pyc | Bin 20805 -> 0 bytes .../__pycache__/animation.cpython-311.pyc | Bin 2127 -> 0 bytes .../types/__pycache__/audio.cpython-311.pyc | Bin 2161 -> 0 bytes .../background_fill.cpython-311.pyc | Bin 944 -> 0 bytes ...und_fill_freeform_gradient.cpython-311.pyc | Bin 1671 -> 0 bytes .../background_fill_gradient.cpython-311.pyc | Bin 1644 -> 0 bytes .../background_fill_solid.cpython-311.pyc | Bin 1505 -> 0 bytes .../background_type.cpython-311.pyc | Bin 971 -> 0 bytes ...background_type_chat_theme.cpython-311.pyc | Bin 1546 -> 0 bytes .../background_type_fill.cpython-311.pyc | Bin 1994 -> 0 bytes .../background_type_pattern.cpython-311.pyc | Bin 2456 -> 0 bytes .../background_type_wallpaper.cpython-311.pyc | Bin 1926 -> 0 bytes .../types/__pycache__/base.cpython-311.pyc | Bin 3030 -> 0 bytes .../__pycache__/birthdate.cpython-311.pyc | Bin 1501 -> 0 bytes .../__pycache__/bot_command.cpython-311.pyc | Bin 1388 -> 0 bytes .../bot_command_scope.cpython-311.pyc | Bin 1415 -> 0 bytes ...pe_all_chat_administrators.cpython-311.pyc | Bin 1801 -> 0 bytes ...mand_scope_all_group_chats.cpython-311.pyc | Bin 1719 -> 0 bytes ...nd_scope_all_private_chats.cpython-311.pyc | Bin 1720 -> 0 bytes .../bot_command_scope_chat.cpython-311.pyc | Bin 1768 -> 0 bytes ..._scope_chat_administrators.cpython-311.pyc | Bin 1922 -> 0 bytes ..._command_scope_chat_member.cpython-311.pyc | Bin 1908 -> 0 bytes .../bot_command_scope_default.cpython-311.pyc | Bin 1802 -> 0 bytes .../bot_description.cpython-311.pyc | Bin 1291 -> 0 bytes .../__pycache__/bot_name.cpython-311.pyc | Bin 1206 -> 0 bytes .../bot_short_description.cpython-311.pyc | Bin 1331 -> 0 bytes .../business_connection.cpython-311.pyc | Bin 1811 -> 0 bytes .../business_intro.cpython-311.pyc | Bin 1696 -> 0 bytes .../business_location.cpython-311.pyc | Bin 1595 -> 0 bytes .../business_messages_deleted.cpython-311.pyc | Bin 1659 -> 0 bytes .../business_opening_hours.cpython-311.pyc | Bin 1610 -> 0 bytes ...ess_opening_hours_interval.cpython-311.pyc | Bin 1508 -> 0 bytes .../__pycache__/callback_game.cpython-311.pyc | Bin 755 -> 0 bytes .../callback_query.cpython-311.pyc | Bin 5741 -> 0 bytes .../types/__pycache__/chat.cpython-311.pyc | Bin 52859 -> 0 bytes .../chat_administrator_rights.cpython-311.pyc | Bin 2617 -> 0 bytes .../chat_background.cpython-311.pyc | Bin 1793 -> 0 bytes .../__pycache__/chat_boost.cpython-311.pyc | Bin 1962 -> 0 bytes .../chat_boost_added.cpython-311.pyc | Bin 1313 -> 0 bytes .../chat_boost_removed.cpython-311.pyc | Bin 2036 -> 0 bytes .../chat_boost_source.cpython-311.pyc | Bin 910 -> 0 bytes ...hat_boost_source_gift_code.cpython-311.pyc | Bin 1896 -> 0 bytes ...chat_boost_source_giveaway.cpython-311.pyc | Bin 2110 -> 0 bytes .../chat_boost_source_premium.cpython-311.pyc | Bin 1809 -> 0 bytes .../chat_boost_updated.cpython-311.pyc | Bin 1548 -> 0 bytes .../chat_full_info.cpython-311.pyc | Bin 7374 -> 0 bytes .../chat_invite_link.cpython-311.pyc | Bin 2198 -> 0 bytes .../chat_join_request.cpython-311.pyc | Bin 88120 -> 0 bytes .../__pycache__/chat_location.cpython-311.pyc | Bin 1470 -> 0 bytes .../__pycache__/chat_member.cpython-311.pyc | Bin 1180 -> 0 bytes .../chat_member_administrator.cpython-311.pyc | Bin 3469 -> 0 bytes .../chat_member_banned.cpython-311.pyc | Bin 1918 -> 0 bytes .../chat_member_left.cpython-311.pyc | Bin 1770 -> 0 bytes .../chat_member_member.cpython-311.pyc | Bin 1954 -> 0 bytes .../chat_member_owner.cpython-311.pyc | Bin 1968 -> 0 bytes .../chat_member_restricted.cpython-311.pyc | Bin 3252 -> 0 bytes .../chat_member_updated.cpython-311.pyc | Bin 74610 -> 0 bytes .../chat_permissions.cpython-311.pyc | Bin 2691 -> 0 bytes .../__pycache__/chat_photo.cpython-311.pyc | Bin 1538 -> 0 bytes .../__pycache__/chat_shared.cpython-311.pyc | Bin 1948 -> 0 bytes .../chosen_inline_result.cpython-311.pyc | Bin 2313 -> 0 bytes .../types/__pycache__/contact.cpython-311.pyc | Bin 1700 -> 0 bytes .../types/__pycache__/custom.cpython-311.pyc | Bin 1301 -> 0 bytes .../types/__pycache__/dice.cpython-311.pyc | Bin 1741 -> 0 bytes .../__pycache__/document.cpython-311.pyc | Bin 2093 -> 0 bytes .../__pycache__/downloadable.cpython-311.pyc | Bin 526 -> 0 bytes .../encrypted_credentials.cpython-311.pyc | Bin 1758 -> 0 bytes ...encrypted_passport_element.cpython-311.pyc | Bin 2417 -> 0 bytes .../__pycache__/error_event.cpython-311.pyc | Bin 1514 -> 0 bytes .../external_reply_info.cpython-311.pyc | Bin 5836 -> 0 bytes .../types/__pycache__/file.cpython-311.pyc | Bin 1943 -> 0 bytes .../__pycache__/force_reply.cpython-311.pyc | Bin 2903 -> 0 bytes .../__pycache__/forum_topic.cpython-311.pyc | Bin 1604 -> 0 bytes .../forum_topic_closed.cpython-311.pyc | Bin 771 -> 0 bytes .../forum_topic_created.cpython-311.pyc | Bin 1616 -> 0 bytes .../forum_topic_edited.cpython-311.pyc | Bin 1551 -> 0 bytes .../forum_topic_reopened.cpython-311.pyc | Bin 779 -> 0 bytes .../types/__pycache__/game.cpython-311.pyc | Bin 2096 -> 0 bytes .../game_high_score.cpython-311.pyc | Bin 1730 -> 0 bytes ...general_forum_topic_hidden.cpython-311.pyc | Bin 741 -> 0 bytes ...neral_forum_topic_unhidden.cpython-311.pyc | Bin 749 -> 0 bytes .../__pycache__/giveaway.cpython-311.pyc | Bin 2229 -> 0 bytes .../giveaway_completed.cpython-311.pyc | Bin 1756 -> 0 bytes .../giveaway_created.cpython-311.pyc | Bin 704 -> 0 bytes .../giveaway_winners.cpython-311.pyc | Bin 2567 -> 0 bytes .../inaccessible_message.cpython-311.pyc | Bin 1711 -> 0 bytes .../inline_keyboard_button.cpython-311.pyc | Bin 2765 -> 0 bytes .../inline_keyboard_markup.cpython-311.pyc | Bin 1651 -> 0 bytes .../__pycache__/inline_query.cpython-311.pyc | Bin 7378 -> 0 bytes .../inline_query_result.cpython-311.pyc | Bin 2649 -> 0 bytes ...nline_query_result_article.cpython-311.pyc | Bin 3306 -> 0 bytes .../inline_query_result_audio.cpython-311.pyc | Bin 3735 -> 0 bytes ..._query_result_cached_audio.cpython-311.pyc | Bin 3551 -> 0 bytes ...ery_result_cached_document.cpython-311.pyc | Bin 3729 -> 0 bytes ...ne_query_result_cached_gif.cpython-311.pyc | Bin 3857 -> 0 bytes ...ry_result_cached_mpeg4_gif.cpython-311.pyc | Bin 3940 -> 0 bytes ..._query_result_cached_photo.cpython-311.pyc | Bin 3938 -> 0 bytes ...uery_result_cached_sticker.cpython-311.pyc | Bin 2987 -> 0 bytes ..._query_result_cached_video.cpython-311.pyc | Bin 3921 -> 0 bytes ..._query_result_cached_voice.cpython-311.pyc | Bin 3617 -> 0 bytes ...nline_query_result_contact.cpython-311.pyc | Bin 3490 -> 0 bytes ...line_query_result_document.cpython-311.pyc | Bin 4096 -> 0 bytes .../inline_query_result_game.cpython-311.pyc | Bin 1997 -> 0 bytes .../inline_query_result_gif.cpython-311.pyc | Bin 4304 -> 0 bytes ...line_query_result_location.cpython-311.pyc | Bin 3775 -> 0 bytes ...ine_query_result_mpeg4_gif.cpython-311.pyc | Bin 4328 -> 0 bytes .../inline_query_result_photo.cpython-311.pyc | Bin 4131 -> 0 bytes .../inline_query_result_venue.cpython-311.pyc | Bin 3776 -> 0 bytes .../inline_query_result_video.cpython-311.pyc | Bin 4664 -> 0 bytes .../inline_query_result_voice.cpython-311.pyc | Bin 3703 -> 0 bytes ...nline_query_results_button.cpython-311.pyc | Bin 1803 -> 0 bytes ...ut_contact_message_content.cpython-311.pyc | Bin 1829 -> 0 bytes .../__pycache__/input_file.cpython-311.pyc | Bin 8127 -> 0 bytes ...ut_invoice_message_content.cpython-311.pyc | Bin 3713 -> 0 bytes ...t_location_message_content.cpython-311.pyc | Bin 2060 -> 0 bytes .../__pycache__/input_media.cpython-311.pyc | Bin 1071 -> 0 bytes .../input_media_animation.cpython-311.pyc | Bin 3081 -> 0 bytes .../input_media_audio.cpython-311.pyc | Bin 2711 -> 0 bytes .../input_media_document.cpython-311.pyc | Bin 2565 -> 0 bytes .../input_media_photo.cpython-311.pyc | Bin 2604 -> 0 bytes .../input_media_video.cpython-311.pyc | Bin 3095 -> 0 bytes .../input_message_content.cpython-311.pyc | Bin 1255 -> 0 bytes .../input_paid_media.cpython-311.pyc | Bin 812 -> 0 bytes .../input_paid_media_photo.cpython-311.pyc | Bin 1745 -> 0 bytes .../input_paid_media_video.cpython-311.pyc | Bin 2273 -> 0 bytes .../input_poll_option.cpython-311.pyc | Bin 1935 -> 0 bytes .../__pycache__/input_sticker.cpython-311.pyc | Bin 1951 -> 0 bytes ...input_text_message_content.cpython-311.pyc | Bin 2606 -> 0 bytes ...nput_venue_message_content.cpython-311.pyc | Bin 2143 -> 0 bytes .../types/__pycache__/invoice.cpython-311.pyc | Bin 1584 -> 0 bytes .../keyboard_button.cpython-311.pyc | Bin 3203 -> 0 bytes .../keyboard_button_poll_type.cpython-311.pyc | Bin 1522 -> 0 bytes ...yboard_button_request_chat.cpython-311.pyc | Bin 2870 -> 0 bytes ...yboard_button_request_user.cpython-311.pyc | Bin 1988 -> 0 bytes ...board_button_request_users.cpython-311.pyc | Bin 2405 -> 0 bytes .../__pycache__/labeled_price.cpython-311.pyc | Bin 1427 -> 0 bytes .../link_preview_options.cpython-311.pyc | Bin 2611 -> 0 bytes .../__pycache__/location.cpython-311.pyc | Bin 1829 -> 0 bytes .../__pycache__/login_url.cpython-311.pyc | Bin 2158 -> 0 bytes .../__pycache__/mask_position.cpython-311.pyc | Bin 1548 -> 0 bytes ...maybe_inaccessible_message.cpython-311.pyc | Bin 831 -> 0 bytes .../__pycache__/menu_button.cpython-311.pyc | Bin 2161 -> 0 bytes .../menu_button_commands.cpython-311.pyc | Bin 1562 -> 0 bytes .../menu_button_default.cpython-311.pyc | Bin 1551 -> 0 bytes .../menu_button_web_app.cpython-311.pyc | Bin 1814 -> 0 bytes .../types/__pycache__/message.cpython-311.pyc | Bin 198575 -> 0 bytes ..._auto_delete_timer_changed.cpython-311.pyc | Bin 1472 -> 0 bytes .../message_entity.cpython-311.pyc | Bin 2475 -> 0 bytes .../__pycache__/message_id.cpython-311.pyc | Bin 1325 -> 0 bytes .../message_origin.cpython-311.pyc | Bin 949 -> 0 bytes .../message_origin_channel.cpython-311.pyc | Bin 2032 -> 0 bytes .../message_origin_chat.cpython-311.pyc | Bin 1972 -> 0 bytes ...message_origin_hidden_user.cpython-311.pyc | Bin 1780 -> 0 bytes .../message_origin_user.cpython-311.pyc | Bin 1819 -> 0 bytes ...age_reaction_count_updated.cpython-311.pyc | Bin 1851 -> 0 bytes .../message_reaction_updated.cpython-311.pyc | Bin 2442 -> 0 bytes .../__pycache__/order_info.cpython-311.pyc | Bin 1747 -> 0 bytes .../__pycache__/paid_media.cpython-311.pyc | Bin 825 -> 0 bytes .../paid_media_info.cpython-311.pyc | Bin 1740 -> 0 bytes .../paid_media_photo.cpython-311.pyc | Bin 1690 -> 0 bytes .../paid_media_preview.cpython-311.pyc | Bin 1827 -> 0 bytes .../paid_media_video.cpython-311.pyc | Bin 1643 -> 0 bytes .../__pycache__/passport_data.cpython-311.pyc | Bin 1657 -> 0 bytes .../passport_element_error.cpython-311.pyc | Bin 1677 -> 0 bytes ...t_element_error_data_field.cpython-311.pyc | Bin 1999 -> 0 bytes ...assport_element_error_file.cpython-311.pyc | Bin 1885 -> 0 bytes ...ssport_element_error_files.cpython-311.pyc | Bin 1941 -> 0 bytes ...t_element_error_front_side.cpython-311.pyc | Bin 1948 -> 0 bytes ...element_error_reverse_side.cpython-311.pyc | Bin 1959 -> 0 bytes ...sport_element_error_selfie.cpython-311.pyc | Bin 1904 -> 0 bytes ...ent_error_translation_file.cpython-311.pyc | Bin 2000 -> 0 bytes ...nt_error_translation_files.cpython-311.pyc | Bin 2050 -> 0 bytes ..._element_error_unspecified.cpython-311.pyc | Bin 1922 -> 0 bytes .../__pycache__/passport_file.cpython-311.pyc | Bin 1699 -> 0 bytes .../__pycache__/photo_size.cpython-311.pyc | Bin 1761 -> 0 bytes .../types/__pycache__/poll.cpython-311.pyc | Bin 2694 -> 0 bytes .../__pycache__/poll_answer.cpython-311.pyc | Bin 1793 -> 0 bytes .../__pycache__/poll_option.cpython-311.pyc | Bin 1679 -> 0 bytes .../pre_checkout_query.cpython-311.pyc | Bin 4106 -> 0 bytes .../proximity_alert_triggered.cpython-311.pyc | Bin 1657 -> 0 bytes .../reaction_count.cpython-311.pyc | Bin 1789 -> 0 bytes .../__pycache__/reaction_type.cpython-311.pyc | Bin 871 -> 0 bytes ...reaction_type_custom_emoji.cpython-311.pyc | Bin 1660 -> 0 bytes .../reaction_type_emoji.cpython-311.pyc | Bin 1605 -> 0 bytes .../reaction_type_paid.cpython-311.pyc | Bin 1418 -> 0 bytes .../refunded_payment.cpython-311.pyc | Bin 1829 -> 0 bytes .../reply_keyboard_markup.cpython-311.pyc | Bin 2332 -> 0 bytes .../reply_keyboard_remove.cpython-311.pyc | Bin 2031 -> 0 bytes .../reply_parameters.cpython-311.pyc | Bin 2474 -> 0 bytes .../response_parameters.cpython-311.pyc | Bin 1529 -> 0 bytes .../revenue_withdrawal_state.cpython-311.pyc | Bin 1056 -> 0 bytes ...ue_withdrawal_state_failed.cpython-311.pyc | Bin 1651 -> 0 bytes ...e_withdrawal_state_pending.cpython-311.pyc | Bin 1633 -> 0 bytes ...withdrawal_state_succeeded.cpython-311.pyc | Bin 1843 -> 0 bytes .../sent_web_app_message.cpython-311.pyc | Bin 1521 -> 0 bytes .../__pycache__/shared_user.cpython-311.pyc | Bin 1972 -> 0 bytes .../shipping_address.cpython-311.pyc | Bin 1655 -> 0 bytes .../shipping_option.cpython-311.pyc | Bin 1571 -> 0 bytes .../shipping_query.cpython-311.pyc | Bin 3846 -> 0 bytes .../star_transaction.cpython-311.pyc | Bin 2305 -> 0 bytes .../star_transactions.cpython-311.pyc | Bin 1483 -> 0 bytes .../types/__pycache__/sticker.cpython-311.pyc | Bin 4754 -> 0 bytes .../__pycache__/sticker_set.cpython-311.pyc | Bin 2197 -> 0 bytes .../types/__pycache__/story.cpython-311.pyc | Bin 1398 -> 0 bytes .../successful_payment.cpython-311.pyc | Bin 2016 -> 0 bytes ...h_inline_query_chosen_chat.cpython-311.pyc | Bin 2062 -> 0 bytes .../__pycache__/text_quote.cpython-311.pyc | Bin 1810 -> 0 bytes .../transaction_partner.cpython-311.pyc | Bin 1060 -> 0 bytes ...ansaction_partner_fragment.cpython-311.pyc | Bin 2235 -> 0 bytes .../transaction_partner_other.cpython-311.pyc | Bin 1610 -> 0 bytes ...ction_partner_telegram_ads.cpython-311.pyc | Bin 1658 -> 0 bytes .../transaction_partner_user.cpython-311.pyc | Bin 2280 -> 0 bytes .../types/__pycache__/update.cpython-311.pyc | Bin 7746 -> 0 bytes .../types/__pycache__/user.cpython-311.pyc | Bin 5032 -> 0 bytes .../user_chat_boosts.cpython-311.pyc | Bin 1470 -> 0 bytes .../user_profile_photos.cpython-311.pyc | Bin 1545 -> 0 bytes .../__pycache__/user_shared.cpython-311.pyc | Bin 1572 -> 0 bytes .../__pycache__/users_shared.cpython-311.pyc | Bin 1936 -> 0 bytes .../types/__pycache__/venue.cpython-311.pyc | Bin 1908 -> 0 bytes .../types/__pycache__/video.cpython-311.pyc | Bin 2056 -> 0 bytes .../video_chat_ended.cpython-311.pyc | Bin 1376 -> 0 bytes ..._chat_participants_invited.cpython-311.pyc | Bin 1516 -> 0 bytes .../video_chat_scheduled.cpython-311.pyc | Bin 1460 -> 0 bytes .../video_chat_started.cpython-311.pyc | Bin 771 -> 0 bytes .../__pycache__/video_note.cpython-311.pyc | Bin 1993 -> 0 bytes .../types/__pycache__/voice.cpython-311.pyc | Bin 1672 -> 0 bytes .../__pycache__/web_app_data.cpython-311.pyc | Bin 1434 -> 0 bytes .../__pycache__/web_app_info.cpython-311.pyc | Bin 1315 -> 0 bytes .../__pycache__/webhook_info.cpython-311.pyc | Bin 2255 -> 0 bytes .../write_access_allowed.cpython-311.pyc | Bin 1945 -> 0 bytes .../site-packages/aiogram/types/animation.py | 70 - env/Lib/site-packages/aiogram/types/audio.py | 70 - .../aiogram/types/background_fill.py | 13 - .../background_fill_freeform_gradient.py | 33 - .../aiogram/types/background_fill_gradient.py | 45 - .../aiogram/types/background_fill_solid.py | 33 - .../aiogram/types/background_type.py | 14 - .../types/background_type_chat_theme.py | 33 - .../aiogram/types/background_type_fill.py | 47 - .../aiogram/types/background_type_pattern.py | 63 - .../types/background_type_wallpaper.py | 54 - env/Lib/site-packages/aiogram/types/base.py | 51 - .../site-packages/aiogram/types/birthdate.py | 38 - .../aiogram/types/bot_command.py | 31 - .../aiogram/types/bot_command_scope.py | 19 - ...t_command_scope_all_chat_administrators.py | 37 - .../bot_command_scope_all_group_chats.py | 35 - .../bot_command_scope_all_private_chats.py | 35 - .../aiogram/types/bot_command_scope_chat.py | 36 - .../bot_command_scope_chat_administrators.py | 40 - .../types/bot_command_scope_chat_member.py | 39 - .../types/bot_command_scope_default.py | 33 - .../aiogram/types/bot_description.py | 25 - .../site-packages/aiogram/types/bot_name.py | 25 - .../aiogram/types/bot_short_description.py | 27 - .../aiogram/types/business_connection.py | 59 - .../aiogram/types/business_intro.py | 41 - .../aiogram/types/business_location.py | 38 - .../types/business_messages_deleted.py | 46 - .../aiogram/types/business_opening_hours.py | 40 - .../types/business_opening_hours_interval.py | 37 - .../aiogram/types/callback_game.py | 11 - .../aiogram/types/callback_query.py | 109 - env/Lib/site-packages/aiogram/types/chat.py | 1320 ----- .../types/chat_administrator_rights.py | 94 - .../aiogram/types/chat_background.py | 44 - .../site-packages/aiogram/types/chat_boost.py | 55 - .../aiogram/types/chat_boost_added.py | 25 - .../aiogram/types/chat_boost_removed.py | 56 - .../aiogram/types/chat_boost_source.py | 13 - .../types/chat_boost_source_gift_code.py | 39 - .../types/chat_boost_source_giveaway.py | 51 - .../types/chat_boost_source_premium.py | 39 - .../aiogram/types/chat_boost_updated.py | 35 - .../aiogram/types/chat_full_info.py | 225 - .../aiogram/types/chat_invite_link.py | 71 - .../aiogram/types/chat_join_request.py | 2702 ---------- .../aiogram/types/chat_location.py | 34 - .../aiogram/types/chat_member.py | 18 - .../types/chat_member_administrator.py | 111 - .../aiogram/types/chat_member_banned.py | 43 - .../aiogram/types/chat_member_left.py | 39 - .../aiogram/types/chat_member_member.py | 43 - .../aiogram/types/chat_member_owner.py | 51 - .../aiogram/types/chat_member_restricted.py | 108 - .../aiogram/types/chat_member_updated.py | 1413 ----- .../aiogram/types/chat_permissions.py | 87 - .../site-packages/aiogram/types/chat_photo.py | 47 - .../aiogram/types/chat_shared.py | 54 - .../aiogram/types/chosen_inline_result.py | 58 - .../site-packages/aiogram/types/contact.py | 51 - env/Lib/site-packages/aiogram/types/custom.py | 30 - env/Lib/site-packages/aiogram/types/dice.py | 40 - .../site-packages/aiogram/types/document.py | 58 - .../aiogram/types/downloadable.py | 5 - .../aiogram/types/encrypted_credentials.py | 33 - .../types/encrypted_passport_element.py | 74 - .../aiogram/types/error_event.py | 28 - .../aiogram/types/external_reply_info.py | 158 - env/Lib/site-packages/aiogram/types/file.py | 49 - .../aiogram/types/force_reply.py | 50 - .../aiogram/types/forum_topic.py | 47 - .../aiogram/types/forum_topic_closed.py | 11 - .../aiogram/types/forum_topic_created.py | 43 - .../aiogram/types/forum_topic_edited.py | 35 - .../aiogram/types/forum_topic_reopened.py | 11 - env/Lib/site-packages/aiogram/types/game.py | 60 - .../aiogram/types/game_high_score.py | 39 - .../types/general_forum_topic_hidden.py | 9 - .../types/general_forum_topic_unhidden.py | 9 - .../site-packages/aiogram/types/giveaway.py | 67 - .../aiogram/types/giveaway_completed.py | 46 - .../aiogram/types/giveaway_created.py | 9 - .../aiogram/types/giveaway_winners.py | 80 - .../aiogram/types/inaccessible_message.py | 41 - .../aiogram/types/inline_keyboard_button.py | 77 - .../aiogram/types/inline_keyboard_markup.py | 35 - .../aiogram/types/inline_query.py | 155 - .../aiogram/types/inline_query_result.py | 34 - .../types/inline_query_result_article.py | 96 - .../types/inline_query_result_audio.py | 102 - .../types/inline_query_result_cached_audio.py | 90 - .../inline_query_result_cached_document.py | 98 - .../types/inline_query_result_cached_gif.py | 100 - .../inline_query_result_cached_mpeg4_gif.py | 100 - .../types/inline_query_result_cached_photo.py | 104 - .../inline_query_result_cached_sticker.py | 76 - .../types/inline_query_result_cached_video.py | 104 - .../types/inline_query_result_cached_voice.py | 94 - .../types/inline_query_result_contact.py | 100 - .../types/inline_query_result_document.py | 114 - .../aiogram/types/inline_query_result_game.py | 51 - .../aiogram/types/inline_query_result_gif.py | 121 - .../types/inline_query_result_location.py | 112 - .../types/inline_query_result_mpeg4_gif.py | 120 - .../types/inline_query_result_photo.py | 116 - .../types/inline_query_result_venue.py | 116 - .../types/inline_query_result_video.py | 126 - .../types/inline_query_result_voice.py | 98 - .../types/inline_query_results_button.py | 43 - .../types/input_contact_message_content.py | 47 - .../site-packages/aiogram/types/input_file.py | 149 - .../types/input_invoice_message_content.py | 114 - .../types/input_location_message_content.py | 55 - .../aiogram/types/input_media.py | 17 - .../aiogram/types/input_media_animation.py | 83 - .../aiogram/types/input_media_audio.py | 73 - .../aiogram/types/input_media_document.py | 65 - .../aiogram/types/input_media_photo.py | 67 - .../aiogram/types/input_media_video.py | 87 - .../aiogram/types/input_message_content.py | 17 - .../aiogram/types/input_paid_media.py | 12 - .../aiogram/types/input_paid_media_photo.py | 37 - .../aiogram/types/input_paid_media_video.py | 61 - .../aiogram/types/input_poll_option.py | 47 - .../aiogram/types/input_sticker.py | 55 - .../types/input_text_message_content.py | 65 - .../types/input_venue_message_content.py | 63 - .../site-packages/aiogram/types/invoice.py | 51 - .../aiogram/types/keyboard_button.py | 78 - .../types/keyboard_button_poll_type.py | 29 - .../types/keyboard_button_request_chat.py | 78 - .../types/keyboard_button_request_user.py | 44 - .../types/keyboard_button_request_users.py | 57 - .../aiogram/types/labeled_price.py | 31 - .../aiogram/types/link_preview_options.py | 56 - .../site-packages/aiogram/types/location.py | 55 - .../site-packages/aiogram/types/login_url.py | 50 - .../aiogram/types/mask_position.py | 43 - .../types/maybe_inaccessible_message.py | 12 - .../aiogram/types/menu_button.py | 47 - .../aiogram/types/menu_button_commands.py | 33 - .../aiogram/types/menu_button_default.py | 33 - .../aiogram/types/menu_button_web_app.py | 42 - .../site-packages/aiogram/types/message.py | 4229 --------------- .../message_auto_delete_timer_changed.py | 31 - .../aiogram/types/message_entity.py | 68 - .../site-packages/aiogram/types/message_id.py | 27 - .../aiogram/types/message_origin.py | 14 - .../aiogram/types/message_origin_channel.py | 56 - .../aiogram/types/message_origin_chat.py | 52 - .../types/message_origin_hidden_user.py | 40 - .../aiogram/types/message_origin_user.py | 43 - .../types/message_reaction_count_updated.py | 52 - .../aiogram/types/message_reaction_updated.py | 71 - .../site-packages/aiogram/types/order_info.py | 50 - .../site-packages/aiogram/types/paid_media.py | 13 - .../aiogram/types/paid_media_info.py | 40 - .../aiogram/types/paid_media_photo.py | 39 - .../aiogram/types/paid_media_preview.py | 44 - .../aiogram/types/paid_media_video.py | 39 - .../aiogram/types/passport_data.py | 39 - .../aiogram/types/passport_element_error.py | 21 - .../passport_element_error_data_field.py | 52 - .../types/passport_element_error_file.py | 44 - .../types/passport_element_error_files.py | 48 - .../passport_element_error_front_side.py | 46 - .../passport_element_error_reverse_side.py | 46 - .../types/passport_element_error_selfie.py | 44 - ...passport_element_error_translation_file.py | 48 - ...assport_element_error_translation_files.py | 52 - .../passport_element_error_unspecified.py | 50 - .../aiogram/types/passport_file.py | 48 - .../site-packages/aiogram/types/photo_size.py | 51 - env/Lib/site-packages/aiogram/types/poll.py | 92 - .../aiogram/types/poll_answer.py | 51 - .../aiogram/types/poll_option.py | 46 - .../aiogram/types/pre_checkout_query.py | 98 - .../types/proximity_alert_triggered.py | 43 - .../aiogram/types/reaction_count.py | 40 - .../aiogram/types/reaction_type.py | 13 - .../types/reaction_type_custom_emoji.py | 34 - .../aiogram/types/reaction_type_emoji.py | 34 - .../aiogram/types/reaction_type_paid.py | 28 - .../aiogram/types/refunded_payment.py | 49 - .../aiogram/types/reply_keyboard_markup.py | 58 - .../aiogram/types/reply_keyboard_remove.py | 37 - .../aiogram/types/reply_parameters.py | 67 - .../aiogram/types/response_parameters.py | 37 - .../aiogram/types/revenue_withdrawal_state.py | 15 - .../types/revenue_withdrawal_state_failed.py | 33 - .../types/revenue_withdrawal_state_pending.py | 33 - .../revenue_withdrawal_state_succeeded.py | 42 - .../aiogram/types/sent_web_app_message.py | 32 - .../aiogram/types/shared_user.py | 54 - .../aiogram/types/shipping_address.py | 55 - .../aiogram/types/shipping_option.py | 41 - .../aiogram/types/shipping_query.py | 90 - .../aiogram/types/star_transaction.py | 86 - .../aiogram/types/star_transactions.py | 32 - .../site-packages/aiogram/types/sticker.py | 152 - .../aiogram/types/sticker_set.py | 71 - env/Lib/site-packages/aiogram/types/story.py | 32 - .../aiogram/types/successful_payment.py | 62 - .../types/switch_inline_query_chosen_chat.py | 49 - .../site-packages/aiogram/types/text_quote.py | 50 - .../aiogram/types/transaction_partner.py | 14 - .../types/transaction_partner_fragment.py | 53 - .../types/transaction_partner_other.py | 33 - .../types/transaction_partner_telegram_ads.py | 35 - .../aiogram/types/transaction_partner_user.py | 56 - env/Lib/site-packages/aiogram/types/update.py | 211 - env/Lib/site-packages/aiogram/types/user.py | 140 - .../aiogram/types/user_chat_boosts.py | 32 - .../aiogram/types/user_profile_photos.py | 38 - .../aiogram/types/user_shared.py | 32 - .../aiogram/types/users_shared.py | 48 - env/Lib/site-packages/aiogram/types/venue.py | 62 - env/Lib/site-packages/aiogram/types/video.py | 70 - .../aiogram/types/video_chat_ended.py | 27 - .../types/video_chat_participants_invited.py | 30 - .../aiogram/types/video_chat_scheduled.py | 30 - .../aiogram/types/video_chat_started.py | 11 - .../site-packages/aiogram/types/video_note.py | 58 - env/Lib/site-packages/aiogram/types/voice.py | 51 - .../aiogram/types/web_app_data.py | 31 - .../aiogram/types/web_app_info.py | 27 - .../aiogram/types/webhook_info.py | 68 - .../aiogram/types/write_access_allowed.py | 41 - .../site-packages/aiogram/utils/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 183 -> 0 bytes .../__pycache__/auth_widget.cpython-311.pyc | Bin 2088 -> 0 bytes .../utils/__pycache__/backoff.cpython-311.pyc | Bin 5160 -> 0 bytes .../callback_answer.cpython-311.pyc | Bin 10428 -> 0 bytes .../__pycache__/chat_action.cpython-311.pyc | Bin 15456 -> 0 bytes .../__pycache__/chat_member.cpython-311.pyc | Bin 1338 -> 0 bytes .../__pycache__/deep_linking.cpython-311.pyc | Bin 3814 -> 0 bytes .../__pycache__/formatting.cpython-311.pyc | Bin 29125 -> 0 bytes .../__pycache__/keyboard.cpython-311.pyc | Bin 19088 -> 0 bytes .../utils/__pycache__/link.cpython-311.pyc | Bin 3649 -> 0 bytes .../__pycache__/magic_filter.cpython-311.pyc | Bin 1836 -> 0 bytes .../__pycache__/markdown.cpython-311.pyc | Bin 8145 -> 0 bytes .../__pycache__/media_group.cpython-311.pyc | Bin 17076 -> 0 bytes .../utils/__pycache__/mixins.cpython-311.pyc | Bin 5547 -> 0 bytes .../__pycache__/mypy_hacks.cpython-311.pyc | Bin 1076 -> 0 bytes .../utils/__pycache__/payload.cpython-311.pyc | Bin 4025 -> 0 bytes .../__pycache__/serialization.cpython-311.pyc | Bin 3892 -> 0 bytes .../text_decorations.cpython-311.pyc | Bin 15536 -> 0 bytes .../utils/__pycache__/token.cpython-311.pyc | Bin 2187 -> 0 bytes .../__pycache__/warnings.cpython-311.pyc | Bin 603 -> 0 bytes .../utils/__pycache__/web_app.cpython-311.pyc | Bin 6981 -> 0 bytes .../aiogram/utils/auth_widget.py | 34 - .../site-packages/aiogram/utils/backoff.py | 83 - .../aiogram/utils/callback_answer.py | 211 - .../aiogram/utils/chat_action.py | 379 -- .../aiogram/utils/chat_member.py | 37 - .../aiogram/utils/deep_linking.py | 112 - .../site-packages/aiogram/utils/formatting.py | 632 --- .../aiogram/utils/i18n/__init__.py | 21 - .../i18n/__pycache__/__init__.cpython-311.pyc | Bin 665 -> 0 bytes .../i18n/__pycache__/context.cpython-311.pyc | Bin 1287 -> 0 bytes .../i18n/__pycache__/core.cpython-311.pyc | Bin 6572 -> 0 bytes .../__pycache__/lazy_proxy.cpython-311.pyc | Bin 1058 -> 0 bytes .../__pycache__/middleware.cpython-311.pyc | Bin 10034 -> 0 bytes .../aiogram/utils/i18n/context.py | 23 - .../site-packages/aiogram/utils/i18n/core.py | 123 - .../aiogram/utils/i18n/lazy_proxy.py | 13 - .../aiogram/utils/i18n/middleware.py | 187 - .../site-packages/aiogram/utils/keyboard.py | 421 -- env/Lib/site-packages/aiogram/utils/link.py | 74 - .../aiogram/utils/magic_filter.py | 22 - .../site-packages/aiogram/utils/markdown.py | 209 - .../aiogram/utils/media_group.py | 368 -- env/Lib/site-packages/aiogram/utils/mixins.py | 95 - .../site-packages/aiogram/utils/mypy_hacks.py | 16 - .../site-packages/aiogram/utils/payload.py | 109 - .../aiogram/utils/serialization.py | 89 - .../aiogram/utils/text_decorations.py | 274 - env/Lib/site-packages/aiogram/utils/token.py | 42 - .../site-packages/aiogram/utils/warnings.py | 6 - .../site-packages/aiogram/utils/web_app.py | 183 - .../site-packages/aiogram/webhook/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 185 -> 0 bytes .../aiohttp_server.cpython-311.pyc | Bin 17416 -> 0 bytes .../__pycache__/security.cpython-311.pyc | Bin 3210 -> 0 bytes .../aiogram/webhook/aiohttp_server.py | 295 - .../site-packages/aiogram/webhook/security.py | 41 - project/bot.py | 56 +- test.py | 2 + 963 files changed, 57 insertions(+), 46510 deletions(-) delete mode 100644 env/Lib/site-packages/aiogram-3.12.0.dist-info/INSTALLER delete mode 100644 env/Lib/site-packages/aiogram-3.12.0.dist-info/METADATA delete mode 100644 env/Lib/site-packages/aiogram-3.12.0.dist-info/RECORD delete mode 100644 env/Lib/site-packages/aiogram-3.12.0.dist-info/REQUESTED delete mode 100644 env/Lib/site-packages/aiogram-3.12.0.dist-info/WHEEL delete mode 100644 env/Lib/site-packages/aiogram-3.12.0.dist-info/licenses/LICENSE delete mode 100644 env/Lib/site-packages/aiogram/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/__meta__.py delete mode 100644 env/Lib/site-packages/aiogram/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/__pycache__/__meta__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/__pycache__/exceptions.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/__pycache__/loggers.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/client/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/client/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/client/__pycache__/bot.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/client/__pycache__/context_controller.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/client/__pycache__/default.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/client/__pycache__/telegram.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/client/bot.py delete mode 100644 env/Lib/site-packages/aiogram/client/context_controller.py delete mode 100644 env/Lib/site-packages/aiogram/client/default.py delete mode 100644 env/Lib/site-packages/aiogram/client/session/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/client/session/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/client/session/__pycache__/aiohttp.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/client/session/__pycache__/base.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/client/session/aiohttp.py delete mode 100644 env/Lib/site-packages/aiogram/client/session/base.py delete mode 100644 env/Lib/site-packages/aiogram/client/session/middlewares/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/client/session/middlewares/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/client/session/middlewares/__pycache__/base.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/client/session/middlewares/__pycache__/manager.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/client/session/middlewares/__pycache__/request_logging.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/client/session/middlewares/base.py delete mode 100644 env/Lib/site-packages/aiogram/client/session/middlewares/manager.py delete mode 100644 env/Lib/site-packages/aiogram/client/session/middlewares/request_logging.py delete mode 100644 env/Lib/site-packages/aiogram/client/telegram.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/__pycache__/dispatcher.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/__pycache__/flags.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/__pycache__/router.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/dispatcher.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/event/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/event/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/event/__pycache__/bases.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/event/__pycache__/event.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/event/__pycache__/handler.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/event/__pycache__/telegram.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/event/bases.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/event/event.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/event/handler.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/event/telegram.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/flags.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/middlewares/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/middlewares/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/middlewares/__pycache__/base.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/middlewares/__pycache__/error.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/middlewares/__pycache__/manager.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/middlewares/__pycache__/user_context.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/middlewares/base.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/middlewares/error.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/middlewares/manager.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/middlewares/user_context.py delete mode 100644 env/Lib/site-packages/aiogram/dispatcher/router.py delete mode 100644 env/Lib/site-packages/aiogram/enums/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/bot_command_scope_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/chat_action.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/chat_boost_source_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/chat_member_status.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/chat_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/content_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/currency.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/dice_emoji.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/encrypted_passport_element.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/inline_query_result_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/input_media_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/input_paid_media_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/keyboard_button_poll_type_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/mask_position_point.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/menu_button_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/message_entity_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/message_origin_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/paid_media_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/parse_mode.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/passport_element_error_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/poll_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/reaction_type_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/revenue_withdrawal_state_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/sticker_format.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/sticker_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/topic_icon_color.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/transaction_partner_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/__pycache__/update_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/enums/bot_command_scope_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/chat_action.py delete mode 100644 env/Lib/site-packages/aiogram/enums/chat_boost_source_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/chat_member_status.py delete mode 100644 env/Lib/site-packages/aiogram/enums/chat_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/content_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/currency.py delete mode 100644 env/Lib/site-packages/aiogram/enums/dice_emoji.py delete mode 100644 env/Lib/site-packages/aiogram/enums/encrypted_passport_element.py delete mode 100644 env/Lib/site-packages/aiogram/enums/inline_query_result_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/input_media_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/input_paid_media_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/keyboard_button_poll_type_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/mask_position_point.py delete mode 100644 env/Lib/site-packages/aiogram/enums/menu_button_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/message_entity_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/message_origin_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/paid_media_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/parse_mode.py delete mode 100644 env/Lib/site-packages/aiogram/enums/passport_element_error_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/poll_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/reaction_type_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/revenue_withdrawal_state_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/sticker_format.py delete mode 100644 env/Lib/site-packages/aiogram/enums/sticker_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/topic_icon_color.py delete mode 100644 env/Lib/site-packages/aiogram/enums/transaction_partner_type.py delete mode 100644 env/Lib/site-packages/aiogram/enums/update_type.py delete mode 100644 env/Lib/site-packages/aiogram/exceptions.py delete mode 100644 env/Lib/site-packages/aiogram/filters/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/filters/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/filters/__pycache__/base.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/filters/__pycache__/callback_data.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/filters/__pycache__/chat_member_updated.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/filters/__pycache__/command.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/filters/__pycache__/exception.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/filters/__pycache__/logic.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/filters/__pycache__/magic_data.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/filters/__pycache__/state.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/filters/base.py delete mode 100644 env/Lib/site-packages/aiogram/filters/callback_data.py delete mode 100644 env/Lib/site-packages/aiogram/filters/chat_member_updated.py delete mode 100644 env/Lib/site-packages/aiogram/filters/command.py delete mode 100644 env/Lib/site-packages/aiogram/filters/exception.py delete mode 100644 env/Lib/site-packages/aiogram/filters/logic.py delete mode 100644 env/Lib/site-packages/aiogram/filters/magic_data.py delete mode 100644 env/Lib/site-packages/aiogram/filters/state.py delete mode 100644 env/Lib/site-packages/aiogram/fsm/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/fsm/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/fsm/__pycache__/context.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/fsm/__pycache__/middleware.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/fsm/__pycache__/scene.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/fsm/__pycache__/state.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/fsm/__pycache__/strategy.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/fsm/context.py delete mode 100644 env/Lib/site-packages/aiogram/fsm/middleware.py delete mode 100644 env/Lib/site-packages/aiogram/fsm/scene.py delete mode 100644 env/Lib/site-packages/aiogram/fsm/state.py delete mode 100644 env/Lib/site-packages/aiogram/fsm/storage/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/fsm/storage/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/fsm/storage/__pycache__/base.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/fsm/storage/__pycache__/memory.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/fsm/storage/__pycache__/mongo.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/fsm/storage/__pycache__/redis.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/fsm/storage/base.py delete mode 100644 env/Lib/site-packages/aiogram/fsm/storage/memory.py delete mode 100644 env/Lib/site-packages/aiogram/fsm/storage/mongo.py delete mode 100644 env/Lib/site-packages/aiogram/fsm/storage/redis.py delete mode 100644 env/Lib/site-packages/aiogram/fsm/strategy.py delete mode 100644 env/Lib/site-packages/aiogram/handlers/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/handlers/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/handlers/__pycache__/base.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/handlers/__pycache__/callback_query.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/handlers/__pycache__/chat_member.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/handlers/__pycache__/chosen_inline_result.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/handlers/__pycache__/error.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/handlers/__pycache__/inline_query.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/handlers/__pycache__/message.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/handlers/__pycache__/poll.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/handlers/__pycache__/pre_checkout_query.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/handlers/__pycache__/shipping_query.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/handlers/base.py delete mode 100644 env/Lib/site-packages/aiogram/handlers/callback_query.py delete mode 100644 env/Lib/site-packages/aiogram/handlers/chat_member.py delete mode 100644 env/Lib/site-packages/aiogram/handlers/chosen_inline_result.py delete mode 100644 env/Lib/site-packages/aiogram/handlers/error.py delete mode 100644 env/Lib/site-packages/aiogram/handlers/inline_query.py delete mode 100644 env/Lib/site-packages/aiogram/handlers/message.py delete mode 100644 env/Lib/site-packages/aiogram/handlers/poll.py delete mode 100644 env/Lib/site-packages/aiogram/handlers/pre_checkout_query.py delete mode 100644 env/Lib/site-packages/aiogram/handlers/shipping_query.py delete mode 100644 env/Lib/site-packages/aiogram/loggers.py delete mode 100644 env/Lib/site-packages/aiogram/methods/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/add_sticker_to_set.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/answer_callback_query.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/answer_inline_query.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/answer_pre_checkout_query.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/answer_shipping_query.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/answer_web_app_query.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/approve_chat_join_request.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/ban_chat_member.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/ban_chat_sender_chat.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/base.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/close.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/close_forum_topic.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/close_general_forum_topic.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/copy_message.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/copy_messages.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/create_chat_invite_link.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/create_chat_subscription_invite_link.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/create_forum_topic.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/create_invoice_link.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/create_new_sticker_set.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/decline_chat_join_request.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/delete_chat_photo.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/delete_chat_sticker_set.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/delete_forum_topic.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/delete_message.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/delete_messages.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/delete_my_commands.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/delete_sticker_from_set.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/delete_sticker_set.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/delete_webhook.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/edit_chat_invite_link.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/edit_chat_subscription_invite_link.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/edit_forum_topic.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/edit_general_forum_topic.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/edit_message_caption.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/edit_message_live_location.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/edit_message_media.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/edit_message_reply_markup.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/edit_message_text.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/export_chat_invite_link.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/forward_message.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/forward_messages.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_business_connection.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_chat.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_chat_administrators.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_chat_member.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_chat_member_count.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_chat_menu_button.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_custom_emoji_stickers.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_file.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_forum_topic_icon_stickers.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_game_high_scores.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_me.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_my_commands.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_my_default_administrator_rights.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_my_description.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_my_name.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_my_short_description.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_star_transactions.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_sticker_set.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_updates.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_user_chat_boosts.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_user_profile_photos.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/get_webhook_info.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/hide_general_forum_topic.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/leave_chat.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/log_out.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/pin_chat_message.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/promote_chat_member.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/refund_star_payment.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/reopen_forum_topic.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/reopen_general_forum_topic.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/replace_sticker_in_set.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/restrict_chat_member.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/revoke_chat_invite_link.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_animation.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_audio.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_chat_action.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_contact.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_dice.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_document.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_game.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_invoice.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_location.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_media_group.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_message.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_paid_media.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_photo.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_poll.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_sticker.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_venue.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_video.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_video_note.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/send_voice.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_administrator_custom_title.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_description.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_menu_button.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_permissions.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_photo.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_sticker_set.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_title.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_custom_emoji_sticker_set_thumbnail.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_game_score.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_message_reaction.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_my_commands.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_my_default_administrator_rights.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_my_description.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_my_name.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_my_short_description.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_passport_data_errors.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_sticker_emoji_list.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_sticker_keywords.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_sticker_mask_position.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_sticker_position_in_set.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_sticker_set_thumbnail.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_sticker_set_title.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/set_webhook.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/stop_message_live_location.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/stop_poll.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/unban_chat_member.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/unban_chat_sender_chat.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/unhide_general_forum_topic.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/unpin_all_chat_messages.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/unpin_all_forum_topic_messages.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/unpin_all_general_forum_topic_messages.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/unpin_chat_message.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/__pycache__/upload_sticker_file.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/methods/add_sticker_to_set.py delete mode 100644 env/Lib/site-packages/aiogram/methods/answer_callback_query.py delete mode 100644 env/Lib/site-packages/aiogram/methods/answer_inline_query.py delete mode 100644 env/Lib/site-packages/aiogram/methods/answer_pre_checkout_query.py delete mode 100644 env/Lib/site-packages/aiogram/methods/answer_shipping_query.py delete mode 100644 env/Lib/site-packages/aiogram/methods/answer_web_app_query.py delete mode 100644 env/Lib/site-packages/aiogram/methods/approve_chat_join_request.py delete mode 100644 env/Lib/site-packages/aiogram/methods/ban_chat_member.py delete mode 100644 env/Lib/site-packages/aiogram/methods/ban_chat_sender_chat.py delete mode 100644 env/Lib/site-packages/aiogram/methods/base.py delete mode 100644 env/Lib/site-packages/aiogram/methods/close.py delete mode 100644 env/Lib/site-packages/aiogram/methods/close_forum_topic.py delete mode 100644 env/Lib/site-packages/aiogram/methods/close_general_forum_topic.py delete mode 100644 env/Lib/site-packages/aiogram/methods/copy_message.py delete mode 100644 env/Lib/site-packages/aiogram/methods/copy_messages.py delete mode 100644 env/Lib/site-packages/aiogram/methods/create_chat_invite_link.py delete mode 100644 env/Lib/site-packages/aiogram/methods/create_chat_subscription_invite_link.py delete mode 100644 env/Lib/site-packages/aiogram/methods/create_forum_topic.py delete mode 100644 env/Lib/site-packages/aiogram/methods/create_invoice_link.py delete mode 100644 env/Lib/site-packages/aiogram/methods/create_new_sticker_set.py delete mode 100644 env/Lib/site-packages/aiogram/methods/decline_chat_join_request.py delete mode 100644 env/Lib/site-packages/aiogram/methods/delete_chat_photo.py delete mode 100644 env/Lib/site-packages/aiogram/methods/delete_chat_sticker_set.py delete mode 100644 env/Lib/site-packages/aiogram/methods/delete_forum_topic.py delete mode 100644 env/Lib/site-packages/aiogram/methods/delete_message.py delete mode 100644 env/Lib/site-packages/aiogram/methods/delete_messages.py delete mode 100644 env/Lib/site-packages/aiogram/methods/delete_my_commands.py delete mode 100644 env/Lib/site-packages/aiogram/methods/delete_sticker_from_set.py delete mode 100644 env/Lib/site-packages/aiogram/methods/delete_sticker_set.py delete mode 100644 env/Lib/site-packages/aiogram/methods/delete_webhook.py delete mode 100644 env/Lib/site-packages/aiogram/methods/edit_chat_invite_link.py delete mode 100644 env/Lib/site-packages/aiogram/methods/edit_chat_subscription_invite_link.py delete mode 100644 env/Lib/site-packages/aiogram/methods/edit_forum_topic.py delete mode 100644 env/Lib/site-packages/aiogram/methods/edit_general_forum_topic.py delete mode 100644 env/Lib/site-packages/aiogram/methods/edit_message_caption.py delete mode 100644 env/Lib/site-packages/aiogram/methods/edit_message_live_location.py delete mode 100644 env/Lib/site-packages/aiogram/methods/edit_message_media.py delete mode 100644 env/Lib/site-packages/aiogram/methods/edit_message_reply_markup.py delete mode 100644 env/Lib/site-packages/aiogram/methods/edit_message_text.py delete mode 100644 env/Lib/site-packages/aiogram/methods/export_chat_invite_link.py delete mode 100644 env/Lib/site-packages/aiogram/methods/forward_message.py delete mode 100644 env/Lib/site-packages/aiogram/methods/forward_messages.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_business_connection.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_chat.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_chat_administrators.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_chat_member.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_chat_member_count.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_chat_menu_button.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_custom_emoji_stickers.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_file.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_forum_topic_icon_stickers.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_game_high_scores.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_me.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_my_commands.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_my_default_administrator_rights.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_my_description.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_my_name.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_my_short_description.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_star_transactions.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_sticker_set.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_updates.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_user_chat_boosts.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_user_profile_photos.py delete mode 100644 env/Lib/site-packages/aiogram/methods/get_webhook_info.py delete mode 100644 env/Lib/site-packages/aiogram/methods/hide_general_forum_topic.py delete mode 100644 env/Lib/site-packages/aiogram/methods/leave_chat.py delete mode 100644 env/Lib/site-packages/aiogram/methods/log_out.py delete mode 100644 env/Lib/site-packages/aiogram/methods/pin_chat_message.py delete mode 100644 env/Lib/site-packages/aiogram/methods/promote_chat_member.py delete mode 100644 env/Lib/site-packages/aiogram/methods/refund_star_payment.py delete mode 100644 env/Lib/site-packages/aiogram/methods/reopen_forum_topic.py delete mode 100644 env/Lib/site-packages/aiogram/methods/reopen_general_forum_topic.py delete mode 100644 env/Lib/site-packages/aiogram/methods/replace_sticker_in_set.py delete mode 100644 env/Lib/site-packages/aiogram/methods/restrict_chat_member.py delete mode 100644 env/Lib/site-packages/aiogram/methods/revoke_chat_invite_link.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_animation.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_audio.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_chat_action.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_contact.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_dice.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_document.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_game.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_invoice.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_location.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_media_group.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_message.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_paid_media.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_photo.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_poll.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_sticker.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_venue.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_video.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_video_note.py delete mode 100644 env/Lib/site-packages/aiogram/methods/send_voice.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_chat_administrator_custom_title.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_chat_description.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_chat_menu_button.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_chat_permissions.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_chat_photo.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_chat_sticker_set.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_chat_title.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_custom_emoji_sticker_set_thumbnail.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_game_score.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_message_reaction.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_my_commands.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_my_default_administrator_rights.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_my_description.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_my_name.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_my_short_description.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_passport_data_errors.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_sticker_emoji_list.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_sticker_keywords.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_sticker_mask_position.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_sticker_position_in_set.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_sticker_set_thumbnail.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_sticker_set_title.py delete mode 100644 env/Lib/site-packages/aiogram/methods/set_webhook.py delete mode 100644 env/Lib/site-packages/aiogram/methods/stop_message_live_location.py delete mode 100644 env/Lib/site-packages/aiogram/methods/stop_poll.py delete mode 100644 env/Lib/site-packages/aiogram/methods/unban_chat_member.py delete mode 100644 env/Lib/site-packages/aiogram/methods/unban_chat_sender_chat.py delete mode 100644 env/Lib/site-packages/aiogram/methods/unhide_general_forum_topic.py delete mode 100644 env/Lib/site-packages/aiogram/methods/unpin_all_chat_messages.py delete mode 100644 env/Lib/site-packages/aiogram/methods/unpin_all_forum_topic_messages.py delete mode 100644 env/Lib/site-packages/aiogram/methods/unpin_all_general_forum_topic_messages.py delete mode 100644 env/Lib/site-packages/aiogram/methods/unpin_chat_message.py delete mode 100644 env/Lib/site-packages/aiogram/methods/upload_sticker_file.py delete mode 100644 env/Lib/site-packages/aiogram/py.typed delete mode 100644 env/Lib/site-packages/aiogram/types/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/animation.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/audio.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/background_fill.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/background_fill_freeform_gradient.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/background_fill_gradient.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/background_fill_solid.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/background_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/background_type_chat_theme.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/background_type_fill.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/background_type_pattern.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/background_type_wallpaper.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/base.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/birthdate.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/bot_command.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_all_chat_administrators.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_all_group_chats.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_all_private_chats.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_chat.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_chat_administrators.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_chat_member.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_default.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/bot_description.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/bot_name.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/bot_short_description.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/business_connection.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/business_intro.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/business_location.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/business_messages_deleted.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/business_opening_hours.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/business_opening_hours_interval.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/callback_game.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/callback_query.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_administrator_rights.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_background.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_boost.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_added.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_removed.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_source.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_source_gift_code.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_source_giveaway.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_source_premium.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_updated.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_full_info.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_invite_link.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_join_request.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_location.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_member.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_member_administrator.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_member_banned.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_member_left.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_member_member.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_member_owner.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_member_restricted.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_member_updated.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_permissions.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_photo.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chat_shared.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/chosen_inline_result.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/contact.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/custom.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/dice.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/document.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/downloadable.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/encrypted_credentials.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/encrypted_passport_element.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/error_event.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/external_reply_info.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/file.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/force_reply.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/forum_topic.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/forum_topic_closed.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/forum_topic_created.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/forum_topic_edited.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/forum_topic_reopened.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/game.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/game_high_score.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/general_forum_topic_hidden.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/general_forum_topic_unhidden.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/giveaway.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/giveaway_completed.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/giveaway_created.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/giveaway_winners.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inaccessible_message.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_keyboard_button.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_keyboard_markup.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_article.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_audio.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_audio.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_document.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_gif.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_mpeg4_gif.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_photo.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_sticker.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_video.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_voice.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_contact.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_document.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_game.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_gif.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_location.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_mpeg4_gif.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_photo.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_venue.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_video.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_voice.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/inline_query_results_button.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_contact_message_content.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_file.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_invoice_message_content.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_location_message_content.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_media.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_media_animation.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_media_audio.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_media_document.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_media_photo.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_media_video.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_message_content.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_paid_media.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_paid_media_photo.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_paid_media_video.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_poll_option.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_sticker.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_text_message_content.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/input_venue_message_content.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/invoice.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/keyboard_button.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/keyboard_button_poll_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/keyboard_button_request_chat.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/keyboard_button_request_user.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/keyboard_button_request_users.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/labeled_price.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/link_preview_options.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/location.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/login_url.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/mask_position.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/maybe_inaccessible_message.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/menu_button.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/menu_button_commands.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/menu_button_default.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/menu_button_web_app.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/message.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/message_auto_delete_timer_changed.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/message_entity.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/message_id.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/message_origin.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/message_origin_channel.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/message_origin_chat.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/message_origin_hidden_user.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/message_origin_user.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/message_reaction_count_updated.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/message_reaction_updated.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/order_info.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/paid_media.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/paid_media_info.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/paid_media_photo.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/paid_media_preview.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/paid_media_video.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/passport_data.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_data_field.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_file.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_files.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_front_side.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_reverse_side.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_selfie.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_translation_file.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_translation_files.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_unspecified.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/passport_file.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/photo_size.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/poll.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/poll_answer.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/poll_option.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/pre_checkout_query.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/proximity_alert_triggered.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/reaction_count.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/reaction_type.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/reaction_type_custom_emoji.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/reaction_type_emoji.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/reaction_type_paid.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/refunded_payment.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/reply_keyboard_markup.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/reply_keyboard_remove.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/reply_parameters.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/response_parameters.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/revenue_withdrawal_state.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/revenue_withdrawal_state_failed.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/revenue_withdrawal_state_pending.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/revenue_withdrawal_state_succeeded.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/sent_web_app_message.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/shared_user.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/shipping_address.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/shipping_option.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/shipping_query.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/star_transaction.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/star_transactions.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/sticker.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/sticker_set.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/story.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/successful_payment.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/switch_inline_query_chosen_chat.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/text_quote.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner_fragment.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner_other.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner_telegram_ads.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner_user.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/update.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/user.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/user_chat_boosts.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/user_profile_photos.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/user_shared.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/users_shared.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/venue.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/video.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/video_chat_ended.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/video_chat_participants_invited.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/video_chat_scheduled.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/video_chat_started.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/video_note.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/voice.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/web_app_data.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/web_app_info.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/webhook_info.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/__pycache__/write_access_allowed.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/types/animation.py delete mode 100644 env/Lib/site-packages/aiogram/types/audio.py delete mode 100644 env/Lib/site-packages/aiogram/types/background_fill.py delete mode 100644 env/Lib/site-packages/aiogram/types/background_fill_freeform_gradient.py delete mode 100644 env/Lib/site-packages/aiogram/types/background_fill_gradient.py delete mode 100644 env/Lib/site-packages/aiogram/types/background_fill_solid.py delete mode 100644 env/Lib/site-packages/aiogram/types/background_type.py delete mode 100644 env/Lib/site-packages/aiogram/types/background_type_chat_theme.py delete mode 100644 env/Lib/site-packages/aiogram/types/background_type_fill.py delete mode 100644 env/Lib/site-packages/aiogram/types/background_type_pattern.py delete mode 100644 env/Lib/site-packages/aiogram/types/background_type_wallpaper.py delete mode 100644 env/Lib/site-packages/aiogram/types/base.py delete mode 100644 env/Lib/site-packages/aiogram/types/birthdate.py delete mode 100644 env/Lib/site-packages/aiogram/types/bot_command.py delete mode 100644 env/Lib/site-packages/aiogram/types/bot_command_scope.py delete mode 100644 env/Lib/site-packages/aiogram/types/bot_command_scope_all_chat_administrators.py delete mode 100644 env/Lib/site-packages/aiogram/types/bot_command_scope_all_group_chats.py delete mode 100644 env/Lib/site-packages/aiogram/types/bot_command_scope_all_private_chats.py delete mode 100644 env/Lib/site-packages/aiogram/types/bot_command_scope_chat.py delete mode 100644 env/Lib/site-packages/aiogram/types/bot_command_scope_chat_administrators.py delete mode 100644 env/Lib/site-packages/aiogram/types/bot_command_scope_chat_member.py delete mode 100644 env/Lib/site-packages/aiogram/types/bot_command_scope_default.py delete mode 100644 env/Lib/site-packages/aiogram/types/bot_description.py delete mode 100644 env/Lib/site-packages/aiogram/types/bot_name.py delete mode 100644 env/Lib/site-packages/aiogram/types/bot_short_description.py delete mode 100644 env/Lib/site-packages/aiogram/types/business_connection.py delete mode 100644 env/Lib/site-packages/aiogram/types/business_intro.py delete mode 100644 env/Lib/site-packages/aiogram/types/business_location.py delete mode 100644 env/Lib/site-packages/aiogram/types/business_messages_deleted.py delete mode 100644 env/Lib/site-packages/aiogram/types/business_opening_hours.py delete mode 100644 env/Lib/site-packages/aiogram/types/business_opening_hours_interval.py delete mode 100644 env/Lib/site-packages/aiogram/types/callback_game.py delete mode 100644 env/Lib/site-packages/aiogram/types/callback_query.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_administrator_rights.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_background.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_boost.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_boost_added.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_boost_removed.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_boost_source.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_boost_source_gift_code.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_boost_source_giveaway.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_boost_source_premium.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_boost_updated.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_full_info.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_invite_link.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_join_request.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_location.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_member.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_member_administrator.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_member_banned.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_member_left.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_member_member.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_member_owner.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_member_restricted.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_member_updated.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_permissions.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_photo.py delete mode 100644 env/Lib/site-packages/aiogram/types/chat_shared.py delete mode 100644 env/Lib/site-packages/aiogram/types/chosen_inline_result.py delete mode 100644 env/Lib/site-packages/aiogram/types/contact.py delete mode 100644 env/Lib/site-packages/aiogram/types/custom.py delete mode 100644 env/Lib/site-packages/aiogram/types/dice.py delete mode 100644 env/Lib/site-packages/aiogram/types/document.py delete mode 100644 env/Lib/site-packages/aiogram/types/downloadable.py delete mode 100644 env/Lib/site-packages/aiogram/types/encrypted_credentials.py delete mode 100644 env/Lib/site-packages/aiogram/types/encrypted_passport_element.py delete mode 100644 env/Lib/site-packages/aiogram/types/error_event.py delete mode 100644 env/Lib/site-packages/aiogram/types/external_reply_info.py delete mode 100644 env/Lib/site-packages/aiogram/types/file.py delete mode 100644 env/Lib/site-packages/aiogram/types/force_reply.py delete mode 100644 env/Lib/site-packages/aiogram/types/forum_topic.py delete mode 100644 env/Lib/site-packages/aiogram/types/forum_topic_closed.py delete mode 100644 env/Lib/site-packages/aiogram/types/forum_topic_created.py delete mode 100644 env/Lib/site-packages/aiogram/types/forum_topic_edited.py delete mode 100644 env/Lib/site-packages/aiogram/types/forum_topic_reopened.py delete mode 100644 env/Lib/site-packages/aiogram/types/game.py delete mode 100644 env/Lib/site-packages/aiogram/types/game_high_score.py delete mode 100644 env/Lib/site-packages/aiogram/types/general_forum_topic_hidden.py delete mode 100644 env/Lib/site-packages/aiogram/types/general_forum_topic_unhidden.py delete mode 100644 env/Lib/site-packages/aiogram/types/giveaway.py delete mode 100644 env/Lib/site-packages/aiogram/types/giveaway_completed.py delete mode 100644 env/Lib/site-packages/aiogram/types/giveaway_created.py delete mode 100644 env/Lib/site-packages/aiogram/types/giveaway_winners.py delete mode 100644 env/Lib/site-packages/aiogram/types/inaccessible_message.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_keyboard_button.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_keyboard_markup.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_article.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_audio.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_cached_audio.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_cached_document.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_cached_gif.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_cached_mpeg4_gif.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_cached_photo.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_cached_sticker.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_cached_video.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_cached_voice.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_contact.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_document.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_game.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_gif.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_location.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_mpeg4_gif.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_photo.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_venue.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_video.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_result_voice.py delete mode 100644 env/Lib/site-packages/aiogram/types/inline_query_results_button.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_contact_message_content.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_file.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_invoice_message_content.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_location_message_content.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_media.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_media_animation.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_media_audio.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_media_document.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_media_photo.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_media_video.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_message_content.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_paid_media.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_paid_media_photo.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_paid_media_video.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_poll_option.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_sticker.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_text_message_content.py delete mode 100644 env/Lib/site-packages/aiogram/types/input_venue_message_content.py delete mode 100644 env/Lib/site-packages/aiogram/types/invoice.py delete mode 100644 env/Lib/site-packages/aiogram/types/keyboard_button.py delete mode 100644 env/Lib/site-packages/aiogram/types/keyboard_button_poll_type.py delete mode 100644 env/Lib/site-packages/aiogram/types/keyboard_button_request_chat.py delete mode 100644 env/Lib/site-packages/aiogram/types/keyboard_button_request_user.py delete mode 100644 env/Lib/site-packages/aiogram/types/keyboard_button_request_users.py delete mode 100644 env/Lib/site-packages/aiogram/types/labeled_price.py delete mode 100644 env/Lib/site-packages/aiogram/types/link_preview_options.py delete mode 100644 env/Lib/site-packages/aiogram/types/location.py delete mode 100644 env/Lib/site-packages/aiogram/types/login_url.py delete mode 100644 env/Lib/site-packages/aiogram/types/mask_position.py delete mode 100644 env/Lib/site-packages/aiogram/types/maybe_inaccessible_message.py delete mode 100644 env/Lib/site-packages/aiogram/types/menu_button.py delete mode 100644 env/Lib/site-packages/aiogram/types/menu_button_commands.py delete mode 100644 env/Lib/site-packages/aiogram/types/menu_button_default.py delete mode 100644 env/Lib/site-packages/aiogram/types/menu_button_web_app.py delete mode 100644 env/Lib/site-packages/aiogram/types/message.py delete mode 100644 env/Lib/site-packages/aiogram/types/message_auto_delete_timer_changed.py delete mode 100644 env/Lib/site-packages/aiogram/types/message_entity.py delete mode 100644 env/Lib/site-packages/aiogram/types/message_id.py delete mode 100644 env/Lib/site-packages/aiogram/types/message_origin.py delete mode 100644 env/Lib/site-packages/aiogram/types/message_origin_channel.py delete mode 100644 env/Lib/site-packages/aiogram/types/message_origin_chat.py delete mode 100644 env/Lib/site-packages/aiogram/types/message_origin_hidden_user.py delete mode 100644 env/Lib/site-packages/aiogram/types/message_origin_user.py delete mode 100644 env/Lib/site-packages/aiogram/types/message_reaction_count_updated.py delete mode 100644 env/Lib/site-packages/aiogram/types/message_reaction_updated.py delete mode 100644 env/Lib/site-packages/aiogram/types/order_info.py delete mode 100644 env/Lib/site-packages/aiogram/types/paid_media.py delete mode 100644 env/Lib/site-packages/aiogram/types/paid_media_info.py delete mode 100644 env/Lib/site-packages/aiogram/types/paid_media_photo.py delete mode 100644 env/Lib/site-packages/aiogram/types/paid_media_preview.py delete mode 100644 env/Lib/site-packages/aiogram/types/paid_media_video.py delete mode 100644 env/Lib/site-packages/aiogram/types/passport_data.py delete mode 100644 env/Lib/site-packages/aiogram/types/passport_element_error.py delete mode 100644 env/Lib/site-packages/aiogram/types/passport_element_error_data_field.py delete mode 100644 env/Lib/site-packages/aiogram/types/passport_element_error_file.py delete mode 100644 env/Lib/site-packages/aiogram/types/passport_element_error_files.py delete mode 100644 env/Lib/site-packages/aiogram/types/passport_element_error_front_side.py delete mode 100644 env/Lib/site-packages/aiogram/types/passport_element_error_reverse_side.py delete mode 100644 env/Lib/site-packages/aiogram/types/passport_element_error_selfie.py delete mode 100644 env/Lib/site-packages/aiogram/types/passport_element_error_translation_file.py delete mode 100644 env/Lib/site-packages/aiogram/types/passport_element_error_translation_files.py delete mode 100644 env/Lib/site-packages/aiogram/types/passport_element_error_unspecified.py delete mode 100644 env/Lib/site-packages/aiogram/types/passport_file.py delete mode 100644 env/Lib/site-packages/aiogram/types/photo_size.py delete mode 100644 env/Lib/site-packages/aiogram/types/poll.py delete mode 100644 env/Lib/site-packages/aiogram/types/poll_answer.py delete mode 100644 env/Lib/site-packages/aiogram/types/poll_option.py delete mode 100644 env/Lib/site-packages/aiogram/types/pre_checkout_query.py delete mode 100644 env/Lib/site-packages/aiogram/types/proximity_alert_triggered.py delete mode 100644 env/Lib/site-packages/aiogram/types/reaction_count.py delete mode 100644 env/Lib/site-packages/aiogram/types/reaction_type.py delete mode 100644 env/Lib/site-packages/aiogram/types/reaction_type_custom_emoji.py delete mode 100644 env/Lib/site-packages/aiogram/types/reaction_type_emoji.py delete mode 100644 env/Lib/site-packages/aiogram/types/reaction_type_paid.py delete mode 100644 env/Lib/site-packages/aiogram/types/refunded_payment.py delete mode 100644 env/Lib/site-packages/aiogram/types/reply_keyboard_markup.py delete mode 100644 env/Lib/site-packages/aiogram/types/reply_keyboard_remove.py delete mode 100644 env/Lib/site-packages/aiogram/types/reply_parameters.py delete mode 100644 env/Lib/site-packages/aiogram/types/response_parameters.py delete mode 100644 env/Lib/site-packages/aiogram/types/revenue_withdrawal_state.py delete mode 100644 env/Lib/site-packages/aiogram/types/revenue_withdrawal_state_failed.py delete mode 100644 env/Lib/site-packages/aiogram/types/revenue_withdrawal_state_pending.py delete mode 100644 env/Lib/site-packages/aiogram/types/revenue_withdrawal_state_succeeded.py delete mode 100644 env/Lib/site-packages/aiogram/types/sent_web_app_message.py delete mode 100644 env/Lib/site-packages/aiogram/types/shared_user.py delete mode 100644 env/Lib/site-packages/aiogram/types/shipping_address.py delete mode 100644 env/Lib/site-packages/aiogram/types/shipping_option.py delete mode 100644 env/Lib/site-packages/aiogram/types/shipping_query.py delete mode 100644 env/Lib/site-packages/aiogram/types/star_transaction.py delete mode 100644 env/Lib/site-packages/aiogram/types/star_transactions.py delete mode 100644 env/Lib/site-packages/aiogram/types/sticker.py delete mode 100644 env/Lib/site-packages/aiogram/types/sticker_set.py delete mode 100644 env/Lib/site-packages/aiogram/types/story.py delete mode 100644 env/Lib/site-packages/aiogram/types/successful_payment.py delete mode 100644 env/Lib/site-packages/aiogram/types/switch_inline_query_chosen_chat.py delete mode 100644 env/Lib/site-packages/aiogram/types/text_quote.py delete mode 100644 env/Lib/site-packages/aiogram/types/transaction_partner.py delete mode 100644 env/Lib/site-packages/aiogram/types/transaction_partner_fragment.py delete mode 100644 env/Lib/site-packages/aiogram/types/transaction_partner_other.py delete mode 100644 env/Lib/site-packages/aiogram/types/transaction_partner_telegram_ads.py delete mode 100644 env/Lib/site-packages/aiogram/types/transaction_partner_user.py delete mode 100644 env/Lib/site-packages/aiogram/types/update.py delete mode 100644 env/Lib/site-packages/aiogram/types/user.py delete mode 100644 env/Lib/site-packages/aiogram/types/user_chat_boosts.py delete mode 100644 env/Lib/site-packages/aiogram/types/user_profile_photos.py delete mode 100644 env/Lib/site-packages/aiogram/types/user_shared.py delete mode 100644 env/Lib/site-packages/aiogram/types/users_shared.py delete mode 100644 env/Lib/site-packages/aiogram/types/venue.py delete mode 100644 env/Lib/site-packages/aiogram/types/video.py delete mode 100644 env/Lib/site-packages/aiogram/types/video_chat_ended.py delete mode 100644 env/Lib/site-packages/aiogram/types/video_chat_participants_invited.py delete mode 100644 env/Lib/site-packages/aiogram/types/video_chat_scheduled.py delete mode 100644 env/Lib/site-packages/aiogram/types/video_chat_started.py delete mode 100644 env/Lib/site-packages/aiogram/types/video_note.py delete mode 100644 env/Lib/site-packages/aiogram/types/voice.py delete mode 100644 env/Lib/site-packages/aiogram/types/web_app_data.py delete mode 100644 env/Lib/site-packages/aiogram/types/web_app_info.py delete mode 100644 env/Lib/site-packages/aiogram/types/webhook_info.py delete mode 100644 env/Lib/site-packages/aiogram/types/write_access_allowed.py delete mode 100644 env/Lib/site-packages/aiogram/utils/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/auth_widget.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/backoff.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/callback_answer.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/chat_action.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/chat_member.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/deep_linking.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/formatting.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/keyboard.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/link.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/magic_filter.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/markdown.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/media_group.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/mixins.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/mypy_hacks.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/payload.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/serialization.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/text_decorations.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/token.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/warnings.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/__pycache__/web_app.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/auth_widget.py delete mode 100644 env/Lib/site-packages/aiogram/utils/backoff.py delete mode 100644 env/Lib/site-packages/aiogram/utils/callback_answer.py delete mode 100644 env/Lib/site-packages/aiogram/utils/chat_action.py delete mode 100644 env/Lib/site-packages/aiogram/utils/chat_member.py delete mode 100644 env/Lib/site-packages/aiogram/utils/deep_linking.py delete mode 100644 env/Lib/site-packages/aiogram/utils/formatting.py delete mode 100644 env/Lib/site-packages/aiogram/utils/i18n/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/utils/i18n/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/i18n/__pycache__/context.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/i18n/__pycache__/core.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/i18n/__pycache__/lazy_proxy.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/i18n/__pycache__/middleware.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/utils/i18n/context.py delete mode 100644 env/Lib/site-packages/aiogram/utils/i18n/core.py delete mode 100644 env/Lib/site-packages/aiogram/utils/i18n/lazy_proxy.py delete mode 100644 env/Lib/site-packages/aiogram/utils/i18n/middleware.py delete mode 100644 env/Lib/site-packages/aiogram/utils/keyboard.py delete mode 100644 env/Lib/site-packages/aiogram/utils/link.py delete mode 100644 env/Lib/site-packages/aiogram/utils/magic_filter.py delete mode 100644 env/Lib/site-packages/aiogram/utils/markdown.py delete mode 100644 env/Lib/site-packages/aiogram/utils/media_group.py delete mode 100644 env/Lib/site-packages/aiogram/utils/mixins.py delete mode 100644 env/Lib/site-packages/aiogram/utils/mypy_hacks.py delete mode 100644 env/Lib/site-packages/aiogram/utils/payload.py delete mode 100644 env/Lib/site-packages/aiogram/utils/serialization.py delete mode 100644 env/Lib/site-packages/aiogram/utils/text_decorations.py delete mode 100644 env/Lib/site-packages/aiogram/utils/token.py delete mode 100644 env/Lib/site-packages/aiogram/utils/warnings.py delete mode 100644 env/Lib/site-packages/aiogram/utils/web_app.py delete mode 100644 env/Lib/site-packages/aiogram/webhook/__init__.py delete mode 100644 env/Lib/site-packages/aiogram/webhook/__pycache__/__init__.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/webhook/__pycache__/aiohttp_server.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/webhook/__pycache__/security.cpython-311.pyc delete mode 100644 env/Lib/site-packages/aiogram/webhook/aiohttp_server.py delete mode 100644 env/Lib/site-packages/aiogram/webhook/security.py create mode 100644 test.py diff --git a/env/Lib/site-packages/aiogram-3.12.0.dist-info/INSTALLER b/env/Lib/site-packages/aiogram-3.12.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/env/Lib/site-packages/aiogram-3.12.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/env/Lib/site-packages/aiogram-3.12.0.dist-info/METADATA b/env/Lib/site-packages/aiogram-3.12.0.dist-info/METADATA deleted file mode 100644 index e0470f1..0000000 --- a/env/Lib/site-packages/aiogram-3.12.0.dist-info/METADATA +++ /dev/null @@ -1,163 +0,0 @@ -Metadata-Version: 2.3 -Name: aiogram -Version: 3.12.0 -Summary: Modern and fully asynchronous framework for Telegram Bot API -Project-URL: Homepage, https://aiogram.dev/ -Project-URL: Documentation, https://docs.aiogram.dev/ -Project-URL: Repository, https://github.com/aiogram/aiogram/ -Author-email: Alex Root Junior -Maintainer-email: Alex Root Junior -License-Expression: MIT -License-File: LICENSE -Keywords: api,asyncio,bot,framework,telegram,wrapper -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Console -Classifier: Framework :: AsyncIO -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: System Administrators -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Communications :: Chat -Classifier: Topic :: Software Development :: Libraries :: Application Frameworks -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Typing :: Typed -Requires-Python: >=3.8 -Requires-Dist: aiofiles~=23.2.1 -Requires-Dist: aiohttp<3.11,>=3.9.0 -Requires-Dist: certifi>=2023.7.22 -Requires-Dist: magic-filter<1.1,>=1.0.12 -Requires-Dist: pydantic<2.9,>=2.4.1 -Requires-Dist: typing-extensions<=5.0,>=4.7.0 -Provides-Extra: cli -Requires-Dist: aiogram-cli~=1.0.3; extra == 'cli' -Provides-Extra: dev -Requires-Dist: black~=24.4.2; extra == 'dev' -Requires-Dist: isort~=5.13.2; extra == 'dev' -Requires-Dist: motor-types~=1.0.0b4; extra == 'dev' -Requires-Dist: mypy~=1.10.0; extra == 'dev' -Requires-Dist: packaging~=24.1; extra == 'dev' -Requires-Dist: pre-commit~=3.5; extra == 'dev' -Requires-Dist: ruff~=0.5.1; extra == 'dev' -Requires-Dist: toml~=0.10.2; extra == 'dev' -Provides-Extra: docs -Requires-Dist: furo~=2023.9.10; extra == 'docs' -Requires-Dist: markdown-include~=0.8.1; extra == 'docs' -Requires-Dist: pygments~=2.16.1; extra == 'docs' -Requires-Dist: pymdown-extensions~=10.3; extra == 'docs' -Requires-Dist: sphinx-autobuild~=2021.3.14; extra == 'docs' -Requires-Dist: sphinx-copybutton~=0.5.2; extra == 'docs' -Requires-Dist: sphinx-intl~=2.1.0; extra == 'docs' -Requires-Dist: sphinx-substitution-extensions~=2022.2.16; extra == 'docs' -Requires-Dist: sphinxcontrib-towncrier~=0.4.0a0; extra == 'docs' -Requires-Dist: sphinx~=7.2.6; extra == 'docs' -Requires-Dist: towncrier~=24.7.1; extra == 'docs' -Provides-Extra: fast -Requires-Dist: aiodns>=3.0.0; extra == 'fast' -Requires-Dist: uvloop>=0.17.0; ((sys_platform == 'darwin' or sys_platform == 'linux') and platform_python_implementation != 'PyPy') and extra == 'fast' -Provides-Extra: i18n -Requires-Dist: babel~=2.13.0; extra == 'i18n' -Provides-Extra: mongo -Requires-Dist: motor~=3.3.2; extra == 'mongo' -Provides-Extra: proxy -Requires-Dist: aiohttp-socks~=0.8.3; extra == 'proxy' -Provides-Extra: redis -Requires-Dist: redis[hiredis]~=5.0.1; extra == 'redis' -Provides-Extra: test -Requires-Dist: aresponses~=2.1.6; extra == 'test' -Requires-Dist: pycryptodomex~=3.19.0; extra == 'test' -Requires-Dist: pytest-aiohttp~=1.0.5; extra == 'test' -Requires-Dist: pytest-asyncio~=0.21.1; extra == 'test' -Requires-Dist: pytest-cov~=4.1.0; extra == 'test' -Requires-Dist: pytest-html~=4.0.2; extra == 'test' -Requires-Dist: pytest-lazy-fixture~=0.6.3; extra == 'test' -Requires-Dist: pytest-mock~=3.12.0; extra == 'test' -Requires-Dist: pytest-mypy~=0.10.3; extra == 'test' -Requires-Dist: pytest~=7.4.2; extra == 'test' -Requires-Dist: pytz~=2023.3; extra == 'test' -Description-Content-Type: text/x-rst - -####### -aiogram -####### - -.. image:: https://img.shields.io/pypi/l/aiogram.svg?style=flat-square - :target: https://opensource.org/licenses/MIT - :alt: MIT License - -.. image:: https://img.shields.io/pypi/status/aiogram.svg?style=flat-square - :target: https://pypi.python.org/pypi/aiogram - :alt: PyPi status - -.. image:: https://img.shields.io/pypi/v/aiogram.svg?style=flat-square - :target: https://pypi.python.org/pypi/aiogram - :alt: PyPi Package Version - -.. image:: https://img.shields.io/pypi/dm/aiogram.svg?style=flat-square - :target: https://pypi.python.org/pypi/aiogram - :alt: Downloads - -.. image:: https://img.shields.io/pypi/pyversions/aiogram.svg?style=flat-square - :target: https://pypi.python.org/pypi/aiogram - :alt: Supported python versions - -.. image:: https://img.shields.io/badge/dynamic/json?color=blue&logo=telegram&label=Telegram%20Bot%20API&query=%24.api.version&url=https%3A%2F%2Fraw.githubusercontent.com%2Faiogram%2Faiogram%2Fdev-3.x%2F.butcher%2Fschema%2Fschema.json&style=flat-square - :target: https://core.telegram.org/bots/api - :alt: Telegram Bot API - -.. image:: https://img.shields.io/github/actions/workflow/status/aiogram/aiogram/tests.yml?branch=dev-3.x&style=flat-square - :target: https://github.com/aiogram/aiogram/actions - :alt: Tests - -.. image:: https://img.shields.io/codecov/c/github/aiogram/aiogram?style=flat-square - :target: https://app.codecov.io/gh/aiogram/aiogram - :alt: Codecov - -**aiogram** is a modern and fully asynchronous framework for -`Telegram Bot API `_ written in Python 3.8+ using -`asyncio `_ and -`aiohttp `_. - -Make your bots faster and more powerful! - -Documentation: - - 🇺🇸 `English `_ - - 🇺🇦 `Ukrainian `_ - - -Features -======== - -- Asynchronous (`asyncio docs `_, :pep:`492`) -- Has type hints (:pep:`484`) and can be used with `mypy `_ -- Supports `PyPy `_ -- Supports `Telegram Bot API 7.9 `_ and gets fast updates to the latest versions of the Bot API -- Telegram Bot API integration code was `autogenerated `_ and can be easily re-generated when API gets updated -- Updates router (Blueprints) -- Has Finite State Machine -- Uses powerful `magic filters `_ -- Middlewares (incoming updates and API calls) -- Provides `Replies into Webhook `_ -- Integrated I18n/L10n support with GNU Gettext (or Fluent) - - -.. warning:: - - It is strongly advised that you have prior experience working - with `asyncio `_ - before beginning to use **aiogram**. - - If you have any questions, you can visit our community chats on Telegram: - - - 🇺🇸 `@aiogram `_ - - 🇺🇦 `@aiogramua `_ - - 🇺🇿 `@aiogram_uz `_ - - 🇰🇿 `@aiogram_kz `_ - - 🇷🇺 `@aiogram_ru `_ - - 🇮🇷 `@aiogram_fa `_ - - 🇮🇹 `@aiogram_it `_ - - 🇧🇷 `@aiogram_br `_ diff --git a/env/Lib/site-packages/aiogram-3.12.0.dist-info/RECORD b/env/Lib/site-packages/aiogram-3.12.0.dist-info/RECORD deleted file mode 100644 index 4bcde9a..0000000 --- a/env/Lib/site-packages/aiogram-3.12.0.dist-info/RECORD +++ /dev/null @@ -1,961 +0,0 @@ -aiogram-3.12.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -aiogram-3.12.0.dist-info/METADATA,sha256=xLpro6MzAiOqnI3s9iwMQa4utDb-lP5628N1tsZdgN4,7344 -aiogram-3.12.0.dist-info/RECORD,, -aiogram-3.12.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiogram-3.12.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87 -aiogram-3.12.0.dist-info/licenses/LICENSE,sha256=kTEqDVZ6fYSuFKAER9NvxX60epaWBKI_h-xGsoiU6Iw,1070 -aiogram/__init__.py,sha256=hzEKX_gFXmp5n4GXZEU80SJep1_FAH9owAnFTqd9nK0,948 -aiogram/__meta__.py,sha256=55lJQIAoSsYeR0jyyKdVygUQrmEXQxbAvKlsKTLaShU,47 -aiogram/__pycache__/__init__.cpython-311.pyc,, -aiogram/__pycache__/__meta__.cpython-311.pyc,, -aiogram/__pycache__/exceptions.cpython-311.pyc,, -aiogram/__pycache__/loggers.cpython-311.pyc,, -aiogram/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiogram/client/__pycache__/__init__.cpython-311.pyc,, -aiogram/client/__pycache__/bot.cpython-311.pyc,, -aiogram/client/__pycache__/context_controller.cpython-311.pyc,, -aiogram/client/__pycache__/default.cpython-311.pyc,, -aiogram/client/__pycache__/telegram.cpython-311.pyc,, -aiogram/client/bot.py,sha256=gYy_a9F6Hass5YwsobSFeOu15mDrnR1u6N1x0YohQnA,262513 -aiogram/client/context_controller.py,sha256=rAminUBsB3K5FDyj-WQopkD1e94c7GrGVXNyaqPbXZ0,761 -aiogram/client/default.py,sha256=sqctTqHKsc69UBGh4sJeFbihGH5feDudb685CbMtdDU,2750 -aiogram/client/session/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiogram/client/session/__pycache__/__init__.cpython-311.pyc,, -aiogram/client/session/__pycache__/aiohttp.cpython-311.pyc,, -aiogram/client/session/__pycache__/base.cpython-311.pyc,, -aiogram/client/session/aiohttp.py,sha256=q2OZLVEdz3LghDlEC5KfDEJJLtwYEbfJMXEmsVNnRcQ,7197 -aiogram/client/session/base.py,sha256=e3n5NrwL6L-pFhLetTgBg76uLJDxDP6jQqyxPgjtI_0,8335 -aiogram/client/session/middlewares/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiogram/client/session/middlewares/__pycache__/__init__.cpython-311.pyc,, -aiogram/client/session/middlewares/__pycache__/base.cpython-311.pyc,, -aiogram/client/session/middlewares/__pycache__/manager.cpython-311.pyc,, -aiogram/client/session/middlewares/__pycache__/request_logging.cpython-311.pyc,, -aiogram/client/session/middlewares/base.py,sha256=ck8-iOnaYO2FHb3Yjq6E_TZwiPMg8w8THOXqyHDLjro,1394 -aiogram/client/session/middlewares/manager.py,sha256=c1CS6S_UvxYVAfCq6MZ4Laet6sxReEmQ915XltTJR5o,1903 -aiogram/client/session/middlewares/request_logging.py,sha256=_nUsciMnQeTZ-_nJw3A3NNBlGWzGqKMqYw2oJqJw3s8,1183 -aiogram/client/telegram.py,sha256=cu0HUZqwPzvZp-tMI3yewmnNZ78aTpFfEF0ZZVf0qAw,3080 -aiogram/dispatcher/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiogram/dispatcher/__pycache__/__init__.cpython-311.pyc,, -aiogram/dispatcher/__pycache__/dispatcher.cpython-311.pyc,, -aiogram/dispatcher/__pycache__/flags.cpython-311.pyc,, -aiogram/dispatcher/__pycache__/router.cpython-311.pyc,, -aiogram/dispatcher/dispatcher.py,sha256=j3V5oi-nBUT1CBSBAs8lbCRQNIveZ9sVOJmUHnuJEqE,23205 -aiogram/dispatcher/event/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiogram/dispatcher/event/__pycache__/__init__.cpython-311.pyc,, -aiogram/dispatcher/event/__pycache__/bases.cpython-311.pyc,, -aiogram/dispatcher/event/__pycache__/event.cpython-311.pyc,, -aiogram/dispatcher/event/__pycache__/handler.cpython-311.pyc,, -aiogram/dispatcher/event/__pycache__/telegram.cpython-311.pyc,, -aiogram/dispatcher/event/bases.py,sha256=Piod0CEyGvBOwEuE7e70JMQal4XFilFD3NMinR2bEyE,871 -aiogram/dispatcher/event/event.py,sha256=YXOroGX5Mj-5w6Jgl9oPf-muIp6ijeWjNJ3hEr2mA68,1352 -aiogram/dispatcher/event/handler.py,sha256=rgV8j1x2a8qpmWCue1-uQ3fRzrc8qDdhKNJBkBnFSYo,3631 -aiogram/dispatcher/event/telegram.py,sha256=BjptMwTbDVdpiIkngGyy8zY2b3i5__gwnuyA7uw9HoY,4767 -aiogram/dispatcher/flags.py,sha256=vEevCfweZKDCEW2tA5E3UbqMH-TjDBI0ujf7ktzsx9o,3479 -aiogram/dispatcher/middlewares/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiogram/dispatcher/middlewares/__pycache__/__init__.cpython-311.pyc,, -aiogram/dispatcher/middlewares/__pycache__/base.cpython-311.pyc,, -aiogram/dispatcher/middlewares/__pycache__/error.cpython-311.pyc,, -aiogram/dispatcher/middlewares/__pycache__/manager.cpython-311.pyc,, -aiogram/dispatcher/middlewares/__pycache__/user_context.cpython-311.pyc,, -aiogram/dispatcher/middlewares/base.py,sha256=czbD9IDLoHb6pf6HisRGyG8pAQMLbC4R5k-iuTIWSNU,784 -aiogram/dispatcher/middlewares/error.py,sha256=xDfQxTo9PT1qXvE35OGesDi7WydeQeB4zgT07eXM5G4,1119 -aiogram/dispatcher/middlewares/manager.py,sha256=-ivUdff-Addpd_s_AlDA4RaVsMJmzgWwvt2DIqITnBw,2166 -aiogram/dispatcher/middlewares/user_context.py,sha256=kc2ONIgh_b4MlItGxH-7RkxZ6zCevY2sfplJl1keyVU,7115 -aiogram/dispatcher/router.py,sha256=vnAvQQANQ85JXE84s7JXkVo60uKUvyqg0bcIFGJ8we8,10512 -aiogram/enums/__init__.py,sha256=oQH8dIPtHKcgQwX6k6-EIda0PLM_HWyyPy5Oft1BSoY,2014 -aiogram/enums/__pycache__/__init__.cpython-311.pyc,, -aiogram/enums/__pycache__/bot_command_scope_type.cpython-311.pyc,, -aiogram/enums/__pycache__/chat_action.cpython-311.pyc,, -aiogram/enums/__pycache__/chat_boost_source_type.cpython-311.pyc,, -aiogram/enums/__pycache__/chat_member_status.cpython-311.pyc,, -aiogram/enums/__pycache__/chat_type.cpython-311.pyc,, -aiogram/enums/__pycache__/content_type.cpython-311.pyc,, -aiogram/enums/__pycache__/currency.cpython-311.pyc,, -aiogram/enums/__pycache__/dice_emoji.cpython-311.pyc,, -aiogram/enums/__pycache__/encrypted_passport_element.cpython-311.pyc,, -aiogram/enums/__pycache__/inline_query_result_type.cpython-311.pyc,, -aiogram/enums/__pycache__/input_media_type.cpython-311.pyc,, -aiogram/enums/__pycache__/input_paid_media_type.cpython-311.pyc,, -aiogram/enums/__pycache__/keyboard_button_poll_type_type.cpython-311.pyc,, -aiogram/enums/__pycache__/mask_position_point.cpython-311.pyc,, -aiogram/enums/__pycache__/menu_button_type.cpython-311.pyc,, -aiogram/enums/__pycache__/message_entity_type.cpython-311.pyc,, -aiogram/enums/__pycache__/message_origin_type.cpython-311.pyc,, -aiogram/enums/__pycache__/paid_media_type.cpython-311.pyc,, -aiogram/enums/__pycache__/parse_mode.cpython-311.pyc,, -aiogram/enums/__pycache__/passport_element_error_type.cpython-311.pyc,, -aiogram/enums/__pycache__/poll_type.cpython-311.pyc,, -aiogram/enums/__pycache__/reaction_type_type.cpython-311.pyc,, -aiogram/enums/__pycache__/revenue_withdrawal_state_type.cpython-311.pyc,, -aiogram/enums/__pycache__/sticker_format.cpython-311.pyc,, -aiogram/enums/__pycache__/sticker_type.cpython-311.pyc,, -aiogram/enums/__pycache__/topic_icon_color.cpython-311.pyc,, -aiogram/enums/__pycache__/transaction_partner_type.cpython-311.pyc,, -aiogram/enums/__pycache__/update_type.cpython-311.pyc,, -aiogram/enums/bot_command_scope_type.py,sha256=aPn5UKE6AN5BpK9kTH1ffJzG3qUOWFu5lyZOifMu5so,477 -aiogram/enums/chat_action.py,sha256=KKItRU_RQuNzFMrAtc67Pn0aT4rZuuynpH6-yXfBhRY,972 -aiogram/enums/chat_boost_source_type.py,sha256=80MfT0G_9-uv-7MsTs0lZjtJiA7EaUmqYd5b3vH6JtU,277 -aiogram/enums/chat_member_status.py,sha256=OLr5ZfkZocicy1t5i30g7ufR8kujBPHENzR5UHnsDpc,334 -aiogram/enums/chat_type.py,sha256=1Oi1TYITumT8jZritu1fgHNKDvK9otlAhPm4soyBKQQ,280 -aiogram/enums/content_type.py,sha256=sSTHtq4LqeYB4J3zFug1HkhVuORSdcT7g91ZQTjOZrE,2311 -aiogram/enums/currency.py,sha256=P5S_e7Y3wYmODiaK_8Fz0MHVwJXkt1P9Y3gd2SGo1iU,1563 -aiogram/enums/dice_emoji.py,sha256=9KlOPTQlgt-6d3myDEWWUTB9H8BrE_LRaOZvBM2ceWs,303 -aiogram/enums/encrypted_passport_element.py,sha256=m0-tAF9myf6FwPbsuJgj4AYvywzLMzzltUgrqWgGVws,704 -aiogram/enums/inline_query_result_type.py,sha256=HGNN5aOg_jZbE4NNfHs21M-xK5cj2rBar4-C77T73YI,465 -aiogram/enums/input_media_type.py,sha256=BfCDkzFOjrzJSo2syY2lq3E3JP8AdlGemp7qMnAupw0,291 -aiogram/enums/input_paid_media_type.py,sha256=KoqJo7AelAiY8pmS1mRBuQLz97hedWFImEEVFnEoMmY,247 -aiogram/enums/keyboard_button_poll_type_type.py,sha256=vPjequaOO5zySi7hiQjyVIfQl-jhtpgCGHYMR7DOYWY,324 -aiogram/enums/mask_position_point.py,sha256=lhlx8U-9gtGn_LPiSOHWBe1u8YTLZCERs5x8DRmUubM,290 -aiogram/enums/menu_button_type.py,sha256=4FDz7HKaVtfBlvXObCOVAUmyQQvRsyPi0Vu_Kc-HbDs,264 -aiogram/enums/message_entity_type.py,sha256=00ioN4bPLNUYvCL_nJzp7rNUPhIqNOqoWY3PjiC4ob8,703 -aiogram/enums/message_origin_type.py,sha256=qWHgXPzpuhsTcLx-huqNS1l36JSwqbsCY70_d20nreM,279 -aiogram/enums/paid_media_type.py,sha256=FrGQyXq9bimIb8_b0hpuqYG4mWVruoBYkSC6drd7hw4,261 -aiogram/enums/parse_mode.py,sha256=t5F3LaNLsUOaNQuYlQseWt36suA-oRgr_uScGEU8TKU,234 -aiogram/enums/passport_element_error_type.py,sha256=HCcvvc8DDUNRD-mdFgFqMEFlr_4pa5Us5_U6pO2wXsc,471 -aiogram/enums/poll_type.py,sha256=DluT-wQcOGqBgQimYLlO6OlTIIYnnbtHOmY9pjqVToo,200 -aiogram/enums/reaction_type_type.py,sha256=HfSXXZFcMXjIoD0Q8B_lZju6mPuB4jNIBbRyIfLYnEI,233 -aiogram/enums/revenue_withdrawal_state_type.py,sha256=ZVw59f9-RYG00TJdSHnZo_LTbdR_J8RmkhDCV4C8AFg,290 -aiogram/enums/sticker_format.py,sha256=UmbwulTvkG7TFwS2twsblqiBj89jeEWY-y7P7Ah2qgo,235 -aiogram/enums/sticker_type.py,sha256=XonGtnasf3tXwoD2DVRx5E16rHCE5VqgAFSfcFMIAGU,278 -aiogram/enums/topic_icon_color.py,sha256=q-DilvJsgVmz5VafMOxj1BKJcMoHzpRrbatTPE4inxk,399 -aiogram/enums/transaction_partner_type.py,sha256=VSLiUN_53Ggi9_YrrxoF8OeltgiLY2jJGkAYQJcaHWI,305 -aiogram/enums/update_type.py,sha256=WAXTSDLbOXyzjLanGn_22HsALq96OVdd5q8HunubdG8,1086 -aiogram/exceptions.py,sha256=Y6wDVG2fyoczPn15U5epm_nnTx8eTC3CgX19SzyiqOE,5153 -aiogram/filters/__init__.py,sha256=w7mWuJOIpLDZyUt1eznzMeF-o1UrstHQ-OYbBHHG6ek,1031 -aiogram/filters/__pycache__/__init__.cpython-311.pyc,, -aiogram/filters/__pycache__/base.cpython-311.pyc,, -aiogram/filters/__pycache__/callback_data.cpython-311.pyc,, -aiogram/filters/__pycache__/chat_member_updated.cpython-311.pyc,, -aiogram/filters/__pycache__/command.cpython-311.pyc,, -aiogram/filters/__pycache__/exception.cpython-311.pyc,, -aiogram/filters/__pycache__/logic.cpython-311.pyc,, -aiogram/filters/__pycache__/magic_data.cpython-311.pyc,, -aiogram/filters/__pycache__/state.cpython-311.pyc,, -aiogram/filters/base.py,sha256=6mCB2nSjqskDDl9mKCZ3SghhwQ1jryaSTd5PvWii3bM,2005 -aiogram/filters/callback_data.py,sha256=nxRCCPXX4iuk1bnVpg3MdLOCeGlmJFKIcS6yjPkM2V8,6225 -aiogram/filters/chat_member_updated.py,sha256=3VsiMYLK6L7AfLS7RQRWwjXThWGN7gj4NAYnR0Wdr8I,7484 -aiogram/filters/command.py,sha256=IXb54dwKHLz-Jaq2_HHn2si7r5iAr9pYW3sSxD8szCk,9957 -aiogram/filters/exception.py,sha256=HbJIOVrXHh0_LkID6b-yn8Xow-llmLqKYmK0_tqB4YA,1488 -aiogram/filters/logic.py,sha256=2M-fYY8m1ybX00wFn_8toRHj5alTfy4T6zkIkYrQZbM,2174 -aiogram/filters/magic_data.py,sha256=Y07K9NLDXpXV0EuFR7GR7Yq4SzCYaD3XJsvDH-6JFkQ,718 -aiogram/filters/state.py,sha256=A4GuSAo5KPdSZMetCC9crrfbJ-yghLunJUVYkOdBPTI,1448 -aiogram/fsm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiogram/fsm/__pycache__/__init__.cpython-311.pyc,, -aiogram/fsm/__pycache__/context.cpython-311.pyc,, -aiogram/fsm/__pycache__/middleware.cpython-311.pyc,, -aiogram/fsm/__pycache__/scene.cpython-311.pyc,, -aiogram/fsm/__pycache__/state.cpython-311.pyc,, -aiogram/fsm/__pycache__/strategy.cpython-311.pyc,, -aiogram/fsm/context.py,sha256=o0cKPtB43Z2S8DgSD9be5moF8FqOboBca8Wyd6qvUgU,1072 -aiogram/fsm/middleware.py,sha256=4MsKWzr93tzLTmv3dph3pKhznuX9EGsrhBhCb6mhzPo,3755 -aiogram/fsm/scene.py,sha256=7a5zMRvfE2vHQ-3zSCHiBDa93QedmOr6kgLs1svjHAg,31903 -aiogram/fsm/state.py,sha256=T0sPq1_JV5Jq1jVKu67bUQ0-y9Kqsk3hGpj7PgjpacQ,5640 -aiogram/fsm/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiogram/fsm/storage/__pycache__/__init__.cpython-311.pyc,, -aiogram/fsm/storage/__pycache__/base.cpython-311.pyc,, -aiogram/fsm/storage/__pycache__/memory.cpython-311.pyc,, -aiogram/fsm/storage/__pycache__/mongo.cpython-311.pyc,, -aiogram/fsm/storage/__pycache__/redis.cpython-311.pyc,, -aiogram/fsm/storage/base.py,sha256=5SVkAFfcCLN8uZkE1EX7DFFcGJ89p4fp3wB9R8FU2no,5023 -aiogram/fsm/storage/memory.py,sha256=xG3507DVY01GTntkGSG1-2fPlWkcDL48QUTIE5WFowQ,2133 -aiogram/fsm/storage/mongo.py,sha256=xGvz9rLr6ji8BhumZb1FTvQ5RvmlGquhLAPe1-vi9ms,4880 -aiogram/fsm/storage/redis.py,sha256=7ZyaB-AMNEITjdYVn24Bha28_MIFRPX41mn5_0sEtiY,5322 -aiogram/fsm/strategy.py,sha256=RUDc6kMae9ZFbyC1bdbAIRz6GoeaIHFzXCXRu8p3Kn0,1147 -aiogram/handlers/__init__.py,sha256=XVErtJHhSmg4ytiDTP9J5pQY0RwBN1TsjT5v-Ls7RE4,800 -aiogram/handlers/__pycache__/__init__.cpython-311.pyc,, -aiogram/handlers/__pycache__/base.cpython-311.pyc,, -aiogram/handlers/__pycache__/callback_query.cpython-311.pyc,, -aiogram/handlers/__pycache__/chat_member.cpython-311.pyc,, -aiogram/handlers/__pycache__/chosen_inline_result.cpython-311.pyc,, -aiogram/handlers/__pycache__/error.cpython-311.pyc,, -aiogram/handlers/__pycache__/inline_query.cpython-311.pyc,, -aiogram/handlers/__pycache__/message.cpython-311.pyc,, -aiogram/handlers/__pycache__/poll.cpython-311.pyc,, -aiogram/handlers/__pycache__/pre_checkout_query.cpython-311.pyc,, -aiogram/handlers/__pycache__/shipping_query.cpython-311.pyc,, -aiogram/handlers/base.py,sha256=SKLNknDSxAItRHwPMJanOPFztWakJQCun4myH9TBNik,1097 -aiogram/handlers/callback_query.py,sha256=XWGgkmyt2Bgnh1B_3ivIZ_jMRJIQUEXPeKSUO4VW_zg,1036 -aiogram/handlers/chat_member.py,sha256=TCr1m47duHFUpL92W56ok0hF1k0NN3Yk88-1zzEsYmw,322 -aiogram/handlers/chosen_inline_result.py,sha256=NjAPc5EgBb8V4p3WVpcPNPd8b1OApymvBN-I75EYMQo,410 -aiogram/handlers/error.py,sha256=86pedHPBgYxXYwrW00s0cadf_lRP6TeHEG0goJ6zNJk,352 -aiogram/handlers/inline_query.py,sha256=sOkT3uMuvamMnSTxct-cdQFng6GBqaOlSNV4aHUbVPQ,381 -aiogram/handlers/message.py,sha256=I6R4TJ8V6bbGVppmxmGSxIkCzeN9JMn1CDojywWrt50,721 -aiogram/handlers/poll.py,sha256=Bn075JIux1lNPjKWH3woV_OzMcvPgPvtkgp4W22mUX8,396 -aiogram/handlers/pre_checkout_query.py,sha256=ZO0iZFVwRz4CtBWIVLds8JoHhMPqCahz6lwOfR4dEkg,321 -aiogram/handlers/shipping_query.py,sha256=ku14YRYvddTbHeKoIwb2oDpfrpsetFC1m2BwIsNwoAs,314 -aiogram/loggers.py,sha256=3MCGSmwgXXsWbgtSaTc6bPSwVOIe8FkQZglc0QLVvsY,257 -aiogram/methods/__init__.py,sha256=v4-H0SB9W9Z7rY4Y_uF5Z86dUZje0aI0cafAxDbL2W0,9575 -aiogram/methods/__pycache__/__init__.cpython-311.pyc,, -aiogram/methods/__pycache__/add_sticker_to_set.cpython-311.pyc,, -aiogram/methods/__pycache__/answer_callback_query.cpython-311.pyc,, -aiogram/methods/__pycache__/answer_inline_query.cpython-311.pyc,, -aiogram/methods/__pycache__/answer_pre_checkout_query.cpython-311.pyc,, -aiogram/methods/__pycache__/answer_shipping_query.cpython-311.pyc,, -aiogram/methods/__pycache__/answer_web_app_query.cpython-311.pyc,, -aiogram/methods/__pycache__/approve_chat_join_request.cpython-311.pyc,, -aiogram/methods/__pycache__/ban_chat_member.cpython-311.pyc,, -aiogram/methods/__pycache__/ban_chat_sender_chat.cpython-311.pyc,, -aiogram/methods/__pycache__/base.cpython-311.pyc,, -aiogram/methods/__pycache__/close.cpython-311.pyc,, -aiogram/methods/__pycache__/close_forum_topic.cpython-311.pyc,, -aiogram/methods/__pycache__/close_general_forum_topic.cpython-311.pyc,, -aiogram/methods/__pycache__/copy_message.cpython-311.pyc,, -aiogram/methods/__pycache__/copy_messages.cpython-311.pyc,, -aiogram/methods/__pycache__/create_chat_invite_link.cpython-311.pyc,, -aiogram/methods/__pycache__/create_chat_subscription_invite_link.cpython-311.pyc,, -aiogram/methods/__pycache__/create_forum_topic.cpython-311.pyc,, -aiogram/methods/__pycache__/create_invoice_link.cpython-311.pyc,, -aiogram/methods/__pycache__/create_new_sticker_set.cpython-311.pyc,, -aiogram/methods/__pycache__/decline_chat_join_request.cpython-311.pyc,, -aiogram/methods/__pycache__/delete_chat_photo.cpython-311.pyc,, -aiogram/methods/__pycache__/delete_chat_sticker_set.cpython-311.pyc,, -aiogram/methods/__pycache__/delete_forum_topic.cpython-311.pyc,, -aiogram/methods/__pycache__/delete_message.cpython-311.pyc,, -aiogram/methods/__pycache__/delete_messages.cpython-311.pyc,, -aiogram/methods/__pycache__/delete_my_commands.cpython-311.pyc,, -aiogram/methods/__pycache__/delete_sticker_from_set.cpython-311.pyc,, -aiogram/methods/__pycache__/delete_sticker_set.cpython-311.pyc,, -aiogram/methods/__pycache__/delete_webhook.cpython-311.pyc,, -aiogram/methods/__pycache__/edit_chat_invite_link.cpython-311.pyc,, -aiogram/methods/__pycache__/edit_chat_subscription_invite_link.cpython-311.pyc,, -aiogram/methods/__pycache__/edit_forum_topic.cpython-311.pyc,, -aiogram/methods/__pycache__/edit_general_forum_topic.cpython-311.pyc,, -aiogram/methods/__pycache__/edit_message_caption.cpython-311.pyc,, -aiogram/methods/__pycache__/edit_message_live_location.cpython-311.pyc,, -aiogram/methods/__pycache__/edit_message_media.cpython-311.pyc,, -aiogram/methods/__pycache__/edit_message_reply_markup.cpython-311.pyc,, -aiogram/methods/__pycache__/edit_message_text.cpython-311.pyc,, -aiogram/methods/__pycache__/export_chat_invite_link.cpython-311.pyc,, -aiogram/methods/__pycache__/forward_message.cpython-311.pyc,, -aiogram/methods/__pycache__/forward_messages.cpython-311.pyc,, -aiogram/methods/__pycache__/get_business_connection.cpython-311.pyc,, -aiogram/methods/__pycache__/get_chat.cpython-311.pyc,, -aiogram/methods/__pycache__/get_chat_administrators.cpython-311.pyc,, -aiogram/methods/__pycache__/get_chat_member.cpython-311.pyc,, -aiogram/methods/__pycache__/get_chat_member_count.cpython-311.pyc,, -aiogram/methods/__pycache__/get_chat_menu_button.cpython-311.pyc,, -aiogram/methods/__pycache__/get_custom_emoji_stickers.cpython-311.pyc,, -aiogram/methods/__pycache__/get_file.cpython-311.pyc,, -aiogram/methods/__pycache__/get_forum_topic_icon_stickers.cpython-311.pyc,, -aiogram/methods/__pycache__/get_game_high_scores.cpython-311.pyc,, -aiogram/methods/__pycache__/get_me.cpython-311.pyc,, -aiogram/methods/__pycache__/get_my_commands.cpython-311.pyc,, -aiogram/methods/__pycache__/get_my_default_administrator_rights.cpython-311.pyc,, -aiogram/methods/__pycache__/get_my_description.cpython-311.pyc,, -aiogram/methods/__pycache__/get_my_name.cpython-311.pyc,, -aiogram/methods/__pycache__/get_my_short_description.cpython-311.pyc,, -aiogram/methods/__pycache__/get_star_transactions.cpython-311.pyc,, -aiogram/methods/__pycache__/get_sticker_set.cpython-311.pyc,, -aiogram/methods/__pycache__/get_updates.cpython-311.pyc,, -aiogram/methods/__pycache__/get_user_chat_boosts.cpython-311.pyc,, -aiogram/methods/__pycache__/get_user_profile_photos.cpython-311.pyc,, -aiogram/methods/__pycache__/get_webhook_info.cpython-311.pyc,, -aiogram/methods/__pycache__/hide_general_forum_topic.cpython-311.pyc,, -aiogram/methods/__pycache__/leave_chat.cpython-311.pyc,, -aiogram/methods/__pycache__/log_out.cpython-311.pyc,, -aiogram/methods/__pycache__/pin_chat_message.cpython-311.pyc,, -aiogram/methods/__pycache__/promote_chat_member.cpython-311.pyc,, -aiogram/methods/__pycache__/refund_star_payment.cpython-311.pyc,, -aiogram/methods/__pycache__/reopen_forum_topic.cpython-311.pyc,, -aiogram/methods/__pycache__/reopen_general_forum_topic.cpython-311.pyc,, -aiogram/methods/__pycache__/replace_sticker_in_set.cpython-311.pyc,, -aiogram/methods/__pycache__/restrict_chat_member.cpython-311.pyc,, -aiogram/methods/__pycache__/revoke_chat_invite_link.cpython-311.pyc,, -aiogram/methods/__pycache__/send_animation.cpython-311.pyc,, -aiogram/methods/__pycache__/send_audio.cpython-311.pyc,, -aiogram/methods/__pycache__/send_chat_action.cpython-311.pyc,, -aiogram/methods/__pycache__/send_contact.cpython-311.pyc,, -aiogram/methods/__pycache__/send_dice.cpython-311.pyc,, -aiogram/methods/__pycache__/send_document.cpython-311.pyc,, -aiogram/methods/__pycache__/send_game.cpython-311.pyc,, -aiogram/methods/__pycache__/send_invoice.cpython-311.pyc,, -aiogram/methods/__pycache__/send_location.cpython-311.pyc,, -aiogram/methods/__pycache__/send_media_group.cpython-311.pyc,, -aiogram/methods/__pycache__/send_message.cpython-311.pyc,, -aiogram/methods/__pycache__/send_paid_media.cpython-311.pyc,, -aiogram/methods/__pycache__/send_photo.cpython-311.pyc,, -aiogram/methods/__pycache__/send_poll.cpython-311.pyc,, -aiogram/methods/__pycache__/send_sticker.cpython-311.pyc,, -aiogram/methods/__pycache__/send_venue.cpython-311.pyc,, -aiogram/methods/__pycache__/send_video.cpython-311.pyc,, -aiogram/methods/__pycache__/send_video_note.cpython-311.pyc,, -aiogram/methods/__pycache__/send_voice.cpython-311.pyc,, -aiogram/methods/__pycache__/set_chat_administrator_custom_title.cpython-311.pyc,, -aiogram/methods/__pycache__/set_chat_description.cpython-311.pyc,, -aiogram/methods/__pycache__/set_chat_menu_button.cpython-311.pyc,, -aiogram/methods/__pycache__/set_chat_permissions.cpython-311.pyc,, -aiogram/methods/__pycache__/set_chat_photo.cpython-311.pyc,, -aiogram/methods/__pycache__/set_chat_sticker_set.cpython-311.pyc,, -aiogram/methods/__pycache__/set_chat_title.cpython-311.pyc,, -aiogram/methods/__pycache__/set_custom_emoji_sticker_set_thumbnail.cpython-311.pyc,, -aiogram/methods/__pycache__/set_game_score.cpython-311.pyc,, -aiogram/methods/__pycache__/set_message_reaction.cpython-311.pyc,, -aiogram/methods/__pycache__/set_my_commands.cpython-311.pyc,, -aiogram/methods/__pycache__/set_my_default_administrator_rights.cpython-311.pyc,, -aiogram/methods/__pycache__/set_my_description.cpython-311.pyc,, -aiogram/methods/__pycache__/set_my_name.cpython-311.pyc,, -aiogram/methods/__pycache__/set_my_short_description.cpython-311.pyc,, -aiogram/methods/__pycache__/set_passport_data_errors.cpython-311.pyc,, -aiogram/methods/__pycache__/set_sticker_emoji_list.cpython-311.pyc,, -aiogram/methods/__pycache__/set_sticker_keywords.cpython-311.pyc,, -aiogram/methods/__pycache__/set_sticker_mask_position.cpython-311.pyc,, -aiogram/methods/__pycache__/set_sticker_position_in_set.cpython-311.pyc,, -aiogram/methods/__pycache__/set_sticker_set_thumbnail.cpython-311.pyc,, -aiogram/methods/__pycache__/set_sticker_set_title.cpython-311.pyc,, -aiogram/methods/__pycache__/set_webhook.cpython-311.pyc,, -aiogram/methods/__pycache__/stop_message_live_location.cpython-311.pyc,, -aiogram/methods/__pycache__/stop_poll.cpython-311.pyc,, -aiogram/methods/__pycache__/unban_chat_member.cpython-311.pyc,, -aiogram/methods/__pycache__/unban_chat_sender_chat.cpython-311.pyc,, -aiogram/methods/__pycache__/unhide_general_forum_topic.cpython-311.pyc,, -aiogram/methods/__pycache__/unpin_all_chat_messages.cpython-311.pyc,, -aiogram/methods/__pycache__/unpin_all_forum_topic_messages.cpython-311.pyc,, -aiogram/methods/__pycache__/unpin_all_general_forum_topic_messages.cpython-311.pyc,, -aiogram/methods/__pycache__/unpin_chat_message.cpython-311.pyc,, -aiogram/methods/__pycache__/upload_sticker_file.cpython-311.pyc,, -aiogram/methods/add_sticker_to_set.py,sha256=PR2B-SDNNYLaH70oevadRNAoiUjFQXLffGSIhQ7uah4,1443 -aiogram/methods/answer_callback_query.py,sha256=YVozC3bMDE8YoH6x5TipzWiXCwdWLAU96GWOJTxf1AE,2903 -aiogram/methods/answer_inline_query.py,sha256=039jip6Ty3cdvEuYbfougTO-DZIzi1f5hisl6yRg8qw,6017 -aiogram/methods/answer_pre_checkout_query.py,sha256=5peOULN2DO0VoK3nEAnsN-E9RWAH5ab64UUc-4apRHk,2172 -aiogram/methods/answer_shipping_query.py,sha256=oiq-B_Go-J_sRalwvgyFjUUZDEF1MX5IGNKV6khU0N8,2254 -aiogram/methods/answer_web_app_query.py,sha256=AXM-hDf_xIarwburmGT27ZoKFoGsbcVbPNM_EHUHKVo,3676 -aiogram/methods/approve_chat_join_request.py,sha256=KUetMV7jHSB9_v702JlSI-CVlJMHUCNstvjUC0GU3i4,1281 -aiogram/methods/ban_chat_member.py,sha256=hfHkT_Ucg-26oVtvRQwGvijDMn7uaV84agEY7vIEp-E,2481 -aiogram/methods/ban_chat_sender_chat.py,sha256=rr77ixJufnD9bWevxTaSHCcJVh3lIf19JGLEctMMm7A,1569 -aiogram/methods/base.py,sha256=VH-3rKUGvNYoiQ9Tw78FujrzlJLs9smBhmI8ejx3-2Y,2734 -aiogram/methods/close.py,sha256=Bnzle__tO6tCMMLHkN1E00ypkrdQ0RjhkBNxhjDOq3k,593 -aiogram/methods/close_forum_topic.py,sha256=njPMjFb7CkLYbjEuNWPrSDh2HSpqlmO76B9Xs_Xahco,1475 -aiogram/methods/close_general_forum_topic.py,sha256=lLWx-ZgE4eV15D2yLXg1wWVECfcN7_1y2XA5vqr1d84,1223 -aiogram/methods/copy_message.py,sha256=jvPiwstYa8Lt0XNeI15_HyrwAvnPdgmi0KJZI3GuXOs,6109 -aiogram/methods/copy_messages.py,sha256=PbxTovACFr7NM8Te3iN2tq7VLLKvxGDzr_Gp8hrjukA,3293 -aiogram/methods/create_chat_invite_link.py,sha256=Snalw6e_zk5g5FI2wKB4Pr0qbGS1PbjIcq7567RC5YE,2545 -aiogram/methods/create_chat_subscription_invite_link.py,sha256=ulylrmNJXJa7hipKx7j_2wOeZSVgufPaW2h5JFO2OIw,2508 -aiogram/methods/create_forum_topic.py,sha256=FuJ8R-jkpfk7hPKe6pffiUQE21Hhh22G7cFMCFe5kok,2188 -aiogram/methods/create_invoice_link.py,sha256=PsgrJvP9W55DuTBmGut1puRNYQOuE6xvRHmblwv64lM,6655 -aiogram/methods/create_new_sticker_set.py,sha256=0LwiOVBGTo-sJLOd76Au3_G2-d6YtqFHfju6TU0A2vw,2928 -aiogram/methods/decline_chat_join_request.py,sha256=19Sj8OHe6erv3_E4p-Sw_y8XygNYOWrPI5S23CU5P1w,1281 -aiogram/methods/delete_chat_photo.py,sha256=0nrFbxWyO7R0pVMAWook7VRXAIU-AeEr_wpiFvyLssQ,1194 -aiogram/methods/delete_chat_sticker_set.py,sha256=KaRyvzLt1ystCbkptimtxqUM_4_RzpI7Sl91heSVlKc,1348 -aiogram/methods/delete_forum_topic.py,sha256=LrncMipGRW2Be4bYFzSYMjydvRijmPU5Owtmb61e374,1470 -aiogram/methods/delete_message.py,sha256=wCMd8oHwYETY1Nk2vP4DYhu-sdrm-LqhQBKPAgQQhSY,1956 -aiogram/methods/delete_messages.py,sha256=Hp9tfOVK4T9y3SuAAlfLo58_58CP83JWfpLnN3jkbiM,1401 -aiogram/methods/delete_my_commands.py,sha256=LiYVWXeqBxs_hUbq6pQ1h3zSKUyzw7ahdaXb1esAH8Q,2608 -aiogram/methods/delete_sticker_from_set.py,sha256=J2PsBRRTBks5TDlp4mlmubem7MSWKh8jzJMmLJQV9CI,944 -aiogram/methods/delete_sticker_set.py,sha256=csUT6RkdqmOy0K7vT2QXXR_YJfpQ78S31WYttFqEPY8,908 -aiogram/methods/delete_webhook.py,sha256=7kfmOOSlujfXV5JZEozbuQQzNrX5YV0f6nMvUo5aw_k,1155 -aiogram/methods/edit_chat_invite_link.py,sha256=N2RqH2DHbRK-zF97jtHlhMV2YykBgHgpqw_iDz8KQRw,2564 -aiogram/methods/edit_chat_subscription_invite_link.py,sha256=AvDlMClqa00KJnf4sXZkdOYGBErGtuwLMeHEM0AND5E,1610 -aiogram/methods/edit_forum_topic.py,sha256=hELFkBuB_6I3_y2xencOolPXPUjEK3xXCgfzC4lAuCA,2195 -aiogram/methods/edit_general_forum_topic.py,sha256=PK37qgJRVISQWhYAWlg3LNGmgneVdQxpJCa1dMiq_uY,1306 -aiogram/methods/edit_message_caption.py,sha256=wv-USNcfyHIjskv6PaSQAABE9yDK8lr9lgDS5yBfiVM,3995 -aiogram/methods/edit_message_live_location.py,sha256=akOy16TytMIR1ONYR8lu8W48HplUl9ugqW-tttrn2Zk,4205 -aiogram/methods/edit_message_media.py,sha256=fjDjBVQ6jbHoSDsxX3_19Q_TF-WzACaItS4gfdKtGuw,3529 -aiogram/methods/edit_message_reply_markup.py,sha256=H5elelToPCzLoOsGDDfOa7nXRQ10AMhxP13quMGRt1k,2658 -aiogram/methods/edit_message_text.py,sha256=IQPTgqWDn-xK5L7hjJ3FOhJqe8DJC9uRnnVWE-gmWcs,4345 -aiogram/methods/export_chat_invite_link.py,sha256=oC00_UAsmJ7icNtjmnCbQ9sYyJLoOujNJsLIRMyx9qg,1792 -aiogram/methods/forward_message.py,sha256=KM6v9CrqMnwC0YLgiIEVxTFBUmb5GhFfAMycrxY0IJ4,2655 -aiogram/methods/forward_messages.py,sha256=BIUEDoLp8jD5YglFN2pbHp6FtuhMFMB1VCSzMPhtOPs,2774 -aiogram/methods/get_business_connection.py,sha256=wJhKMcBoLcOXTxK1_xG8SR2h85e1sW1C4sWD6L6bTTM,1200 -aiogram/methods/get_chat.py,sha256=yOPjLV12HVZOk6ch2bUOfyrZBPIhyAXhhHEhiZKEdro,1145 -aiogram/methods/get_chat_administrators.py,sha256=uxzQWmNc0EJRJ-c0ecJmjLPWDOwlMD1KWDiOAnqofxs,1815 -aiogram/methods/get_chat_member.py,sha256=pltcJQL_aSljObA_XAVa9chzyC5saahC-jCA85U0Z_E,1857 -aiogram/methods/get_chat_member_count.py,sha256=phZ05LJUn3EAXBuH_7HqMFOuTg99nyVNjNEVWry1sto,1067 -aiogram/methods/get_chat_menu_button.py,sha256=Ko5U5PMvTP08x8SkCUddFASaGr-LbtP_4GhvbM-TP7c,1362 -aiogram/methods/get_custom_emoji_stickers.py,sha256=ob0rvnUFtuDlZ6GmNHlFZH2hNZNITf2k0mjBBvmeNY0,1201 -aiogram/methods/get_file.py,sha256=FutkpYaOz_xjdU_1FwGY75ZYZ-uqBCZapZBiE5K9sC0,1571 -aiogram/methods/get_forum_topic_icon_stickers.py,sha256=TUAX41OPjlluu3zxI-_lYCzBHzX-Wa_Fgde727H4llg,557 -aiogram/methods/get_game_high_scores.py,sha256=IhEZ81rRGOh_pkq54qGys0RGoywhTG7I5UdYikoVS8A,2156 -aiogram/methods/get_me.py,sha256=gA4vD-v3WYPpZaSTy6mpGZmsV5WXdSHv06EymV9ZQnU,439 -aiogram/methods/get_my_commands.py,sha256=67G3OlYrwZAnQZM8D2nQwNwEhPB1siDqOvMkc9saSgo,2464 -aiogram/methods/get_my_default_administrator_rights.py,sha256=dw1MnQACVfVsQeYs5ikZG1jThB15HR8Trv1xHg_oSLY,1359 -aiogram/methods/get_my_description.py,sha256=UzgJhr6sl4i4RD9LIYxvTx4z4V3cZMGQavCFucWwv1I,1156 -aiogram/methods/get_my_name.py,sha256=GGY2ZnZ_uXL5GqRKHJ2uXs5v_LUBqg6yx0NdrBLZoy8,1057 -aiogram/methods/get_my_short_description.py,sha256=yRQ0ertSdcbEy32FC07FAo12q7eyLEN04h0gkxzpmGE,1203 -aiogram/methods/get_star_transactions.py,sha256=kCp-vAuYCbogKN6PQ4_ulx4ByBatWbMwuXUTsMib22M,1374 -aiogram/methods/get_sticker_set.py,sha256=oh9jEInEgKDfOhAu58ex4rUYRCJCk-BTsOAvNa7GPMg,965 -aiogram/methods/get_updates.py,sha256=dMl44T18fGWKDG2ZK-GQ2OJu7PIYe3GJ93IzX26LXqs,3024 -aiogram/methods/get_user_chat_boosts.py,sha256=2HYUsuZMxrP-YdZO7S4rX0QItzjUN8H01mmwvm2SSkc,1255 -aiogram/methods/get_user_profile_photos.py,sha256=URseFqr69kRj4-gqNkSl4TsiEaAK78iAyjYrTv4tCpA,1507 -aiogram/methods/get_webhook_info.py,sha256=8h38GW1au2fAZau2qmXuOnmu-H6kIjXQEms3VKLJf5c,576 -aiogram/methods/hide_general_forum_topic.py,sha256=dKPkMB4okbduRG9K-Mah5hf6OsKzGg8NrtnTQdcVu78,1270 -aiogram/methods/leave_chat.py,sha256=m3F4mKwOmJaxk958rbBZqGIRcM7007JMce1S2zpEvPY,1063 -aiogram/methods/log_out.py,sha256=yBkCbabI7CRBkTHwhJ61KmqazMxiUuGRMhxlzl7BWB4,660 -aiogram/methods/pin_chat_message.py,sha256=njAbF_yEAZobt9b-0CqxblQpJ2M-jAgZHDpKdw_THAI,2143 -aiogram/methods/promote_chat_member.py,sha256=BDT9L1MIVTwWrmph-HUe0Rh7kKMPQt4bkMkICPiDfgE,5568 -aiogram/methods/refund_star_payment.py,sha256=s-eELWhpYoE8ubWNvlYc0dmPGCcBiATS0fU50IXXZ5g,1264 -aiogram/methods/reopen_forum_topic.py,sha256=TfJtX4zGVNYjjhivHRwBFV9sbWINhr8k_q5lXoLtITw,1480 -aiogram/methods/reopen_general_forum_topic.py,sha256=kxJtoOauJNWYxqesoT6qeDvXAJujUZvK-3QO5lnFEw8,1287 -aiogram/methods/replace_sticker_in_set.py,sha256=df80oQuwZsYrbmUixIPxtQ75iUqIMZXsiIyoMZHious,1858 -aiogram/methods/restrict_chat_member.py,sha256=KFAtkHVDqA4Ny4quy1jCnqH1mxf_5kSo8kDlA_ben4Q,2751 -aiogram/methods/revoke_chat_invite_link.py,sha256=RrIN4jcxTHaoThF0Dru3d4z7RGEQk0u0cTkNx13Do-s,1526 -aiogram/methods/send_animation.py,sha256=axQu7PxIUqpMtxCJH-7-5aUxzTl1UnUexDMkXXzRK3c,7678 -aiogram/methods/send_audio.py,sha256=6SrnsKd4smXuDLR3PfpgV9gf2TXBb42GtBxJGt6jeBY,7134 -aiogram/methods/send_chat_action.py,sha256=sOrGWv2bA9Przot-gPT1ksZ8UEhPpJeEsd7tPd-06gg,3187 -aiogram/methods/send_contact.py,sha256=zyup2lC1OQ94IXs1yW0Or4j8SaAqUe_a_AVTIE1rlJs,5053 -aiogram/methods/send_dice.py,sha256=v4j0-lETnu_rjj8oD3KdvOwMUh_IkXXcnWJW7jZmg-E,4823 -aiogram/methods/send_document.py,sha256=-ANAOHscFJhk3Y0LfmvAO_1_u3BUhEdBQ3YYafc5u64,6886 -aiogram/methods/send_game.py,sha256=gtcKxuwixa1N3JXOY8bLqCuvQ30QYrhi89VChwRTDmU,4243 -aiogram/methods/send_invoice.py,sha256=grSq2uQhWGWI4VLTCVBsuzbkrnrOkLAlBALUb8NLmbE,10135 -aiogram/methods/send_location.py,sha256=52UX5uvJBNfA80CEdmSEPTAmymurXXkYeEPXNitaY38,5851 -aiogram/methods/send_media_group.py,sha256=C67CTZUPPgqrDLGwP1mxzREridLXhBMpVKyfzL2wS-c,4430 -aiogram/methods/send_message.py,sha256=pMW81tP9p21i6iMo_KWYBhgy_uM2k_oa1_7kLQ81HN4,6112 -aiogram/methods/send_paid_media.py,sha256=Wf66l54kgMqWGTfMioVe0xdS-P3x2NQ4MpZkcHfson0,4658 -aiogram/methods/send_photo.py,sha256=2mN1S3ppYKaTzs6omllqGEZiRbd7Hx3XD5V1fxiOdwo,6492 -aiogram/methods/send_poll.py,sha256=_ATWrR7o6OeI8bllk83HRsG24-8w7TQzif3qpxFxYrs,8387 -aiogram/methods/send_sticker.py,sha256=mfqQAqLimwwNMhWwqokA7SQoNV17z1_cO-SiBBZFHAU,5284 -aiogram/methods/send_venue.py,sha256=rYIxNQbd_fZJybWLcFS4OmbE2EYvKrReqQyegMpNoxo,5820 -aiogram/methods/send_video.py,sha256=LfebSy4ucxxQi-euGGfTpXfLjWfn_AcCN7NkUh76tbk,7894 -aiogram/methods/send_video_note.py,sha256=dAXiWtv1hngrGQONybstfrC_Q29po0BpKHuVzGKx9I4,6038 -aiogram/methods/send_voice.py,sha256=Dk-oqbTfs_ZAHLpAyFgDlKd2sU0IVc8-8JAitlVNKRA,6282 -aiogram/methods/set_chat_administrator_custom_title.py,sha256=lOizk5Z8-tUh6EOiZ2hRyVSUrP2qQzDHlcKIbJCKgSg,1490 -aiogram/methods/set_chat_description.py,sha256=AvzTU_XRaTuI9s9iKX_hihCLpsH4F8du3dBQ-wrNZnU,1407 -aiogram/methods/set_chat_menu_button.py,sha256=5y8sOvgs6cH4sWBa_NuBnsRH7sE8ch0_s4YygG1PbZY,1622 -aiogram/methods/set_chat_permissions.py,sha256=x42Gmf910ycY0Nf5lCnM1Xe6z5bhjNqUMHA673X1J_A,2159 -aiogram/methods/set_chat_photo.py,sha256=kHjTl8U-i5B03KaFIEKxQnT8Sgl8CAa_F9kQeFUW_9M,1394 -aiogram/methods/set_chat_sticker_set.py,sha256=RFNtIcj8Lq8It6L6qoJLCk247RYVgGROdJM5UoF0HSQ,1571 -aiogram/methods/set_chat_title.py,sha256=X21F3pX37t3z13-4o6WJfQHKVfLPr8c_HGO-vNqI3k0,1275 -aiogram/methods/set_custom_emoji_sticker_set_thumbnail.py,sha256=E8zURRFNnJnjzxVnYchBta807eCrarjMzpKWp0R5Ypg,1309 -aiogram/methods/set_game_score.py,sha256=RDiYH61W1aN6WZoRLKI_vDQJz8-7V1I8tP__UbZLw1s,2626 -aiogram/methods/set_message_reaction.py,sha256=bEK822WDw3OqvO99WU3IV543yYI7tWpA-mIJVgv2rGg,2457 -aiogram/methods/set_my_commands.py,sha256=sjd1da-uPfDIH0OGTpuyZzBl8ARwbWPiMoAHenQc530,2803 -aiogram/methods/set_my_default_administrator_rights.py,sha256=DKX3KXLXbfv-heE5uJfPbcFXQRvNG6ps3ih1bQNa5RY,1750 -aiogram/methods/set_my_description.py,sha256=ww9IAjtC4X6Ti9cFlnE3dleZ_FKE6byjblGUYn2EqwI,1489 -aiogram/methods/set_my_name.py,sha256=xqSgEYS3Rgr2ETQlvBuD_VopBsuDX_DZY_MnbsOoJgs,1274 -aiogram/methods/set_my_short_description.py,sha256=ONiD6HfZxxnHRjPstEmuBqedjQVjZ-lSJPY14sTRPyc,1639 -aiogram/methods/set_passport_data_errors.py,sha256=Z4SjM_CHHzXw_SQ5TsIFXvsrI5GTrgx0xO0kKrtnE7c,2922 -aiogram/methods/set_sticker_emoji_list.py,sha256=rgUpD35X_QHAJmIbdgRBsXtF4p-wQcuRFFYmNBjDPpo,1201 -aiogram/methods/set_sticker_keywords.py,sha256=usS8uLY4YghFWwNyJnpG9C5X9eRQ1PzGWfIxSKhPTOg,1320 -aiogram/methods/set_sticker_mask_position.py,sha256=eoT5D9VmWuRNsUqyzrHlYWd_bVaK583o3hP_KsoevaI,1450 -aiogram/methods/set_sticker_position_in_set.py,sha256=QJI3x-tobyjpFoEThjcqGQLjXWdCZTd59ei49Gi2Mcg,1100 -aiogram/methods/set_sticker_set_thumbnail.py,sha256=l6hozWYpPQI-Y-QI2YxyXopG8ZXzGme-q2vdl4SUJvk,2891 -aiogram/methods/set_sticker_set_title.py,sha256=kf1H5K3capHR5wlu91DXmP6Q1G_TG_AEJeivppuM-58,1011 -aiogram/methods/set_webhook.py,sha256=5mPLVBDfSDbw2BEsSThw6wfErFTta_55UtyisYA4o1k,4476 -aiogram/methods/stop_message_live_location.py,sha256=ZvsRZ_qADXt3Oxxk8-6nvOAHT5b-yL2v4isAxNChE7M,2539 -aiogram/methods/stop_poll.py,sha256=xs5Bhzdwrny9CueVr1qfe6lOWjPqKoS8te9PYvpTZs4,1933 -aiogram/methods/unban_chat_member.py,sha256=kCOiIN03O3RZG4esxneAnt87-iC24TKqW4FeAOcBPCY,1919 -aiogram/methods/unban_chat_sender_chat.py,sha256=JwiCTYpl797vXH1iKEmHdvngNgmN3N5MzTM6Bd5QI3o,1376 -aiogram/methods/unhide_general_forum_topic.py,sha256=vDxVKNhnBifPmhBxDtIgEGq9DLw5U0E-HUPoIVOEL_I,1223 -aiogram/methods/unpin_all_chat_messages.py,sha256=1eYhMh4IsLV4x94XEC7oJkkFeiwe1LSpr_sj2ywyvUY,1303 -aiogram/methods/unpin_all_forum_topic_messages.py,sha256=RDUz0D8kSuayzY0DU0DVo6ez2dUH8VdqBmTSthCECCc,1489 -aiogram/methods/unpin_all_general_forum_topic_messages.py,sha256=O_PhZuwarHW9I2iFIHggOqgc7QfXtF1GEqZYweOH5PA,1248 -aiogram/methods/unpin_chat_message.py,sha256=9iiJcGt8sU1vYKKeMGpk7KgMvTXnLysywExpsjWckgs,1978 -aiogram/methods/upload_sticker_file.py,sha256=TgGArcP8fVpAOM7GRmpbk7GO3sKn2PfBEV--WOo0NKo,1951 -aiogram/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiogram/types/__init__.py,sha256=YUQNYA592qPfHdhV_Lv90St1aCXLaMYyzOm-QQhLcNw,18420 -aiogram/types/__pycache__/__init__.cpython-311.pyc,, -aiogram/types/__pycache__/animation.cpython-311.pyc,, -aiogram/types/__pycache__/audio.cpython-311.pyc,, -aiogram/types/__pycache__/background_fill.cpython-311.pyc,, -aiogram/types/__pycache__/background_fill_freeform_gradient.cpython-311.pyc,, -aiogram/types/__pycache__/background_fill_gradient.cpython-311.pyc,, -aiogram/types/__pycache__/background_fill_solid.cpython-311.pyc,, -aiogram/types/__pycache__/background_type.cpython-311.pyc,, -aiogram/types/__pycache__/background_type_chat_theme.cpython-311.pyc,, -aiogram/types/__pycache__/background_type_fill.cpython-311.pyc,, -aiogram/types/__pycache__/background_type_pattern.cpython-311.pyc,, -aiogram/types/__pycache__/background_type_wallpaper.cpython-311.pyc,, -aiogram/types/__pycache__/base.cpython-311.pyc,, -aiogram/types/__pycache__/birthdate.cpython-311.pyc,, -aiogram/types/__pycache__/bot_command.cpython-311.pyc,, -aiogram/types/__pycache__/bot_command_scope.cpython-311.pyc,, -aiogram/types/__pycache__/bot_command_scope_all_chat_administrators.cpython-311.pyc,, -aiogram/types/__pycache__/bot_command_scope_all_group_chats.cpython-311.pyc,, -aiogram/types/__pycache__/bot_command_scope_all_private_chats.cpython-311.pyc,, -aiogram/types/__pycache__/bot_command_scope_chat.cpython-311.pyc,, -aiogram/types/__pycache__/bot_command_scope_chat_administrators.cpython-311.pyc,, -aiogram/types/__pycache__/bot_command_scope_chat_member.cpython-311.pyc,, -aiogram/types/__pycache__/bot_command_scope_default.cpython-311.pyc,, -aiogram/types/__pycache__/bot_description.cpython-311.pyc,, -aiogram/types/__pycache__/bot_name.cpython-311.pyc,, -aiogram/types/__pycache__/bot_short_description.cpython-311.pyc,, -aiogram/types/__pycache__/business_connection.cpython-311.pyc,, -aiogram/types/__pycache__/business_intro.cpython-311.pyc,, -aiogram/types/__pycache__/business_location.cpython-311.pyc,, -aiogram/types/__pycache__/business_messages_deleted.cpython-311.pyc,, -aiogram/types/__pycache__/business_opening_hours.cpython-311.pyc,, -aiogram/types/__pycache__/business_opening_hours_interval.cpython-311.pyc,, -aiogram/types/__pycache__/callback_game.cpython-311.pyc,, -aiogram/types/__pycache__/callback_query.cpython-311.pyc,, -aiogram/types/__pycache__/chat.cpython-311.pyc,, -aiogram/types/__pycache__/chat_administrator_rights.cpython-311.pyc,, -aiogram/types/__pycache__/chat_background.cpython-311.pyc,, -aiogram/types/__pycache__/chat_boost.cpython-311.pyc,, -aiogram/types/__pycache__/chat_boost_added.cpython-311.pyc,, -aiogram/types/__pycache__/chat_boost_removed.cpython-311.pyc,, -aiogram/types/__pycache__/chat_boost_source.cpython-311.pyc,, -aiogram/types/__pycache__/chat_boost_source_gift_code.cpython-311.pyc,, -aiogram/types/__pycache__/chat_boost_source_giveaway.cpython-311.pyc,, -aiogram/types/__pycache__/chat_boost_source_premium.cpython-311.pyc,, -aiogram/types/__pycache__/chat_boost_updated.cpython-311.pyc,, -aiogram/types/__pycache__/chat_full_info.cpython-311.pyc,, -aiogram/types/__pycache__/chat_invite_link.cpython-311.pyc,, -aiogram/types/__pycache__/chat_join_request.cpython-311.pyc,, -aiogram/types/__pycache__/chat_location.cpython-311.pyc,, -aiogram/types/__pycache__/chat_member.cpython-311.pyc,, -aiogram/types/__pycache__/chat_member_administrator.cpython-311.pyc,, -aiogram/types/__pycache__/chat_member_banned.cpython-311.pyc,, -aiogram/types/__pycache__/chat_member_left.cpython-311.pyc,, -aiogram/types/__pycache__/chat_member_member.cpython-311.pyc,, -aiogram/types/__pycache__/chat_member_owner.cpython-311.pyc,, -aiogram/types/__pycache__/chat_member_restricted.cpython-311.pyc,, -aiogram/types/__pycache__/chat_member_updated.cpython-311.pyc,, -aiogram/types/__pycache__/chat_permissions.cpython-311.pyc,, -aiogram/types/__pycache__/chat_photo.cpython-311.pyc,, -aiogram/types/__pycache__/chat_shared.cpython-311.pyc,, -aiogram/types/__pycache__/chosen_inline_result.cpython-311.pyc,, -aiogram/types/__pycache__/contact.cpython-311.pyc,, -aiogram/types/__pycache__/custom.cpython-311.pyc,, -aiogram/types/__pycache__/dice.cpython-311.pyc,, -aiogram/types/__pycache__/document.cpython-311.pyc,, -aiogram/types/__pycache__/downloadable.cpython-311.pyc,, -aiogram/types/__pycache__/encrypted_credentials.cpython-311.pyc,, -aiogram/types/__pycache__/encrypted_passport_element.cpython-311.pyc,, -aiogram/types/__pycache__/error_event.cpython-311.pyc,, -aiogram/types/__pycache__/external_reply_info.cpython-311.pyc,, -aiogram/types/__pycache__/file.cpython-311.pyc,, -aiogram/types/__pycache__/force_reply.cpython-311.pyc,, -aiogram/types/__pycache__/forum_topic.cpython-311.pyc,, -aiogram/types/__pycache__/forum_topic_closed.cpython-311.pyc,, -aiogram/types/__pycache__/forum_topic_created.cpython-311.pyc,, -aiogram/types/__pycache__/forum_topic_edited.cpython-311.pyc,, -aiogram/types/__pycache__/forum_topic_reopened.cpython-311.pyc,, -aiogram/types/__pycache__/game.cpython-311.pyc,, -aiogram/types/__pycache__/game_high_score.cpython-311.pyc,, -aiogram/types/__pycache__/general_forum_topic_hidden.cpython-311.pyc,, -aiogram/types/__pycache__/general_forum_topic_unhidden.cpython-311.pyc,, -aiogram/types/__pycache__/giveaway.cpython-311.pyc,, -aiogram/types/__pycache__/giveaway_completed.cpython-311.pyc,, -aiogram/types/__pycache__/giveaway_created.cpython-311.pyc,, -aiogram/types/__pycache__/giveaway_winners.cpython-311.pyc,, -aiogram/types/__pycache__/inaccessible_message.cpython-311.pyc,, -aiogram/types/__pycache__/inline_keyboard_button.cpython-311.pyc,, -aiogram/types/__pycache__/inline_keyboard_markup.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_article.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_audio.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_cached_audio.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_cached_document.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_cached_gif.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_cached_mpeg4_gif.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_cached_photo.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_cached_sticker.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_cached_video.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_cached_voice.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_contact.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_document.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_game.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_gif.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_location.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_mpeg4_gif.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_photo.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_venue.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_video.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_result_voice.cpython-311.pyc,, -aiogram/types/__pycache__/inline_query_results_button.cpython-311.pyc,, -aiogram/types/__pycache__/input_contact_message_content.cpython-311.pyc,, -aiogram/types/__pycache__/input_file.cpython-311.pyc,, -aiogram/types/__pycache__/input_invoice_message_content.cpython-311.pyc,, -aiogram/types/__pycache__/input_location_message_content.cpython-311.pyc,, -aiogram/types/__pycache__/input_media.cpython-311.pyc,, -aiogram/types/__pycache__/input_media_animation.cpython-311.pyc,, -aiogram/types/__pycache__/input_media_audio.cpython-311.pyc,, -aiogram/types/__pycache__/input_media_document.cpython-311.pyc,, -aiogram/types/__pycache__/input_media_photo.cpython-311.pyc,, -aiogram/types/__pycache__/input_media_video.cpython-311.pyc,, -aiogram/types/__pycache__/input_message_content.cpython-311.pyc,, -aiogram/types/__pycache__/input_paid_media.cpython-311.pyc,, -aiogram/types/__pycache__/input_paid_media_photo.cpython-311.pyc,, -aiogram/types/__pycache__/input_paid_media_video.cpython-311.pyc,, -aiogram/types/__pycache__/input_poll_option.cpython-311.pyc,, -aiogram/types/__pycache__/input_sticker.cpython-311.pyc,, -aiogram/types/__pycache__/input_text_message_content.cpython-311.pyc,, -aiogram/types/__pycache__/input_venue_message_content.cpython-311.pyc,, -aiogram/types/__pycache__/invoice.cpython-311.pyc,, -aiogram/types/__pycache__/keyboard_button.cpython-311.pyc,, -aiogram/types/__pycache__/keyboard_button_poll_type.cpython-311.pyc,, -aiogram/types/__pycache__/keyboard_button_request_chat.cpython-311.pyc,, -aiogram/types/__pycache__/keyboard_button_request_user.cpython-311.pyc,, -aiogram/types/__pycache__/keyboard_button_request_users.cpython-311.pyc,, -aiogram/types/__pycache__/labeled_price.cpython-311.pyc,, -aiogram/types/__pycache__/link_preview_options.cpython-311.pyc,, -aiogram/types/__pycache__/location.cpython-311.pyc,, -aiogram/types/__pycache__/login_url.cpython-311.pyc,, -aiogram/types/__pycache__/mask_position.cpython-311.pyc,, -aiogram/types/__pycache__/maybe_inaccessible_message.cpython-311.pyc,, -aiogram/types/__pycache__/menu_button.cpython-311.pyc,, -aiogram/types/__pycache__/menu_button_commands.cpython-311.pyc,, -aiogram/types/__pycache__/menu_button_default.cpython-311.pyc,, -aiogram/types/__pycache__/menu_button_web_app.cpython-311.pyc,, -aiogram/types/__pycache__/message.cpython-311.pyc,, -aiogram/types/__pycache__/message_auto_delete_timer_changed.cpython-311.pyc,, -aiogram/types/__pycache__/message_entity.cpython-311.pyc,, -aiogram/types/__pycache__/message_id.cpython-311.pyc,, -aiogram/types/__pycache__/message_origin.cpython-311.pyc,, -aiogram/types/__pycache__/message_origin_channel.cpython-311.pyc,, -aiogram/types/__pycache__/message_origin_chat.cpython-311.pyc,, -aiogram/types/__pycache__/message_origin_hidden_user.cpython-311.pyc,, -aiogram/types/__pycache__/message_origin_user.cpython-311.pyc,, -aiogram/types/__pycache__/message_reaction_count_updated.cpython-311.pyc,, -aiogram/types/__pycache__/message_reaction_updated.cpython-311.pyc,, -aiogram/types/__pycache__/order_info.cpython-311.pyc,, -aiogram/types/__pycache__/paid_media.cpython-311.pyc,, -aiogram/types/__pycache__/paid_media_info.cpython-311.pyc,, -aiogram/types/__pycache__/paid_media_photo.cpython-311.pyc,, -aiogram/types/__pycache__/paid_media_preview.cpython-311.pyc,, -aiogram/types/__pycache__/paid_media_video.cpython-311.pyc,, -aiogram/types/__pycache__/passport_data.cpython-311.pyc,, -aiogram/types/__pycache__/passport_element_error.cpython-311.pyc,, -aiogram/types/__pycache__/passport_element_error_data_field.cpython-311.pyc,, -aiogram/types/__pycache__/passport_element_error_file.cpython-311.pyc,, -aiogram/types/__pycache__/passport_element_error_files.cpython-311.pyc,, -aiogram/types/__pycache__/passport_element_error_front_side.cpython-311.pyc,, -aiogram/types/__pycache__/passport_element_error_reverse_side.cpython-311.pyc,, -aiogram/types/__pycache__/passport_element_error_selfie.cpython-311.pyc,, -aiogram/types/__pycache__/passport_element_error_translation_file.cpython-311.pyc,, -aiogram/types/__pycache__/passport_element_error_translation_files.cpython-311.pyc,, -aiogram/types/__pycache__/passport_element_error_unspecified.cpython-311.pyc,, -aiogram/types/__pycache__/passport_file.cpython-311.pyc,, -aiogram/types/__pycache__/photo_size.cpython-311.pyc,, -aiogram/types/__pycache__/poll.cpython-311.pyc,, -aiogram/types/__pycache__/poll_answer.cpython-311.pyc,, -aiogram/types/__pycache__/poll_option.cpython-311.pyc,, -aiogram/types/__pycache__/pre_checkout_query.cpython-311.pyc,, -aiogram/types/__pycache__/proximity_alert_triggered.cpython-311.pyc,, -aiogram/types/__pycache__/reaction_count.cpython-311.pyc,, -aiogram/types/__pycache__/reaction_type.cpython-311.pyc,, -aiogram/types/__pycache__/reaction_type_custom_emoji.cpython-311.pyc,, -aiogram/types/__pycache__/reaction_type_emoji.cpython-311.pyc,, -aiogram/types/__pycache__/reaction_type_paid.cpython-311.pyc,, -aiogram/types/__pycache__/refunded_payment.cpython-311.pyc,, -aiogram/types/__pycache__/reply_keyboard_markup.cpython-311.pyc,, -aiogram/types/__pycache__/reply_keyboard_remove.cpython-311.pyc,, -aiogram/types/__pycache__/reply_parameters.cpython-311.pyc,, -aiogram/types/__pycache__/response_parameters.cpython-311.pyc,, -aiogram/types/__pycache__/revenue_withdrawal_state.cpython-311.pyc,, -aiogram/types/__pycache__/revenue_withdrawal_state_failed.cpython-311.pyc,, -aiogram/types/__pycache__/revenue_withdrawal_state_pending.cpython-311.pyc,, -aiogram/types/__pycache__/revenue_withdrawal_state_succeeded.cpython-311.pyc,, -aiogram/types/__pycache__/sent_web_app_message.cpython-311.pyc,, -aiogram/types/__pycache__/shared_user.cpython-311.pyc,, -aiogram/types/__pycache__/shipping_address.cpython-311.pyc,, -aiogram/types/__pycache__/shipping_option.cpython-311.pyc,, -aiogram/types/__pycache__/shipping_query.cpython-311.pyc,, -aiogram/types/__pycache__/star_transaction.cpython-311.pyc,, -aiogram/types/__pycache__/star_transactions.cpython-311.pyc,, -aiogram/types/__pycache__/sticker.cpython-311.pyc,, -aiogram/types/__pycache__/sticker_set.cpython-311.pyc,, -aiogram/types/__pycache__/story.cpython-311.pyc,, -aiogram/types/__pycache__/successful_payment.cpython-311.pyc,, -aiogram/types/__pycache__/switch_inline_query_chosen_chat.cpython-311.pyc,, -aiogram/types/__pycache__/text_quote.cpython-311.pyc,, -aiogram/types/__pycache__/transaction_partner.cpython-311.pyc,, -aiogram/types/__pycache__/transaction_partner_fragment.cpython-311.pyc,, -aiogram/types/__pycache__/transaction_partner_other.cpython-311.pyc,, -aiogram/types/__pycache__/transaction_partner_telegram_ads.cpython-311.pyc,, -aiogram/types/__pycache__/transaction_partner_user.cpython-311.pyc,, -aiogram/types/__pycache__/update.cpython-311.pyc,, -aiogram/types/__pycache__/user.cpython-311.pyc,, -aiogram/types/__pycache__/user_chat_boosts.cpython-311.pyc,, -aiogram/types/__pycache__/user_profile_photos.cpython-311.pyc,, -aiogram/types/__pycache__/user_shared.cpython-311.pyc,, -aiogram/types/__pycache__/users_shared.cpython-311.pyc,, -aiogram/types/__pycache__/venue.cpython-311.pyc,, -aiogram/types/__pycache__/video.cpython-311.pyc,, -aiogram/types/__pycache__/video_chat_ended.cpython-311.pyc,, -aiogram/types/__pycache__/video_chat_participants_invited.cpython-311.pyc,, -aiogram/types/__pycache__/video_chat_scheduled.cpython-311.pyc,, -aiogram/types/__pycache__/video_chat_started.cpython-311.pyc,, -aiogram/types/__pycache__/video_note.cpython-311.pyc,, -aiogram/types/__pycache__/voice.cpython-311.pyc,, -aiogram/types/__pycache__/web_app_data.cpython-311.pyc,, -aiogram/types/__pycache__/web_app_info.cpython-311.pyc,, -aiogram/types/__pycache__/webhook_info.cpython-311.pyc,, -aiogram/types/__pycache__/write_access_allowed.cpython-311.pyc,, -aiogram/types/animation.py,sha256=W9LGC1-JeWGolCU3OI1a3dXjtD5pCnaOd_J7ulWhau8,2673 -aiogram/types/audio.py,sha256=2WPtZmAQfW6ewCb6ozlcfXXZACQEX7c1MYTEVMAy9Lw,2823 -aiogram/types/background_fill.py,sha256=sJj85JGxTXOJVd_dq0jpgH5TbBPlvRKFNjk2CNoM5Bw,513 -aiogram/types/background_fill_freeform_gradient.py,sha256=R74cAjirD-pqisj3KiMKuQj5uALD7ZY5DagTNYZ18Xk,1207 -aiogram/types/background_fill_gradient.py,sha256=bSkNQPDrdWCrSIoCSBE3iFI3NaOAk2cktmLOFUbX2qA,1434 -aiogram/types/background_fill_solid.py,sha256=cL3N_tRhRdpM3rGYjHqh1c05Ys1_w5Sn5RVFX4Kzrhc,1022 -aiogram/types/background_type.py,sha256=_UKdw_LQfpR4z7W8wdtEmKV38EUlsSCheh0l4O0d90Y,540 -aiogram/types/background_type_chat_theme.py,sha256=1mylq_KCHfLYikVuv2FVNHTK-FivuOc3fIN16ThxGX0,1077 -aiogram/types/background_type_fill.py,sha256=P3mjIBc_oZspRCYLZvep1Tjx2F2r3Gz8QnK3ZhBRXr0,1656 -aiogram/types/background_type_pattern.py,sha256=7y5N7vxg4EauwCLqAf_7VjfYGcdDLWt5P2wieNZl9i4,2514 -aiogram/types/background_type_wallpaper.py,sha256=6uYeiZ4xQBTmJY0jCTeUFAj65Q872NZL7D2-WMeSLac,1868 -aiogram/types/base.py,sha256=ZAKfSk-DVyoBoYdyyZUTkoIKzuaj0kJS0ophsohsdI4,1762 -aiogram/types/birthdate.py,sha256=ev957uyU2tG4cRqQ838h8LHW0uIPFUu0TdC1YfL0mnY,1056 -aiogram/types/bot_command.py,sha256=rJuwZroECtHDZxhyv92K2vyTUlXdieXdCEhewEsIPk0,1017 -aiogram/types/bot_command_scope.py,sha256=rs7YoyRACVLm4tMMEQ01LM6ckWbF7o81edYEAnWXoyY,951 -aiogram/types/bot_command_scope_all_chat_administrators.py,sha256=3wvcWAh_yZADVbqPQD09kd1hyjmDL_KuoYR8us7A0jI,1311 -aiogram/types/bot_command_scope_all_group_chats.py,sha256=BElN12t3RwjYAFgo__K4PSUA5Mf0Vgzx6lzrhO1_kOY,1225 -aiogram/types/bot_command_scope_all_private_chats.py,sha256=1Ww3HUSSJINy4qNSqF5lybQJwWHpflhMM2So6EMplyg,1226 -aiogram/types/bot_command_scope_chat.py,sha256=chjf7klLRhCM8AB1xwkfkPfUXcw-_vnQekRVkiIB1Rs,1327 -aiogram/types/bot_command_scope_chat_administrators.py,sha256=ezkiv48UyMIlKyZXvmlmsLi9cop5pk6cZW6FLgFJr-E,1518 -aiogram/types/bot_command_scope_chat_member.py,sha256=IvFP2cemuZtMFdIn7T7hfo4o4-35_1ZBTOHV5pARCQI,1513 -aiogram/types/bot_command_scope_default.py,sha256=Aqa5eiFS2_2rd8S19i7qfBPIk8TNPVdOEOMR1oSPMuI,1270 -aiogram/types/bot_description.py,sha256=daKHDJ4d2c9j7wCTKwDLgbXy1HNrjbYkZkwC9D7FiPQ,781 -aiogram/types/bot_name.py,sha256=ut3sf9j5LYd2xki-_pZ1lnVvN7HOUr6v37llIi75j6w,717 -aiogram/types/bot_short_description.py,sha256=UdHLoRvp1hdhEg-W1XYUoDwPeCxvuU2H430JrNDiY4U,849 -aiogram/types/business_connection.py,sha256=B3LuYw0bZwli2E2d6L9CGE_Rm1IvnzpD0RyCmZWxljU,2056 -aiogram/types/business_intro.py,sha256=TTTNSlPX-bvzbDqKd-YzwXaUjgznpZxnBDGtAKpmSBc,1303 -aiogram/types/business_location.py,sha256=OHFm2V3jLoRWJdXS3ubflMjFGd2Wo6sMhMhvsHbJUUY,1103 -aiogram/types/business_messages_deleted.py,sha256=AZvMF6tTIcq1pRoY2lHE8VPNJ26l5lgaeXLZ0rwZEq0,1478 -aiogram/types/business_opening_hours.py,sha256=R0il4hXIel_WWaB0DZUR3lgd816IDxXZFwmEi04glSE,1282 -aiogram/types/business_opening_hours_interval.py,sha256=NFi-_QWLEN_0D1fPpqqp2TlrdWBJ71Rz7c4P-lSWj9Y,1329 -aiogram/types/callback_game.py,sha256=AF-WqkqFcC6nG_tKoNX1sRjRiKEstbEFJfLy4NPKtRQ,298 -aiogram/types/callback_query.py,sha256=JBnbrz0j0C6zK1eMeCgQ7l28ytKVxxkExVbwDsc2u4Y,6017 -aiogram/types/chat.py,sha256=LnnFHYcYdWkXZ3KNIedhnXpqbt_d_jDoan2fQdATNpA,64452 -aiogram/types/chat_administrator_rights.py,sha256=xwIgM6y2daN5FSYNJagmhBtgEy88S9GTSQk_OWgrykU,4578 -aiogram/types/chat_background.py,sha256=tGylRgxxa5pMDsuQFkG2XrY7mKQCsA9lc-BsaArwXEE,1400 -aiogram/types/chat_boost.py,sha256=iAbDstYKPATDpf9C0UTaeeipi1kcFedXhiTC6INxEuQ,1879 -aiogram/types/chat_boost_added.py,sha256=4WPPng6cqzhb0qpepGeu4mAoga2ieA2vmqIxWQR5n-A,811 -aiogram/types/chat_boost_removed.py,sha256=phu1WXsR6noLlEuiwyF1S0HzlwDmFsk2vwc9TRJ00K0,1768 -aiogram/types/chat_boost_source.py,sha256=-s9Um1lFg4ab2MiQpb1SpJlKM2hJHZkpM43TQE6GEMo,476 -aiogram/types/chat_boost_source_gift_code.py,sha256=VkPQktCIZdyI7wvhR-c7hgDs8lI2XySv_tCX1IJoFDc,1378 -aiogram/types/chat_boost_source_giveaway.py,sha256=ncM8YI0ra6Jb_cDeOFFfm1l0sDwaZT4TNVGbFbas6Zo,1976 -aiogram/types/chat_boost_source_premium.py,sha256=nN3o9Kvt5JHXcp1RpYq1WDX8Szzn9so1-FgGR1Olf38,1278 -aiogram/types/chat_boost_updated.py,sha256=L0LKL6jutsHYPbCDQoXHaZVjIS5y7uIDXlacKNIFvE0,1002 -aiogram/types/chat_full_info.py,sha256=gYA2B-STpK5Iz3sGxlKYBdJ1tDJNNC_LgJbJGI47dlY,13713 -aiogram/types/chat_invite_link.py,sha256=BBsofu3IJb7dpZvZHnZNStaaVWYhb8Bn9AhMq6jc_d4,2638 -aiogram/types/chat_join_request.py,sha256=IeM2JRKIMVyVBXA1309TLoNuBo-ExjIbkNJL53YUYeU,171076 -aiogram/types/chat_location.py,sha256=qZUA9NnQBDCHRLvKDP1Oo0wDX5T5tw-j14-NX8tlXSM,1062 -aiogram/types/chat_member.py,sha256=sq0RhcwghiW4Gy9XJTskFA3dHxaol5EA5Oify1QJfz4,722 -aiogram/types/chat_member_administrator.py,sha256=d7se9Lm1AWDuZRNYGbK3ZLC2NkZVkSzegziJ0Lx66Qc,5453 -aiogram/types/chat_member_banned.py,sha256=bvvMSTPn4iNy6N5nGoPYoxR3pjqDZhFFqvGC_Jb1T3M,1500 -aiogram/types/chat_member_left.py,sha256=YhW1LjLUG5TDTARmj44DaJ0OyX2Gm8CW9-K6EA7LYgI,1254 -aiogram/types/chat_member_member.py,sha256=2AtZsJz3aICbn2eqCmG1p0UsBYSqlNLmN-wnqnC6uks,1482 -aiogram/types/chat_member_owner.py,sha256=2gV3f1ubns_eORZjJocWSuwH8IW_cv2j2I0MuHbVa68,1676 -aiogram/types/chat_member_restricted.py,sha256=7F40ERHf29ihfrB4tTc9JWL5w5xRBjqVLGoMWMgyWlg,4545 -aiogram/types/chat_member_updated.py,sha256=AS5_q6EXSBL2Wuy6lQXzn7gaXUPGZJWOWgGK1GCvx2c,87547 -aiogram/types/chat_permissions.py,sha256=A6I6DuCQGRWBqhQuVe8xMnRkd9i0iD7gOZm6Qg7m0LY,4382 -aiogram/types/chat_photo.py,sha256=BouKO-6NIn5d17fB9acX9iAbv_gjYzbeKuTqN3BcFD4,1872 -aiogram/types/chat_shared.py,sha256=O6taLjKlBX-z15XYZ6Hcp9SsUCYhBa9Sz7hKzAvi2as,2260 -aiogram/types/chosen_inline_result.py,sha256=VFMo9FklvYjWrPbwrxeIyHrDwLlRvnFObUV5EhaannU,2399 -aiogram/types/contact.py,sha256=jWvv9gc-4LyFyBLeAeucyr7A8yjBk7-sJQH10NKoydU,1848 -aiogram/types/custom.py,sha256=3Xqsx2Llx47Hu1v4hGEFOjbMzkgkdQ9lmKW87Atulp4,819 -aiogram/types/dice.py,sha256=QOFOqUx3jqVtqU_nwuWhhSthy5CBR_mNTMuIpwiD2KY,1165 -aiogram/types/document.py,sha256=6tKzYSPyON6BoWLn3F3tiXHUxaQNG1YNl6kC6bO-0ZE,2425 -aiogram/types/downloadable.py,sha256=FbRdIM3Cpw3tcDzZvwy__u98aSKqMMJn2kKh9mK62B0,77 -aiogram/types/encrypted_credentials.py,sha256=1ZC-Q3c84mEVZGEK_cXTkqzX4FzBujn0_necxJ1uSPc,1521 -aiogram/types/encrypted_passport_element.py,sha256=9RmD1xbkrWw-DFb8QCUCWENswXBKklGqy0G3SX_TB78,4733 -aiogram/types/error_event.py,sha256=m0QrLksRJ0-x0q5xpb6iyI4rqPfiz3XJom_Gh75CJ-8,714 -aiogram/types/external_reply_info.py,sha256=aYYuCYyyz5DL3zhDgdECSkdvf6HyiiHSTN61dyVMGmU,7185 -aiogram/types/file.py,sha256=52bE-c7RjZmTdXk8ij8PJ5fsx2-1IfgedM763PmzGnQ,2166 -aiogram/types/force_reply.py,sha256=YkTteaPMOUH544hl9h6VDypMxyiLIKFd9KXryouTmVM,3024 -aiogram/types/forum_topic.py,sha256=CchPMME1NgB8WT9FWLgQ5mYZ7uXFG2yuTmDMaDZ6kcU,1422 -aiogram/types/forum_topic_closed.py,sha256=aw1K6fIadwJtSTZnyTQq3xtEf7920vodFjK5lHeKVgs,309 -aiogram/types/forum_topic_created.py,sha256=OPYpne_Zz5tdOpzjYOXGplCxLhF1aeKnHFzpn3qXIRg,1321 -aiogram/types/forum_topic_edited.py,sha256=Fq8QDirNBsymOKbAxBYnFqhmXL52XuqKAQrLxePRyA8,1230 -aiogram/types/forum_topic_reopened.py,sha256=MloV3nhDpHSLe5VoVgmC99u7ch3IYahIHH2EokGCWgY,315 -aiogram/types/game.py,sha256=AUnwPfixbvWpzxfoHziedT7WJtoF02vxBNz791j0fro,2365 -aiogram/types/game_high_score.py,sha256=rwCyO24y4BkcTJSmoLPA7pGEsgfA6-_3i40uvCgxp6k,1203 -aiogram/types/general_forum_topic_hidden.py,sha256=QC3u0Qpt3nptdhl3dxqgNXVrptwSAdnEzI-OWP8QMMw,301 -aiogram/types/general_forum_topic_unhidden.py,sha256=W8HRGyB81eyooaucgD0ojeAzywD8AjnMnUf2hf7r5Nk,307 -aiogram/types/giveaway.py,sha256=N5k2AXEdBRKRaHfDbYl_YuRGARaIAiOP1S49cAkGgc4,3042 -aiogram/types/giveaway_completed.py,sha256=m6QrBVrfT5s2W4mt-LoJwvHodkV7eIc112HOHLf9Z3k,1515 -aiogram/types/giveaway_created.py,sha256=6HYs2dBo4V6OBZpfoOAB7CxlMZQB_jPb01rEAw3RLe8,275 -aiogram/types/giveaway_winners.py,sha256=t2b4tX6twU0wlOEJLvrTbD_PB2pAcL3LDSycXhvQNw0,3321 -aiogram/types/inaccessible_message.py,sha256=Wn3WocufH3a8g0BE0S0TIK1pUQrt3NQBPAm-_9HhjSs,1288 -aiogram/types/inline_keyboard_button.py,sha256=1AwstgKnWwqrt0dI57_bMZNQWXAuEP74gxpYtHKN024,4769 -aiogram/types/inline_keyboard_markup.py,sha256=b6dxsxzM93LZyG41mXHPX4JKyKlPr3bqc-8s4zuUCpk,1273 -aiogram/types/inline_query.py,sha256=XCXCRESvVpbepiIYiJLcF48rc35K8sKrmeFw8iciLf4,7410 -aiogram/types/inline_query_result.py,sha256=8Ve8Fe1Yf6O7NHWCYdTVIgnbawI6hIo5B0l2cV5ZN20,2189 -aiogram/types/inline_query_result_article.py,sha256=Keq9BuANquPGxWDw9D8Yra7_vNDSvYSRfqK5Ml9e9yE,3759 -aiogram/types/inline_query_result_audio.py,sha256=6r3mHQQ4tA0kouOznWvE4izEJ9NarZBP-40-BOdn0Mo,4367 -aiogram/types/inline_query_result_cached_audio.py,sha256=7oYplK6rrWZrDAcXQqZvpnKOW_Kuj1vQ1oa3sqj-VcQ,4018 -aiogram/types/inline_query_result_cached_document.py,sha256=qvNPpMWQfJ-i_SCLDIHWDvuuRqFqYLuxqdLuaVq0_Nk,4360 -aiogram/types/inline_query_result_cached_gif.py,sha256=Mawa0gyeGd4-MSjVAJ1Pm62pBSakp9SpvOsGXOhpQ7Q,4601 -aiogram/types/inline_query_result_cached_mpeg4_gif.py,sha256=UtOhg-YOQPO3H3JkJZeZcUloxXgDmoaHHOBOg6x-GO0,4699 -aiogram/types/inline_query_result_cached_photo.py,sha256=LQPdR2UW9hvnz68YOziipLaajVqCPzVzK8yhjHJZSxc,4769 -aiogram/types/inline_query_result_cached_sticker.py,sha256=hqZ8ZvEv0jA0rf7WDVa4SVkaX5khDncpdSPoH5LWEcU,3100 -aiogram/types/inline_query_result_cached_video.py,sha256=Uyr7rlAZO4djHXnhfyoEItN_Mu30W8NkooZICLN8LKk,4739 -aiogram/types/inline_query_result_cached_voice.py,sha256=kvsqjskDe_Aor7WZvrijUsfZnJdum-krGxMwYl4GEGQ,4144 -aiogram/types/inline_query_result_contact.py,sha256=vAmYCE49k7pWHNA-1-L0p7pD2TljNdzitFgsE_hrYDI,4111 -aiogram/types/inline_query_result_document.py,sha256=yYEqSbiWqW3zDl2xX7WNcf2oraOu8zp7hr1BIqLrUeo,5047 -aiogram/types/inline_query_result_game.py,sha256=9t2HzFgVgHjPW_pQZ4YBTeGptSbn9KOHcGsbEPpUwzQ,1758 -aiogram/types/inline_query_result_gif.py,sha256=MNmFu5R4Jz1MbiDoznpsI7GBdy7-BB83QhVnF16HyhM,5577 -aiogram/types/inline_query_result_location.py,sha256=FX_eYlVfcRkcTTxubrTu1m3jGFWbgLEyg0R0TFp3ybY,4961 -aiogram/types/inline_query_result_mpeg4_gif.py,sha256=uL9AGdWYTaUJf3mM1v4iR-An8ZtWt-8XVpZY03vmZRI,5645 -aiogram/types/inline_query_result_photo.py,sha256=zWHeeIKMYQWHYzdIg9li93ziZ8acH9m-MSDmOLAiJA4,5245 -aiogram/types/inline_query_result_venue.py,sha256=pln1TVUl5cLvgxTxR1PEYLA7K69L9ZGAGxR_YQ0eQyY,4904 -aiogram/types/inline_query_result_video.py,sha256=9u6L-4nZVtUspl4nomPe3d0AuQHDv7EA3H1CmZQaJs8,5842 -aiogram/types/inline_query_result_voice.py,sha256=LUGfZZgL66NH6wppO9kpVnBoiCbC_zV6SBV3PBIBQJQ,4310 -aiogram/types/inline_query_results_button.py,sha256=mcDUu9wvU35tBvH1BhICorSlJ25XUVbpJlh9BWE3HNQ,1878 -aiogram/types/input_contact_message_content.py,sha256=GR2RDpizrX7rlxjf05CKzRT3zmLEO1yJSpqbmxCLwQA,1599 -aiogram/types/input_file.py,sha256=oCElYrCtJgfP5_ck0MQxvGppVZyXW5BnsHcmSg1Ds1o,4672 -aiogram/types/input_invoice_message_content.py,sha256=L4QePd9Bw7Mqy9L6vFTLL6iRsyJDB-YfOGfKNfVs24k,6899 -aiogram/types/input_location_message_content.py,sha256=UmmTHtSm-0MbIp2pISbl6FoPo9rjKeBK0pKzKg66GvE,2374 -aiogram/types/input_media.py,sha256=2nTD1Wg9VX8x74KTAf2d6OjjGTwPTUXaQL5Ty5TxvYQ,619 -aiogram/types/input_media_animation.py,sha256=BLpBBGSBzSRKpG-K7mQwguiof4cR58ElSNPwH9PdefQ,4373 -aiogram/types/input_media_audio.py,sha256=615pBywXCgGPIoeiqGep4D8SiMwTa83kmhasp0qqgHE,3706 -aiogram/types/input_media_document.py,sha256=2Z89Foqhnh3LviuiMcaU9rWg2kCVPQdNMvL_KrGckFM,3628 -aiogram/types/input_media_photo.py,sha256=QGqJC6qCGyEzbBLHsX8vw6pbnsk3l7eYA8AKmKA6WY4,3127 -aiogram/types/input_media_video.py,sha256=Yugn-j1NmMjMFP7ztI8XQMJVDZ_2KV_xJYdOCFSBk2I,4509 -aiogram/types/input_message_content.py,sha256=wj0C4RyiLpVP4yz0LmmO4qMNNIwRMihjnoMrjBSxjDE,793 -aiogram/types/input_paid_media.py,sha256=z-STAz_0G590-eFlOYNTv_HP1LOWbACXM0XMYbEBXrg,380 -aiogram/types/input_paid_media_photo.py,sha256=AHnkA6yvhhxdt_ffpCplgOxtqeh0YiDZ0WjVYj0boSA,1498 -aiogram/types/input_paid_media_video.py,sha256=nKQwP5BtYARot0LjkAr-EOa7UfbL8DwtFqexwoTNIY4,2977 -aiogram/types/input_poll_option.py,sha256=ky4L3A9Z2PuNTJL-WxMJ3o2zysphXaV2OukDdhXrLM4,1791 -aiogram/types/input_sticker.py,sha256=8smkhrtpZraqVrA_v87UuO4uNqzK_9bvPPVvDRrmCuY,2438 -aiogram/types/input_text_message_content.py,sha256=Er1EsUzQKV_p-spafMGNKL1saWlvvOmu4IBqFk03BaA,2720 -aiogram/types/input_venue_message_content.py,sha256=CZsCPYQrFdP_BrYBzNJ_Ik39PlJ1VLOsvI5q9vRS0Ns,2411 -aiogram/types/invoice.py,sha256=gOiw5G9yXJ8ZkAVupt2ww-mcooYanTix6t7KarSni9Y,1932 -aiogram/types/keyboard_button.py,sha256=L0cHsJEsKQziqK3zJN6laQL9drC36AhbhMOG20vhzcE,4352 -aiogram/types/keyboard_button_poll_type.py,sha256=tPGlW_jRXaDxZML1_vK080sp6BO86DO5cbBP-TEOf4Q,1153 -aiogram/types/keyboard_button_request_chat.py,sha256=N8UBPPlrQ07OSCO-33mfP5lKJ744sugaS86dYWpxMRQ,4448 -aiogram/types/keyboard_button_request_user.py,sha256=89efkQPnTYrtpBozhTvXp00YE8uKqgJInVUafJV7nkI,1990 -aiogram/types/keyboard_button_request_users.py,sha256=bhj4_scIdCcKxWeuC8f8guU_tcWTvwrbISe_PycG-XE,2747 -aiogram/types/labeled_price.py,sha256=7kRZPTy8HgJG4FYrix21xGfhgT_u93fROUBOj1wB4Rk,1330 -aiogram/types/link_preview_options.py,sha256=xv8Z-qE_NBfojELQHSlgegmsXso661AL8562z8i0dls,2747 -aiogram/types/location.py,sha256=0X9SBlANNn_ODEByFE0oDiJxpKtGEQ6OI6fDXB_1loA,2115 -aiogram/types/login_url.py,sha256=VxZTVG1LbmKeon_spDg17HJiPh1l1buOI5eFBNLu1Rk,2771 -aiogram/types/mask_position.py,sha256=ZH0pNJ8u4Xlos2MwCtsnSzMNfhgGvacCGdJ42qFp9no,1627 -aiogram/types/maybe_inaccessible_message.py,sha256=TbxUHEoW88w4nWer6zhQhWaAjTqr2Xi3H9-ZJRfvA9Q,388 -aiogram/types/menu_button.py,sha256=4Q2I_AlbnRe2fQ0f1a-LNl0toGOHI73ehjhMQmLngV4,2103 -aiogram/types/menu_button_commands.py,sha256=NMmH1S0jcEivjXmzRfMTLJAO4UBKVhFuo8wS4ONgZwc,1038 -aiogram/types/menu_button_default.py,sha256=FnjUz1-aXR3-0oHPv0pNU5yi1M86wnzwCbNnzEMu094,1027 -aiogram/types/menu_button_web_app.py,sha256=G-yWLPg91mgaMP672VRj6xmB8_UqDpMeH2iePvY0rw0,1715 -aiogram/types/message.py,sha256=AlHRfaN9KyEJjT887Jv6P52WLaMZvOKx_SgBEMcP7eM,240867 -aiogram/types/message_auto_delete_timer_changed.py,sha256=D9GoK5tOtxWTksB_yaIKthfiHWJhOI6SUBWWpW_PRTY,1020 -aiogram/types/message_entity.py,sha256=q_dWKJhMNVg8zGzIUy40b0viRNnBaZSPT_7ySANbwDw,3287 -aiogram/types/message_id.py,sha256=4I7m_laQsIwLiTOVG3B59BJLvlzGTkf0gai9aazqs0I,805 -aiogram/types/message_origin.py,sha256=uSs6n9q5JhIzaV42ldMJJL_8nAx_aCQ3xNqrRVMJsWg,518 -aiogram/types/message_origin_channel.py,sha256=tgCfiuS81A0oWD9EY90F0P3B9s-Avsm0FJlw5ra8umA,1795 -aiogram/types/message_origin_chat.py,sha256=_EE8lVR8Kp745dHTlT1zHYXEDImbGhq_nuZgteu9lbc,1725 -aiogram/types/message_origin_hidden_user.py,sha256=N8WXMNcBlWSuDMRYUxsUiZubnOxsDFOr7GyYQKRrij4,1377 -aiogram/types/message_origin_user.py,sha256=FTu0wnkg8AElOQtMjy2Ee-ApL2eX57a5qMrudWMWf90,1349 -aiogram/types/message_reaction_count_updated.py,sha256=TKCPGGl2hKGFg4hizjdclB8hMzLjDsVP_48-uk_pKmI,1521 -aiogram/types/message_reaction_updated.py,sha256=_-QSyiZFNlEy9s-aZp61AFq8yRUT3Kp_T1x7SDbKv34,2616 -aiogram/types/order_info.py,sha256=ECWERhAIl3kkclMOwnNN9NHGQLUtW0B6oElkLubPPr4,1516 -aiogram/types/paid_media.py,sha256=gw3vvGNuZugsvlWpqxuZs1Q81ALL9MTZ6RVP5EFMbmk,399 -aiogram/types/paid_media_info.py,sha256=vCXLSVj5f9BHeI5t60EWllCMZykOtWFaVOglXZQKzC0,1327 -aiogram/types/paid_media_photo.py,sha256=uRakDZNVUOHpvLoxMPxI0eKdfp1_x-hs1KEMvDriSEc,1130 -aiogram/types/paid_media_preview.py,sha256=9ZIG6wR-De8VPU2y5Rn77czZFOdLcW_JxKXQeYsiycw,1522 -aiogram/types/paid_media_video.py,sha256=afHhTgBEXuyms9V1FaGqJutjveZeHjESmYvav3D3_ck,1095 -aiogram/types/passport_data.py,sha256=PT4TKdMo9drK6LeK_FgGS98wE8c-kCwHkB7HcjthguQ,1318 -aiogram/types/passport_element_error.py,sha256=0MooyVK2Yoz-6MTnBDqbyiR9o-cYM5GoM6HC-p6X9jQ,1214 -aiogram/types/passport_element_error_data_field.py,sha256=NQXIJOOjXP56vbMTgKl2z9QqTs7FyHlxURO2xSOMQI0,1850 -aiogram/types/passport_element_error_file.py,sha256=tlUpJBAJFPUzHnCgd07gIS1c_HvFXFTpQWlB6Kipo_w,1619 -aiogram/types/passport_element_error_files.py,sha256=UKY3feWaWnV7E0gVs2nTys43bbYmB-C3flQ2j0DbAdg,1734 -aiogram/types/passport_element_error_front_side.py,sha256=669dn7UWwY4GnNnmaUBipHj8U22PahkJFmzLVerAGXk,1721 -aiogram/types/passport_element_error_reverse_side.py,sha256=ZVfTzKDmrZqzwcOBNuzsSwfEUip8hHCzeRk2jyiWDak,1704 -aiogram/types/passport_element_error_selfie.py,sha256=KR-TG1DguG1w9Kv1rIJRf7qkI_L7euSwr9h5IC8DAJU,1623 -aiogram/types/passport_element_error_translation_file.py,sha256=Zm4DzT7yQoHHdANCgq0uW6kmskULr56hwjv0GFPWTGI,1843 -aiogram/types/passport_element_error_translation_files.py,sha256=I_i-u15lAHxpCzhzj7Iiu8aTdbwyhQJfGeYp9p3woIs,1952 -aiogram/types/passport_element_error_unspecified.py,sha256=KqvSPstDlkcEJRDA-JkFX5JK97uO9R4Nqx_Sbp5iW4Q,1651 -aiogram/types/passport_file.py,sha256=tN7IbA6M4Zk6WH4CpVeI0exfi_UKoKOUiz1iT1e1epo,1599 -aiogram/types/photo_size.py,sha256=J1rOX1QxScCjA0LPm4KgdLZBpsAQfscAaDfuocE4cC0,1664 -aiogram/types/poll.py,sha256=dgCODf8MlNQKh74LfWuwfdOXli-N55kqwRWS3wl1pcg,3737 -aiogram/types/poll_answer.py,sha256=HZoZQ4SiytyywLPa3ACX617QJ4zy3REXG_puRmtJdww,1614 -aiogram/types/poll_option.py,sha256=KhsgOD64wZu2RCD6F6gsuT9z-5RKnOWMOFs-Cjwdnh4,1445 -aiogram/types/pre_checkout_query.py,sha256=CaYsF1zvPb1k5cgka1GC12VMS3eZc3RWVba7VmRr6L4,4410 -aiogram/types/proximity_alert_triggered.py,sha256=b2zF9r0sjf-cp6Gj-pyTIJq9x5a_JBjdp-DseDGpM_0,1253 -aiogram/types/reaction_count.py,sha256=wmMH5iR_tOJ3ieSezjBzRCPQyt7RhH3Lbw8emodaxqE,1332 -aiogram/types/reaction_type.py,sha256=EBHvWnPblOe2T6ey0_V9m6vReAX8VcHX4wuzKLVMR0w,442 -aiogram/types/reaction_type_custom_emoji.py,sha256=dzZSLhEtBke35GtTgfSxrijMu9jQzob6drdFkYReR7w,1150 -aiogram/types/reaction_type_emoji.py,sha256=F5WoRrUm9tOV3YJVNh8quD4D2OfsU53Y-mbqggbnm-w,1682 -aiogram/types/reaction_type_paid.py,sha256=zXzhLH6g8HeyIOO1dhsZwG4_Mh52Yw5sC5mucpffnTY,854 -aiogram/types/refunded_payment.py,sha256=yaj69LD-j7ffwtTk69ozl0MXz3r2kUlBTgOuWEqvxto,2180 -aiogram/types/reply_keyboard_markup.py,sha256=Ey04kT-CDRoFk4Ofqe-U6-SUi_SYaXtYQ72NqzNwgq4,3373 -aiogram/types/reply_keyboard_remove.py,sha256=vt2LTPCyoNO1SzO7JLJAUTLxfcyVh5eVKTkFmjQVvag,2093 -aiogram/types/reply_parameters.py,sha256=2DWrO4V2Vxdc42OnEuHjfLS60PaNO01rtcvlt-H4aCY,3502 -aiogram/types/response_parameters.py,sha256=qPu3C079bJZRdUIQwr-r9WIcW6yYW7rdWJlraZQbw-M,1550 -aiogram/types/revenue_withdrawal_state.py,sha256=rUzcoQ2Nbmm-2EwkoD-g_xWUp9o3mIsthyE2ZWrg0ZY,585 -aiogram/types/revenue_withdrawal_state_failed.py,sha256=uhCBqAV8SpbCkL364ygkvGg7TzarISQ6NniBeHvn3HE,1133 -aiogram/types/revenue_withdrawal_state_pending.py,sha256=rVieabsj2ayXpzN7yW8uGN-8p6Qy_lQyrKYFSKH5qmw,1115 -aiogram/types/revenue_withdrawal_state_succeeded.py,sha256=d2cBJbxXEPhtSLWb-TzyDy-iumMWkG7G6LWNRBmH7oI,1409 -aiogram/types/sent_web_app_message.py,sha256=1p2Xr_3czwPbZd8PpylTSo31ZgeAEBLnlnlRcBY31xc,1168 -aiogram/types/shared_user.py,sha256=L_PyLNJ0I75E9OykdQA5Nk5j56QjmwEgD8jPIYxFGYA,2340 -aiogram/types/shipping_address.py,sha256=9JTEnZoNaPa-T1p_YolL1ErIGWJol8lAU4F8ycsQ8ZY,1550 -aiogram/types/shipping_option.py,sha256=5jI1LADtNbe2oZC0a2G3f7Fh6J8CZ0wfCBqVFOUlqIw,1098 -aiogram/types/shipping_query.py,sha256=22pK3KfuxTTkZm-GFxrgphBmldqT4iIifVY-6vmF-qk,3458 -aiogram/types/star_transaction.py,sha256=zGrNLgJeDuv4AWfr8tiCWLHM_KgNO-d9rYiiaiUe8A8,3087 -aiogram/types/star_transactions.py,sha256=n4NDZK71RgvVbuiCAzdjKBc5p6PyezzYQFjJkiewunw,954 -aiogram/types/sticker.py,sha256=Tcz8iqKzCbfvP7MdV3NVwUEt9u27EmB7_R-N_BxSd6M,5902 -aiogram/types/sticker_set.py,sha256=OGKkpMzsQxRcuAGLt9ZJOaLwv9IKndmTaaKl5fyiNLo,2388 -aiogram/types/story.py,sha256=2Bm9ZHpfr4_yeBPWFgwnqTs-y4xFgKqW8NLRVWzMdqM,884 -aiogram/types/successful_payment.py,sha256=nNUteKAYhz_PI3EuoDkd8zX1dDal_NLMSy08fnwjC98,2574 -aiogram/types/switch_inline_query_chosen_chat.py,sha256=KH9p_x5aY6XxQn71LRa92cVQMl8glZKdc2m2935i_Yo,2002 -aiogram/types/text_quote.py,sha256=2bmMetBcRCIUu5GPlGUC8IpRLqPEAOmirvpsmzOPrrA,1863 -aiogram/types/transaction_partner.py,sha256=WtOmiGbZhHF_1vidNsULzjypaypxdHfif3nGcOwNIjg,625 -aiogram/types/transaction_partner_fragment.py,sha256=sHfiApYXz8E4Jr40pb0szs4b94aAp0UTE6UGQ1xFFdo,1962 -aiogram/types/transaction_partner_other.py,sha256=iHViDYZ62dQS3z6k1YkMOqFELyBM4wpAkGzRlif-_xw,1104 -aiogram/types/transaction_partner_telegram_ads.py,sha256=QmVjyRZUGNTpxRIFZF4F_pAPj9i4224E1PsnA9GS8YU,1185 -aiogram/types/transaction_partner_user.py,sha256=rslWGfJ7C-ptPRXACLyB3vxrbDyu1yd9LJX0pTNiLV8,1979 -aiogram/types/update.py,sha256=5FVm6IcFT8INyU3GPNVBxL0s3-g7cJpeO3vUUogzoo4,11481 -aiogram/types/user.py,sha256=DW0Xg1Lld2oB5wwOZtBIJggt-WiNLKOY-4HHSpU_t1k,6001 -aiogram/types/user_chat_boosts.py,sha256=Qpvrxc-BGYuyKbC8kLIrmQqNpfYi3jXXYY_234NWb0M,946 -aiogram/types/user_profile_photos.py,sha256=VKpZMznwuIUQ4sWxjDgNv3tSr6AW2fwG4AIwgztwL-w,1124 -aiogram/types/user_shared.py,sha256=1yGKAO67fshHSOCtVl3dO_oD1-VOyzPBC4Ak-hflMOQ,1534 -aiogram/types/users_shared.py,sha256=Fdjww27YYlWMVzYOhpBp54RL_N_Zh7_meWgpqBxfkjQ,1986 -aiogram/types/venue.py,sha256=wEmGfGAiqdhDhTskRoxOKiNVliUaPpPOxBmohfDlL5I,2147 -aiogram/types/video.py,sha256=e-uI5iQSKAdhPK-vVz5kiQCIV22kaxmylzN8gzmtwnk,2575 -aiogram/types/video_chat_ended.py,sha256=eL3ZSR0WfVcHEEpXrdLm1mvuogXS7RAoxLwX2AwMdeg,839 -aiogram/types/video_chat_participants_invited.py,sha256=zV4sR4Mi_BmHeS60I4C-KzrAhOAh2weIFuEE8CmhmZI,943 -aiogram/types/video_chat_scheduled.py,sha256=G-a24czeK7NVzJ88SKFNutPd_SGnRgTBLy85rHozNLo,990 -aiogram/types/video_chat_started.py,sha256=FYHVcH-a5knoXIYMmCQThFt8hjjPwAiZ8QvGLNVWgl4,309 -aiogram/types/video_note.py,sha256=Hwa8uTCnyb9yT9eGikFwyVfk6X779md3DNAPbav6VrM,2059 -aiogram/types/voice.py,sha256=AMyEJovxyDl2TRVpEfpHLMSmsXNjXIrNDH73HxQUxqg,1932 -aiogram/types/web_app_data.py,sha256=CzkuU2VwVYQ7WBkFA6Zh8BL-qUKQeB__mcmhmVZnT2A,1107 -aiogram/types/web_app_info.py,sha256=aPH4uLFFLKNLEF3RUm3uYCkg9Hk545kMoUvrkg4TUds,931 -aiogram/types/webhook_info.py,sha256=TAfcO66tpfH5XolOI90pg_sHowUkV4hHjzp3tWhpj_w,2992 -aiogram/types/write_access_allowed.py,sha256=3GiPknn_fKHAJ53FROE4AK4MtpwluNlAuZvFuOP6diA,1912 -aiogram/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiogram/utils/__pycache__/__init__.cpython-311.pyc,, -aiogram/utils/__pycache__/auth_widget.cpython-311.pyc,, -aiogram/utils/__pycache__/backoff.cpython-311.pyc,, -aiogram/utils/__pycache__/callback_answer.cpython-311.pyc,, -aiogram/utils/__pycache__/chat_action.cpython-311.pyc,, -aiogram/utils/__pycache__/chat_member.cpython-311.pyc,, -aiogram/utils/__pycache__/deep_linking.cpython-311.pyc,, -aiogram/utils/__pycache__/formatting.cpython-311.pyc,, -aiogram/utils/__pycache__/keyboard.cpython-311.pyc,, -aiogram/utils/__pycache__/link.cpython-311.pyc,, -aiogram/utils/__pycache__/magic_filter.cpython-311.pyc,, -aiogram/utils/__pycache__/markdown.cpython-311.pyc,, -aiogram/utils/__pycache__/media_group.cpython-311.pyc,, -aiogram/utils/__pycache__/mixins.cpython-311.pyc,, -aiogram/utils/__pycache__/mypy_hacks.cpython-311.pyc,, -aiogram/utils/__pycache__/payload.cpython-311.pyc,, -aiogram/utils/__pycache__/serialization.cpython-311.pyc,, -aiogram/utils/__pycache__/text_decorations.cpython-311.pyc,, -aiogram/utils/__pycache__/token.cpython-311.pyc,, -aiogram/utils/__pycache__/warnings.cpython-311.pyc,, -aiogram/utils/__pycache__/web_app.cpython-311.pyc,, -aiogram/utils/auth_widget.py,sha256=kcNMXu7hA4kWHw_PeZsGFaeC0m0Sbtbd2-8Q9rWfkHg,981 -aiogram/utils/backoff.py,sha256=D_d7z94PyR5USzeoIednnCgW07qQgwQNgVdPGkgrmJM,2123 -aiogram/utils/callback_answer.py,sha256=_NHsLMjfZBKOXtyCSHBh4s9V3go-U8Wsk5JqpMh-O4c,6573 -aiogram/utils/chat_action.py,sha256=3GW2mDqQQ5fv6LMpeqB0j-J1d1blml2aF4q7vqlnMBQ,12201 -aiogram/utils/chat_member.py,sha256=WwMEi__6DYeF55TFuLxPS-OQaDdTa0I2f-yJkt3Dio0,942 -aiogram/utils/deep_linking.py,sha256=D89nv29pnL63_N_E_ZfLjiarTQZhg0oq6RnRdWRDSTE,2980 -aiogram/utils/formatting.py,sha256=7je7KplskUsRgo4DFVWwnN0g4C8JMBYC4tTVxw-3zr4,16902 -aiogram/utils/i18n/__init__.py,sha256=mwTwSL1cuXYi3a3LBICqoH66y4kHVML24YNPbGlZ55M,440 -aiogram/utils/i18n/__pycache__/__init__.cpython-311.pyc,, -aiogram/utils/i18n/__pycache__/context.cpython-311.pyc,, -aiogram/utils/i18n/__pycache__/core.cpython-311.pyc,, -aiogram/utils/i18n/__pycache__/lazy_proxy.cpython-311.pyc,, -aiogram/utils/i18n/__pycache__/middleware.cpython-311.pyc,, -aiogram/utils/i18n/context.py,sha256=fhLzDZvxqRMvPu2-lEUrH7n09oHl-H0qo2mLFyKzCJk,549 -aiogram/utils/i18n/core.py,sha256=XX_iuwylDTfrfCrafnqiFq28LDr-bvoO4Qnkhy81d_M,3542 -aiogram/utils/i18n/lazy_proxy.py,sha256=0yHtyrejG9wG4yzLl1cDEsFomww2nyR7KFSbFyp7_NA,472 -aiogram/utils/i18n/middleware.py,sha256=lqeui9-x7ztMQPI0IeQeRawe6orMjpsg2EtvXTzAQj4,5874 -aiogram/utils/keyboard.py,sha256=zxXdpmRr5x-4kaczAGWvlElMoWzRKF5PvDyxSJ9_4HY,13234 -aiogram/utils/link.py,sha256=z7Zp5uk5z3iNO26-wZrhoCDNLt1N0KjbPYhthOq-50o,2261 -aiogram/utils/magic_filter.py,sha256=WGHOC9k2acxrcpkFF-ViQv3LbzRAKtJj5MRv7IEi75c,666 -aiogram/utils/markdown.py,sha256=3T1UVSzaAwnYnTNNq6pklq-TTs6Y6zINp-LIWgwrAyU,4481 -aiogram/utils/media_group.py,sha256=E28oJhPoTQ4iKXr0QUx5W1nd7VPHAJf0PQz0MeqG46E,14804 -aiogram/utils/mixins.py,sha256=ox0Q6BlxcyTfAtzLVMEY9eUfXXhnXtkkLBQlUQ6uL4o,2923 -aiogram/utils/mypy_hacks.py,sha256=cm5_tBzfrkG5OOIs2m5U4JfQKohj1KkmCRXNLTJFDy0,433 -aiogram/utils/payload.py,sha256=mGJdQryRHL07VbSjdzGbN1NbYzd_mN2MGY1RiY3_KX4,2942 -aiogram/utils/serialization.py,sha256=SMiqv2TQed_GOhvhWoaABFM65jjIiXqBJTRRdMQ9nXY,2765 -aiogram/utils/text_decorations.py,sha256=tJwFV-zefED_z70wQsGWXIhD85m8Ee12mk3VrWN8Koo,8248 -aiogram/utils/token.py,sha256=iFfmK-pHGyPsF4ekWWcOlfH4OR9xGNAyCIavND8Ykrc,936 -aiogram/utils/warnings.py,sha256=xGsQcxrMXtdZfLOGRCqKRIJbw80DA39COcctikBfYAE,89 -aiogram/utils/web_app.py,sha256=pYFAohjk8OW3qRQkJebMtKaFJ7vOL4OJivUEh171kkI,7105 -aiogram/webhook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -aiogram/webhook/__pycache__/__init__.cpython-311.pyc,, -aiogram/webhook/__pycache__/aiohttp_server.cpython-311.pyc,, -aiogram/webhook/__pycache__/security.cpython-311.pyc,, -aiogram/webhook/aiohttp_server.py,sha256=3uto1_vwf6h73SXFNSoDxGt49gFHFYDI1wf4uRcxWUg,10454 -aiogram/webhook/security.py,sha256=ifd2TrPSOlXfutYyAmRh0LT3hJkB4o79XmEV1lo6fv0,1350 diff --git a/env/Lib/site-packages/aiogram-3.12.0.dist-info/REQUESTED b/env/Lib/site-packages/aiogram-3.12.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/env/Lib/site-packages/aiogram-3.12.0.dist-info/WHEEL b/env/Lib/site-packages/aiogram-3.12.0.dist-info/WHEEL deleted file mode 100644 index cdd68a4..0000000 --- a/env/Lib/site-packages/aiogram-3.12.0.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.25.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/env/Lib/site-packages/aiogram-3.12.0.dist-info/licenses/LICENSE b/env/Lib/site-packages/aiogram-3.12.0.dist-info/licenses/LICENSE deleted file mode 100644 index caa060c..0000000 --- a/env/Lib/site-packages/aiogram-3.12.0.dist-info/licenses/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -Copyright (c) 2017 - present Alex Root Junior - -Permission is hereby granted, free of charge, to any person obtaining a copy of this -software and associated documentation files (the "Software"), to deal in the Software -without restriction, including without limitation the rights to use, copy, modify, -merge, publish, distribute, sublicense, and/or sell copies of the Software, -and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies -or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS -BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE -OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/env/Lib/site-packages/aiogram/__init__.py b/env/Lib/site-packages/aiogram/__init__.py deleted file mode 100644 index 1fbee0e..0000000 --- a/env/Lib/site-packages/aiogram/__init__.py +++ /dev/null @@ -1,41 +0,0 @@ -import asyncio as _asyncio -from contextlib import suppress - -from aiogram.dispatcher.flags import FlagGenerator - -from . import enums, methods, types -from .__meta__ import __api_version__, __version__ -from .client import session -from .client.bot import Bot -from .dispatcher.dispatcher import Dispatcher -from .dispatcher.middlewares.base import BaseMiddleware -from .dispatcher.router import Router -from .utils.magic_filter import MagicFilter -from .utils.text_decorations import html_decoration as html -from .utils.text_decorations import markdown_decoration as md - -with suppress(ImportError): - import uvloop as _uvloop - - _asyncio.set_event_loop_policy(_uvloop.EventLoopPolicy()) - - -F = MagicFilter() -flags = FlagGenerator() - -__all__ = ( - "__api_version__", - "__version__", - "types", - "methods", - "enums", - "Bot", - "session", - "Dispatcher", - "Router", - "BaseMiddleware", - "F", - "html", - "md", - "flags", -) diff --git a/env/Lib/site-packages/aiogram/__meta__.py b/env/Lib/site-packages/aiogram/__meta__.py deleted file mode 100644 index c36e738..0000000 --- a/env/Lib/site-packages/aiogram/__meta__.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = "3.12.0" -__api_version__ = "7.9" diff --git a/env/Lib/site-packages/aiogram/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 84bce6dfe91d7a5d2c3d0686e03a8c36622b504e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1614 zcmZ`%O>Epm6dteb^=AL`OGrvvvJ`2BvIrzpDI`6FG=OLjf&=hLp?`1*aPoy87M3@&^t(22f4@QLv&ym=po#u^O(=_xed6@zUF(wueo=8 z;|tWRKUb8WHVs)2{a%j~Aplo4sn`9GgoJx>#Gk8@nx?c#*k?jIjKsTJk1lbCFpOOQQ6Y%6e zkNUBWmA1TY(Af;=(5&sojAEa3B1mmWIn6x2=SK(ORdI&rI*wJE_ zT@MYocyoT7J=tem1o^8b=%H(#Dj z(PEO7|MDy+C?hGln`9+Lcap56=&d9xDSAK2N{ZH!teo1F!Bqat?Q)_AP(TTN`G**7Pd(v1rZmga(R*$W<6KgH8*3O*KA${_1#qrN2(U|fYIzK@%xY$_*U#2sL$o++12Oo6pMDdfj<8ZGiq4 DsCvVl diff --git a/env/Lib/site-packages/aiogram/__pycache__/__meta__.cpython-311.pyc b/env/Lib/site-packages/aiogram/__pycache__/__meta__.cpython-311.pyc deleted file mode 100644 index d1b1a9c1153603e19796739e4c5431a3b0d703fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmZ3^%ge<81lwkxNz(_?k3k$5V1zP0^8p#t8B!Rc7*ZIc7*m*n88n%z*o^fIjr0tv zn9cPp{WO_wamUA(r4|)u=I6!7-{OytPb|np2&`oI3^MGOi;GoEcz#iKjB|cUW?p(s zc4<*!Nq$j$QhrHHYF=54Pi9g~ab`)XZb4#lc4B&JaZF-netJ=2u6}%cZfZ$le7s&k udUwNRFlbKKkZsOP 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 diff --git a/env/Lib/site-packages/aiogram/__pycache__/loggers.cpython-311.pyc b/env/Lib/site-packages/aiogram/__pycache__/loggers.cpython-311.pyc deleted file mode 100644 index ba3d0c167cdca2b056660ff55e9029b17adc6050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 598 zcmZXRF-yZh6vr=Z)5MgEpi`-|Zqh>2!P-H@rH;kLp-=*n_Rci6&6P{qVy2A!1`6(q z2#$UVhXyi~OoEe}(5;h~+E|J2;P}7yyZ3(&?h!%>uz0@v77*ED{GR9Leo{Dik#`zde$9NiX7oaG7hU=X>JDNds zstpumSVPV3bTM^cRKsIz+Rkp24h)3)c%o5kIonZjg43lq z+Vo+5Ryg!v)rVDAnv2<~;EUP2iYJzQvE=e|xiHmzxiH&5^5mK?*WAop%1sY^DL30I Tdy?WyiYxr@b9tAi88-794R4-M diff --git a/env/Lib/site-packages/aiogram/client/__init__.py b/env/Lib/site-packages/aiogram/client/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/Lib/site-packages/aiogram/client/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/client/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 0f57daf13cf66936683524f9a421008de97a2d55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmZ3^%ge<81lwkxNdwW3K?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCU*0ZOG2!_| z*)h)fDVcfcG1;X>i6!|(@k#k5F{ycFF+Q0|F~ylBsk#M;$=QkNsl_pgnfd8OiMjg8 zIhm<>CHnF4nR%Hd@$q^EmA^P_a`RJ4b5iY!Sb=7PY%k^q5+9fu85ut?z=$Gdpcnv1 Cp)bAw diff --git a/env/Lib/site-packages/aiogram/client/__pycache__/bot.cpython-311.pyc b/env/Lib/site-packages/aiogram/client/__pycache__/bot.cpython-311.pyc deleted file mode 100644 index 4ee2c62fad6e25a3db729c8c07de37954b2d8ea4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251914 zcmeFa31D1Tc{V)S7t4}tS#rFOx7bo7d5se*3-J;=2HP=S61a(xN1Bm5@!T14XU2|% z41uK7ZBuF>{Rl0K)2{?V(w45IEp35rw1rkq4N<2BLRnhqW|~l_yZrz2yyu*|%%a7z zo$!%Ke0A@+=brUF?|$C%(b==>L-_sH&wqa4&1IFLuk*qDD%DNdivzfOUnm-imL)=V znN?QC`|?D&RW5%ktP1&CX;tEHMWV{CwyGshWunHewQA+QDp6yWL@R*f&@=*qv6V-DP#z-B!1~&RS=$x7OPmtPS=?Yooo%+GKCGHrqE^H`-gQ zE%r^;P4>;!&GuGntKDPu*tb}>*tc4@+P7J^*|%G_+pn=+W8Y!jVQ;gx+1st{_6}=@ zz0=xh-)Y@x@3MB;yRF^!UDjRp9&3;NTI;p;>#Wz=d#%0pK5L)7-`a2AZQX4junyR- zw_a}_v<}*btV8x;>#%*qI%3~r-DBTt-D|(WdV~E&>y5T$S@wO_efIs<{q|AosQo7E zO?I!=)O+9@k#4_QO@o2@t7j^)^CD{W`2jGeWz_DSoceabpzKWIH@4_m|bh&5ur#d?c9 zYK_{bt<&~ft+(25v)*PuWIbfR-FmzI4(lEE!`8$0Bi1AKk6AxvzteiB{o~e;+h?pZ z_D@(pVgID{llD(pKV?5^J!=27_0#sdtasTzWBrVM);epy+j_VC9_u~!d#(4{k6Dk| zKWqK0{eP_gW53UOpTIyJ;OcSfar^z&`|Y2ze$M`R>*wtcSRb%IXnoNBko6(^!`6rG zbJjWg3F`^_7pz~f|F89b?O(Kh(f)|_5&KE&N&BPLN9~VUAG4pbp0Yn~ecXQ9dfI-* zddB`G>zC|bwtm_E73){*PgtL@f7SX```4^rvwz+Cb^AB0->`qv`c3<{tlzRfX?@au z)_T_dZR@w~-?4tj{$1;L?N3>svVYI|J^S~q-?#t3`UCsZ)~D^ySf8;!Ykk)KL+cOi zKeGPF{$uNp?LV>p#Qsz3PwmfHpR@nW`ZN2_tv|Q_!ukvQ^Va9>FIZo&|I+$P`>(9O zvd643`@D7De$IN%{%h;6?F-fg`-|2W?JrqhvY)q}x5uq<`){njv2#|={#)yB?Z31B z&i=CXW&11ESM0A^U$tMbUa-Grea-%R>+kKaTVJ=oVSU5?ru9wxTh_Pif3W_+{zvN{ z?QdJ(w!dS2$NnelpX`6O{@MN)>tF1Dwf@!qH|yW*i`GT^yViH@f4BbKe$jf-e#v^t z{+{(cjDLM}R^mVG?_1xue_;JUo*NSXXvfQjlGMUOmGVxS0y¨k@Rq~ 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 diff --git a/env/Lib/site-packages/aiogram/client/__pycache__/default.cpython-311.pyc b/env/Lib/site-packages/aiogram/client/__pycache__/default.cpython-311.pyc deleted file mode 100644 index 685d80f56b2ae966df04c9facf2e619b30b4090d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3822 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 diff --git a/env/Lib/site-packages/aiogram/client/bot.py b/env/Lib/site-packages/aiogram/client/bot.py deleted file mode 100644 index 397e1a1..0000000 --- a/env/Lib/site-packages/aiogram/client/bot.py +++ /dev/null @@ -1,4761 +0,0 @@ -from __future__ import annotations - -import datetime -import io -import pathlib -from contextlib import asynccontextmanager -from types import TracebackType -from typing import ( - Any, - AsyncGenerator, - AsyncIterator, - BinaryIO, - List, - Optional, - Type, - TypeVar, - Union, - cast, -) - -import aiofiles - -from aiogram.utils.token import extract_bot_id, validate_token - -from ..methods import ( - AddStickerToSet, - AnswerCallbackQuery, - AnswerInlineQuery, - AnswerPreCheckoutQuery, - AnswerShippingQuery, - AnswerWebAppQuery, - ApproveChatJoinRequest, - BanChatMember, - BanChatSenderChat, - Close, - CloseForumTopic, - CloseGeneralForumTopic, - CopyMessage, - CopyMessages, - CreateChatInviteLink, - CreateChatSubscriptionInviteLink, - CreateForumTopic, - CreateInvoiceLink, - CreateNewStickerSet, - DeclineChatJoinRequest, - DeleteChatPhoto, - DeleteChatStickerSet, - DeleteForumTopic, - DeleteMessage, - DeleteMessages, - DeleteMyCommands, - DeleteStickerFromSet, - DeleteStickerSet, - DeleteWebhook, - EditChatInviteLink, - EditChatSubscriptionInviteLink, - EditForumTopic, - EditGeneralForumTopic, - EditMessageCaption, - EditMessageLiveLocation, - EditMessageMedia, - EditMessageReplyMarkup, - EditMessageText, - ExportChatInviteLink, - ForwardMessage, - ForwardMessages, - GetBusinessConnection, - GetChat, - GetChatAdministrators, - GetChatMember, - GetChatMemberCount, - GetChatMenuButton, - GetCustomEmojiStickers, - GetFile, - GetForumTopicIconStickers, - GetGameHighScores, - GetMe, - GetMyCommands, - GetMyDefaultAdministratorRights, - GetMyDescription, - GetMyName, - GetMyShortDescription, - GetStarTransactions, - GetStickerSet, - GetUpdates, - GetUserChatBoosts, - GetUserProfilePhotos, - GetWebhookInfo, - HideGeneralForumTopic, - LeaveChat, - LogOut, - PinChatMessage, - PromoteChatMember, - RefundStarPayment, - ReopenForumTopic, - ReopenGeneralForumTopic, - ReplaceStickerInSet, - RestrictChatMember, - RevokeChatInviteLink, - SendAnimation, - SendAudio, - SendChatAction, - SendContact, - SendDice, - SendDocument, - SendGame, - SendInvoice, - SendLocation, - SendMediaGroup, - SendMessage, - SendPaidMedia, - SendPhoto, - SendPoll, - SendSticker, - SendVenue, - SendVideo, - SendVideoNote, - SendVoice, - SetChatAdministratorCustomTitle, - SetChatDescription, - SetChatMenuButton, - SetChatPermissions, - SetChatPhoto, - SetChatStickerSet, - SetChatTitle, - SetCustomEmojiStickerSetThumbnail, - SetGameScore, - SetMessageReaction, - SetMyCommands, - SetMyDefaultAdministratorRights, - SetMyDescription, - SetMyName, - SetMyShortDescription, - SetPassportDataErrors, - SetStickerEmojiList, - SetStickerKeywords, - SetStickerMaskPosition, - SetStickerPositionInSet, - SetStickerSetThumbnail, - SetStickerSetTitle, - SetWebhook, - StopMessageLiveLocation, - StopPoll, - TelegramMethod, - UnbanChatMember, - UnbanChatSenderChat, - UnhideGeneralForumTopic, - UnpinAllChatMessages, - UnpinAllForumTopicMessages, - UnpinAllGeneralForumTopicMessages, - UnpinChatMessage, - UploadStickerFile, -) -from ..types import ( - BotCommand, - BotCommandScopeAllChatAdministrators, - BotCommandScopeAllGroupChats, - BotCommandScopeAllPrivateChats, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - BotCommandScopeDefault, - BotDescription, - BotName, - BotShortDescription, - BusinessConnection, - ChatAdministratorRights, - ChatFullInfo, - ChatInviteLink, - ChatMemberAdministrator, - ChatMemberBanned, - ChatMemberLeft, - ChatMemberMember, - ChatMemberOwner, - ChatMemberRestricted, - ChatPermissions, - Downloadable, - File, - ForceReply, - ForumTopic, - GameHighScore, - InlineKeyboardMarkup, - InlineQueryResultArticle, - InlineQueryResultAudio, - InlineQueryResultCachedAudio, - InlineQueryResultCachedDocument, - InlineQueryResultCachedGif, - InlineQueryResultCachedMpeg4Gif, - InlineQueryResultCachedPhoto, - InlineQueryResultCachedSticker, - InlineQueryResultCachedVideo, - InlineQueryResultCachedVoice, - InlineQueryResultContact, - InlineQueryResultDocument, - InlineQueryResultGame, - InlineQueryResultGif, - InlineQueryResultLocation, - InlineQueryResultMpeg4Gif, - InlineQueryResultPhoto, - InlineQueryResultsButton, - InlineQueryResultVenue, - InlineQueryResultVideo, - InlineQueryResultVoice, - InputFile, - InputMediaAnimation, - InputMediaAudio, - InputMediaDocument, - InputMediaPhoto, - InputMediaVideo, - InputPaidMediaPhoto, - InputPaidMediaVideo, - InputPollOption, - InputSticker, - LabeledPrice, - LinkPreviewOptions, - MaskPosition, - MenuButtonCommands, - MenuButtonDefault, - MenuButtonWebApp, - Message, - MessageEntity, - MessageId, - PassportElementErrorDataField, - PassportElementErrorFile, - PassportElementErrorFiles, - PassportElementErrorFrontSide, - PassportElementErrorReverseSide, - PassportElementErrorSelfie, - PassportElementErrorTranslationFile, - PassportElementErrorTranslationFiles, - PassportElementErrorUnspecified, - Poll, - ReactionTypeCustomEmoji, - ReactionTypeEmoji, - ReactionTypePaid, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, - SentWebAppMessage, - ShippingOption, - StarTransactions, - Sticker, - StickerSet, - Update, - User, - UserChatBoosts, - UserProfilePhotos, - WebhookInfo, -) -from .default import Default, DefaultBotProperties -from .session.aiohttp import AiohttpSession -from .session.base import BaseSession - -T = TypeVar("T") - - -class Bot: - def __init__( - self, - token: str, - session: Optional[BaseSession] = None, - default: Optional[DefaultBotProperties] = None, - **kwargs: Any, - ) -> None: - """ - Bot class - - :param token: Telegram Bot token `Obtained from @BotFather `_ - :param session: HTTP Client session (For example AiohttpSession). - If not specified it will be automatically created. - :param default: Default bot properties. - If specified it will be propagated into the API methods at runtime. - :raise TokenValidationError: When token has invalid format this exception will be raised - """ - - validate_token(token) - - if session is None: - session = AiohttpSession() - if default is None: - default = DefaultBotProperties() - - self.session = session - - # Few arguments are completely removed in 3.7.0 version - # Temporary solution to raise an error if user passed these arguments - # with explanation how to fix it - parse_mode = kwargs.get("parse_mode", None) - link_preview_is_disabled = kwargs.get("disable_web_page_preview", None) - protect_content = kwargs.get("protect_content", None) - if ( - parse_mode is not None - or link_preview_is_disabled is not None - or protect_content is not None - ): - example_kwargs = { - "parse_mode": parse_mode, - "link_preview_is_disabled": link_preview_is_disabled, - "protect_content": protect_content, - } - replacement_spec = ", ".join( - f"{k}={v!r}" for k, v in example_kwargs.items() if v is not None - ) - raise TypeError( - "Passing `parse_mode`, `disable_web_page_preview` or `protect_content` " - "to Bot initializer is not supported anymore. These arguments have been removed " - f"in 3.7.0 version. Use `default=DefaultBotProperties({replacement_spec})` argument instead." - ) - - self.default = default - - self.__token = token - self._me: Optional[User] = None - - async def __aenter__(self) -> "Bot": - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_value: Optional[BaseException], - traceback: Optional[TracebackType], - ) -> None: - await self.session.close() - - @property - def token(self) -> str: - return self.__token - - @property - def id(self) -> int: - """ - Get bot ID from token - - :return: - """ - return extract_bot_id(self.__token) - - @asynccontextmanager - async def context(self, auto_close: bool = True) -> AsyncIterator[Bot]: - """ - Generate bot context - - :param auto_close: close session on exit - :return: - """ - try: - yield self - finally: - if auto_close: - await self.session.close() - - async def me(self) -> User: - """ - Cached alias for getMe method - - :return: - """ - if self._me is None: # pragma: no cover - self._me = await self.get_me() - return self._me - - @classmethod - async def __download_file_binary_io( - cls, destination: BinaryIO, seek: bool, stream: AsyncGenerator[bytes, None] - ) -> BinaryIO: - async for chunk in stream: - destination.write(chunk) - destination.flush() - if seek is True: - destination.seek(0) - return destination - - @classmethod - async def __download_file( - cls, destination: Union[str, pathlib.Path], stream: AsyncGenerator[bytes, None] - ) -> None: - async with aiofiles.open(destination, "wb") as f: - async for chunk in stream: - await f.write(chunk) - - @classmethod - async def __aiofiles_reader( - cls, file: str, chunk_size: int = 65536 - ) -> AsyncGenerator[bytes, None]: - async with aiofiles.open(file, "rb") as f: - while chunk := await f.read(chunk_size): - yield chunk - - async def download_file( - self, - file_path: str, - destination: Optional[Union[BinaryIO, pathlib.Path, str]] = None, - timeout: int = 30, - chunk_size: int = 65536, - seek: bool = True, - ) -> Optional[BinaryIO]: - """ - Download file by file_path to destination. - - If you want to automatically create destination (:class:`io.BytesIO`) use default - value of destination and handle result of this method. - - :param file_path: File path on Telegram server (You can get it from :obj:`aiogram.types.File`) - :param destination: Filename, file path or instance of :class:`io.IOBase`. For e.g. :class:`io.BytesIO`, defaults to None - :param timeout: Total timeout in seconds, defaults to 30 - :param chunk_size: File chunks size, defaults to 64 kb - :param seek: Go to start of file when downloading is finished. Used only for destination with :class:`typing.BinaryIO` type, defaults to True - """ - if destination is None: - destination = io.BytesIO() - - close_stream = False - if self.session.api.is_local: - stream = self.__aiofiles_reader( - str(self.session.api.wrap_local_file.to_local(file_path)), chunk_size=chunk_size - ) - close_stream = True - else: - url = self.session.api.file_url(self.__token, file_path) - stream = self.session.stream_content( - url=url, - timeout=timeout, - chunk_size=chunk_size, - raise_for_status=True, - ) - - try: - if isinstance(destination, (str, pathlib.Path)): - await self.__download_file(destination=destination, stream=stream) - return None - return await self.__download_file_binary_io( - destination=destination, seek=seek, stream=stream - ) - finally: - if close_stream: - await stream.aclose() - - async def download( - self, - file: Union[str, Downloadable], - destination: Optional[Union[BinaryIO, pathlib.Path, str]] = None, - timeout: int = 30, - chunk_size: int = 65536, - seek: bool = True, - ) -> Optional[BinaryIO]: - """ - Download file by file_id or Downloadable object to destination. - - If you want to automatically create destination (:class:`io.BytesIO`) use default - value of destination and handle result of this method. - - :param file: file_id or Downloadable object - :param destination: Filename, file path or instance of :class:`io.IOBase`. For e.g. :class:`io.BytesIO`, defaults to None - :param timeout: Total timeout in seconds, defaults to 30 - :param chunk_size: File chunks size, defaults to 64 kb - :param seek: Go to start of file when downloading is finished. Used only for destination with :class:`typing.BinaryIO` type, defaults to True - """ - if isinstance(file, str): - file_id = file - else: - # type is ignored in due to: - # Incompatible types in assignment (expression has type "Optional[Any]", variable has type "str") - file_id = getattr(file, "file_id", None) # type: ignore - if file_id is None: - raise TypeError("file can only be of the string or Downloadable type") - - file_ = await self.get_file(file_id) - - # `file_path` can be None for large files but this files can't be downloaded - # So we need to do type-cast - # https://github.com/aiogram/aiogram/pull/282/files#r394110017 - file_path = cast(str, file_.file_path) - - return await self.download_file( - file_path, destination=destination, timeout=timeout, chunk_size=chunk_size, seek=seek - ) - - async def __call__( - self, method: TelegramMethod[T], request_timeout: Optional[int] = None - ) -> T: - """ - Call API method - - :param method: - :return: - """ - return await self.session(self, method, timeout=request_timeout) - - def __hash__(self) -> int: - """ - Get hash for the token - - :return: - """ - return hash(self.__token) - - def __eq__(self, other: Any) -> bool: - """ - Compare current bot with another bot instance - - :param other: - :return: - """ - if not isinstance(other, Bot): - return False - return hash(self) == hash(other) - - async def add_sticker_to_set( - self, - user_id: int, - name: str, - sticker: InputSticker, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to add a new sticker to a set created by the bot. Emoji sticker sets can have up to 200 stickers. Other sticker sets can have up to 120 stickers. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#addstickertoset - - :param user_id: User identifier of sticker set owner - :param name: Sticker set name - :param sticker: A JSON-serialized object with information about the added sticker. If exactly the same sticker had already been added to the set, then the set isn't changed. - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = AddStickerToSet( - user_id=user_id, - name=name, - sticker=sticker, - ) - return await self(call, request_timeout=request_timeout) - - async def answer_callback_query( - self, - callback_query_id: str, - text: Optional[str] = None, - show_alert: Optional[bool] = None, - url: Optional[str] = None, - cache_time: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to send answers to callback queries sent from `inline keyboards `_. The answer will be displayed to the user as a notification at the top of the chat screen or as an alert. On success, :code:`True` is returned. - - Alternatively, the user can be redirected to the specified Game URL. For this option to work, you must first create a game for your bot via `@BotFather `_ and accept the terms. Otherwise, you may use links like :code:`t.me/your_bot?start=XXXX` that open your bot with a parameter. - - Source: https://core.telegram.org/bots/api#answercallbackquery - - :param callback_query_id: Unique identifier for the query to be answered - :param text: Text of the notification. If not specified, nothing will be shown to the user, 0-200 characters - :param show_alert: If :code:`True`, an alert will be shown by the client instead of a notification at the top of the chat screen. Defaults to *false*. - :param url: URL that will be opened by the user's client. If you have created a :class:`aiogram.types.game.Game` and accepted the conditions via `@BotFather `_, specify the URL that opens your game - note that this will only work if the query comes from a `https://core.telegram.org/bots/api#inlinekeyboardbutton `_ *callback_game* button. - :param cache_time: The maximum amount of time in seconds that the result of the callback query may be cached client-side. Telegram apps will support caching starting in version 3.14. Defaults to 0. - :param request_timeout: Request timeout - :return: Otherwise, you may use links like :code:`t.me/your_bot?start=XXXX` that open your bot with a parameter. - """ - - call = AnswerCallbackQuery( - callback_query_id=callback_query_id, - text=text, - show_alert=show_alert, - url=url, - cache_time=cache_time, - ) - return await self(call, request_timeout=request_timeout) - - async def answer_inline_query( - self, - inline_query_id: str, - results: List[ - Union[ - InlineQueryResultCachedAudio, - InlineQueryResultCachedDocument, - InlineQueryResultCachedGif, - InlineQueryResultCachedMpeg4Gif, - InlineQueryResultCachedPhoto, - InlineQueryResultCachedSticker, - InlineQueryResultCachedVideo, - InlineQueryResultCachedVoice, - InlineQueryResultArticle, - InlineQueryResultAudio, - InlineQueryResultContact, - InlineQueryResultGame, - InlineQueryResultDocument, - InlineQueryResultGif, - InlineQueryResultLocation, - InlineQueryResultMpeg4Gif, - InlineQueryResultPhoto, - InlineQueryResultVenue, - InlineQueryResultVideo, - InlineQueryResultVoice, - ] - ], - cache_time: Optional[int] = None, - is_personal: Optional[bool] = None, - next_offset: Optional[str] = None, - button: Optional[InlineQueryResultsButton] = None, - switch_pm_parameter: Optional[str] = None, - switch_pm_text: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to send answers to an inline query. On success, :code:`True` is returned. - - No more than **50** results per query are allowed. - - Source: https://core.telegram.org/bots/api#answerinlinequery - - :param inline_query_id: Unique identifier for the answered query - :param results: A JSON-serialized array of results for the inline query - :param cache_time: The maximum amount of time in seconds that the result of the inline query may be cached on the server. Defaults to 300. - :param is_personal: Pass :code:`True` if results may be cached on the server side only for the user that sent the query. By default, results may be returned to any user who sends the same query. - :param next_offset: Pass the offset that a client should send in the next query with the same text to receive more results. Pass an empty string if there are no more results or if you don't support pagination. Offset length can't exceed 64 bytes. - :param button: A JSON-serialized object describing a button to be shown above inline query results - :param switch_pm_parameter: `Deep-linking `_ parameter for the /start message sent to the bot when user presses the switch button. 1-64 characters, only :code:`A-Z`, :code:`a-z`, :code:`0-9`, :code:`_` and :code:`-` are allowed. - :param switch_pm_text: If passed, clients will display a button with specified text that switches the user to a private chat with the bot and sends the bot a start message with the parameter *switch_pm_parameter* - :param request_timeout: Request timeout - :return: On success, :code:`True` is returned. - """ - - call = AnswerInlineQuery( - inline_query_id=inline_query_id, - results=results, - cache_time=cache_time, - is_personal=is_personal, - next_offset=next_offset, - button=button, - switch_pm_parameter=switch_pm_parameter, - switch_pm_text=switch_pm_text, - ) - return await self(call, request_timeout=request_timeout) - - async def answer_pre_checkout_query( - self, - pre_checkout_query_id: str, - ok: bool, - error_message: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Once the user has confirmed their payment and shipping details, the Bot API sends the final confirmation in the form of an :class:`aiogram.types.update.Update` with the field *pre_checkout_query*. Use this method to respond to such pre-checkout queries. On success, :code:`True` is returned. **Note:** The Bot API must receive an answer within 10 seconds after the pre-checkout query was sent. - - Source: https://core.telegram.org/bots/api#answerprecheckoutquery - - :param pre_checkout_query_id: Unique identifier for the query to be answered - :param ok: Specify :code:`True` if everything is alright (goods are available, etc.) and the bot is ready to proceed with the order. Use :code:`False` if there are any problems. - :param error_message: Required if *ok* is :code:`False`. Error message in human readable form that explains the reason for failure to proceed with the checkout (e.g. "Sorry, somebody just bought the last of our amazing black T-shirts while you were busy filling out your payment details. Please choose a different color or garment!"). Telegram will display this message to the user. - :param request_timeout: Request timeout - :return: **Note:** The Bot API must receive an answer within 10 seconds after the pre-checkout query was sent. - """ - - call = AnswerPreCheckoutQuery( - pre_checkout_query_id=pre_checkout_query_id, - ok=ok, - error_message=error_message, - ) - return await self(call, request_timeout=request_timeout) - - async def answer_shipping_query( - self, - shipping_query_id: str, - ok: bool, - shipping_options: Optional[List[ShippingOption]] = None, - error_message: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - If you sent an invoice requesting a shipping address and the parameter *is_flexible* was specified, the Bot API will send an :class:`aiogram.types.update.Update` with a *shipping_query* field to the bot. Use this method to reply to shipping queries. On success, :code:`True` is returned. - - Source: https://core.telegram.org/bots/api#answershippingquery - - :param shipping_query_id: Unique identifier for the query to be answered - :param ok: Pass :code:`True` if delivery to the specified address is possible and :code:`False` if there are any problems (for example, if delivery to the specified address is not possible) - :param shipping_options: Required if *ok* is :code:`True`. A JSON-serialized array of available shipping options. - :param error_message: Required if *ok* is :code:`False`. Error message in human readable form that explains why it is impossible to complete the order (e.g. "Sorry, delivery to your desired address is unavailable'). Telegram will display this message to the user. - :param request_timeout: Request timeout - :return: On success, :code:`True` is returned. - """ - - call = AnswerShippingQuery( - shipping_query_id=shipping_query_id, - ok=ok, - shipping_options=shipping_options, - error_message=error_message, - ) - return await self(call, request_timeout=request_timeout) - - async def answer_web_app_query( - self, - web_app_query_id: str, - result: Union[ - InlineQueryResultCachedAudio, - InlineQueryResultCachedDocument, - InlineQueryResultCachedGif, - InlineQueryResultCachedMpeg4Gif, - InlineQueryResultCachedPhoto, - InlineQueryResultCachedSticker, - InlineQueryResultCachedVideo, - InlineQueryResultCachedVoice, - InlineQueryResultArticle, - InlineQueryResultAudio, - InlineQueryResultContact, - InlineQueryResultGame, - InlineQueryResultDocument, - InlineQueryResultGif, - InlineQueryResultLocation, - InlineQueryResultMpeg4Gif, - InlineQueryResultPhoto, - InlineQueryResultVenue, - InlineQueryResultVideo, - InlineQueryResultVoice, - ], - request_timeout: Optional[int] = None, - ) -> SentWebAppMessage: - """ - Use this method to set the result of an interaction with a `Web App `_ and send a corresponding message on behalf of the user to the chat from which the query originated. On success, a :class:`aiogram.types.sent_web_app_message.SentWebAppMessage` object is returned. - - Source: https://core.telegram.org/bots/api#answerwebappquery - - :param web_app_query_id: Unique identifier for the query to be answered - :param result: A JSON-serialized object describing the message to be sent - :param request_timeout: Request timeout - :return: On success, a :class:`aiogram.types.sent_web_app_message.SentWebAppMessage` object is returned. - """ - - call = AnswerWebAppQuery( - web_app_query_id=web_app_query_id, - result=result, - ) - return await self(call, request_timeout=request_timeout) - - async def approve_chat_join_request( - self, - chat_id: Union[int, str], - user_id: int, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to approve a chat join request. The bot must be an administrator in the chat for this to work and must have the *can_invite_users* administrator right. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#approvechatjoinrequest - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param user_id: Unique identifier of the target user - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = ApproveChatJoinRequest( - chat_id=chat_id, - user_id=user_id, - ) - return await self(call, request_timeout=request_timeout) - - async def ban_chat_member( - self, - chat_id: Union[int, str], - user_id: int, - until_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - revoke_messages: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to ban a user in a group, a supergroup or a channel. In the case of supergroups and channels, the user will not be able to return to the chat on their own using invite links, etc., unless `unbanned `_ first. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#banchatmember - - :param chat_id: Unique identifier for the target group or username of the target supergroup or channel (in the format :code:`@channelusername`) - :param user_id: Unique identifier of the target user - :param until_date: Date when the user will be unbanned; Unix time. If user is banned for more than 366 days or less than 30 seconds from the current time they are considered to be banned forever. Applied for supergroups and channels only. - :param revoke_messages: Pass :code:`True` to delete all messages from the chat for the user that is being removed. If :code:`False`, the user will be able to see messages in the group that were sent before the user was removed. Always :code:`True` for supergroups and channels. - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = BanChatMember( - chat_id=chat_id, - user_id=user_id, - until_date=until_date, - revoke_messages=revoke_messages, - ) - return await self(call, request_timeout=request_timeout) - - async def ban_chat_sender_chat( - self, - chat_id: Union[int, str], - sender_chat_id: int, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to ban a channel chat in a supergroup or a channel. Until the chat is `unbanned `_, the owner of the banned chat won't be able to send messages on behalf of **any of their channels**. The bot must be an administrator in the supergroup or channel for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#banchatsenderchat - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param sender_chat_id: Unique identifier of the target sender chat - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = BanChatSenderChat( - chat_id=chat_id, - sender_chat_id=sender_chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def close( - self, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to close the bot instance before moving it from one local server to another. You need to delete the webhook before calling this method to ensure that the bot isn't launched again after server restart. The method will return error 429 in the first 10 minutes after the bot is launched. Returns :code:`True` on success. Requires no parameters. - - Source: https://core.telegram.org/bots/api#close - - :param request_timeout: Request timeout - :return: Requires no parameters. - """ - - call = Close() - return await self(call, request_timeout=request_timeout) - - async def close_forum_topic( - self, - chat_id: Union[int, str], - message_thread_id: int, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to close an open topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights, unless it is the creator of the topic. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#closeforumtopic - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param message_thread_id: Unique identifier for the target message thread of the forum topic - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = CloseForumTopic( - chat_id=chat_id, - message_thread_id=message_thread_id, - ) - return await self(call, request_timeout=request_timeout) - - async def copy_message( - self, - chat_id: Union[int, str], - from_chat_id: Union[int, str], - message_id: int, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> MessageId: - """ - Use this method to copy messages of any kind. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz :class:`aiogram.methods.poll.Poll` can be copied only if the value of the field *correct_option_id* is known to the bot. The method is analogous to the method :class:`aiogram.methods.forward_message.ForwardMessage`, but the copied message doesn't have a link to the original message. Returns the :class:`aiogram.types.message_id.MessageId` of the sent message on success. - - Source: https://core.telegram.org/bots/api#copymessage - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param from_chat_id: Unique identifier for the chat where the original message was sent (or channel username in the format :code:`@channelusername`) - :param message_id: Message identifier in the chat specified in *from_chat_id* - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept - :param parse_mode: Mode for parsing entities in the new caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the new caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media. Ignored if a new caption isn't specified. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: Returns the :class:`aiogram.types.message_id.MessageId` of the sent message on success. - """ - - call = CopyMessage( - chat_id=chat_id, - from_chat_id=from_chat_id, - message_id=message_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - disable_notification=disable_notification, - protect_content=protect_content, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def create_chat_invite_link( - self, - chat_id: Union[int, str], - name: Optional[str] = None, - expire_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - member_limit: Optional[int] = None, - creates_join_request: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> ChatInviteLink: - """ - Use this method to create an additional invite link for a chat. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. The link can be revoked using the method :class:`aiogram.methods.revoke_chat_invite_link.RevokeChatInviteLink`. Returns the new invite link as :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - - Source: https://core.telegram.org/bots/api#createchatinvitelink - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param name: Invite link name; 0-32 characters - :param expire_date: Point in time (Unix timestamp) when the link will expire - :param member_limit: The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999 - :param creates_join_request: :code:`True`, if users joining the chat via the link need to be approved by chat administrators. If :code:`True`, *member_limit* can't be specified - :param request_timeout: Request timeout - :return: Returns the new invite link as :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - """ - - call = CreateChatInviteLink( - chat_id=chat_id, - name=name, - expire_date=expire_date, - member_limit=member_limit, - creates_join_request=creates_join_request, - ) - return await self(call, request_timeout=request_timeout) - - async def create_forum_topic( - self, - chat_id: Union[int, str], - name: str, - icon_color: Optional[int] = None, - icon_custom_emoji_id: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> ForumTopic: - """ - Use this method to create a topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights. Returns information about the created topic as a :class:`aiogram.types.forum_topic.ForumTopic` object. - - Source: https://core.telegram.org/bots/api#createforumtopic - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param name: Topic name, 1-128 characters - :param icon_color: Color of the topic icon in RGB format. Currently, must be one of 7322096 (0x6FB9F0), 16766590 (0xFFD67E), 13338331 (0xCB86DB), 9367192 (0x8EEE98), 16749490 (0xFF93B2), or 16478047 (0xFB6F5F) - :param icon_custom_emoji_id: Unique identifier of the custom emoji shown as the topic icon. Use :class:`aiogram.methods.get_forum_topic_icon_stickers.GetForumTopicIconStickers` to get all allowed custom emoji identifiers. - :param request_timeout: Request timeout - :return: Returns information about the created topic as a :class:`aiogram.types.forum_topic.ForumTopic` object. - """ - - call = CreateForumTopic( - chat_id=chat_id, - name=name, - icon_color=icon_color, - icon_custom_emoji_id=icon_custom_emoji_id, - ) - return await self(call, request_timeout=request_timeout) - - async def create_invoice_link( - self, - title: str, - description: str, - payload: str, - currency: str, - prices: List[LabeledPrice], - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[List[int]] = None, - provider_data: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> str: - """ - Use this method to create a link for an invoice. Returns the created invoice link as *String* on success. - - Source: https://core.telegram.org/bots/api#createinvoicelink - - :param title: Product name, 1-32 characters - :param description: Product description, 1-255 characters - :param payload: Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes. - :param currency: Three-letter ISO 4217 currency code, see `more on currencies `_. Pass 'XTR' for payments in `Telegram Stars `_. - :param prices: Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in `Telegram Stars `_. - :param provider_token: Payment provider token, obtained via `@BotFather `_. Pass an empty string for payments in `Telegram Stars `_. - :param max_tip_amount: The maximum accepted amount for tips in the *smallest units* of the currency (integer, **not** float/double). For example, for a maximum tip of :code:`US$ 1.45` pass :code:`max_tip_amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in `Telegram Stars `_. - :param suggested_tip_amounts: A JSON-serialized array of suggested amounts of tips in the *smallest units* of the currency (integer, **not** float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed *max_tip_amount*. - :param provider_data: JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider. - :param photo_url: URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. - :param photo_size: Photo size in bytes - :param photo_width: Photo width - :param photo_height: Photo height - :param need_name: Pass :code:`True` if you require the user's full name to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_phone_number: Pass :code:`True` if you require the user's phone number to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_email: Pass :code:`True` if you require the user's email address to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_shipping_address: Pass :code:`True` if you require the user's shipping address to complete the order. Ignored for payments in `Telegram Stars `_. - :param send_phone_number_to_provider: Pass :code:`True` if the user's phone number should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param send_email_to_provider: Pass :code:`True` if the user's email address should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param is_flexible: Pass :code:`True` if the final price depends on the shipping method. Ignored for payments in `Telegram Stars `_. - :param request_timeout: Request timeout - :return: Returns the created invoice link as *String* on success. - """ - - call = CreateInvoiceLink( - title=title, - description=description, - payload=payload, - currency=currency, - prices=prices, - provider_token=provider_token, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - provider_data=provider_data, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - is_flexible=is_flexible, - ) - return await self(call, request_timeout=request_timeout) - - async def create_new_sticker_set( - self, - user_id: int, - name: str, - title: str, - stickers: List[InputSticker], - sticker_type: Optional[str] = None, - needs_repainting: Optional[bool] = None, - sticker_format: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to create a new sticker set owned by a user. The bot will be able to edit the sticker set thus created. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#createnewstickerset - - :param user_id: User identifier of created sticker set owner - :param name: Short name of sticker set, to be used in :code:`t.me/addstickers/` URLs (e.g., *animals*). Can contain only English letters, digits and underscores. Must begin with a letter, can't contain consecutive underscores and must end in :code:`"_by_"`. :code:`` is case insensitive. 1-64 characters. - :param title: Sticker set title, 1-64 characters - :param stickers: A JSON-serialized list of 1-50 initial stickers to be added to the sticker set - :param sticker_type: Type of stickers in the set, pass 'regular', 'mask', or 'custom_emoji'. By default, a regular sticker set is created. - :param needs_repainting: Pass :code:`True` if stickers in the sticker set must be repainted to the color of text when used in messages, the accent color if used as emoji status, white on chat photos, or another appropriate color based on context; for custom emoji sticker sets only - :param sticker_format: Format of stickers in the set, must be one of 'static', 'animated', 'video' - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = CreateNewStickerSet( - user_id=user_id, - name=name, - title=title, - stickers=stickers, - sticker_type=sticker_type, - needs_repainting=needs_repainting, - sticker_format=sticker_format, - ) - return await self(call, request_timeout=request_timeout) - - async def decline_chat_join_request( - self, - chat_id: Union[int, str], - user_id: int, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to decline a chat join request. The bot must be an administrator in the chat for this to work and must have the *can_invite_users* administrator right. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#declinechatjoinrequest - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param user_id: Unique identifier of the target user - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = DeclineChatJoinRequest( - chat_id=chat_id, - user_id=user_id, - ) - return await self(call, request_timeout=request_timeout) - - async def delete_chat_photo( - self, - chat_id: Union[int, str], - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to delete a chat photo. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletechatphoto - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = DeleteChatPhoto( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def delete_chat_sticker_set( - self, - chat_id: Union[int, str], - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to delete a group sticker set from a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field *can_set_sticker_set* optionally returned in :class:`aiogram.methods.get_chat.GetChat` requests to check if the bot can use this method. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletechatstickerset - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = DeleteChatStickerSet( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def delete_forum_topic( - self, - chat_id: Union[int, str], - message_thread_id: int, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to delete a forum topic along with all its messages in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_delete_messages* administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deleteforumtopic - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param message_thread_id: Unique identifier for the target message thread of the forum topic - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = DeleteForumTopic( - chat_id=chat_id, - message_thread_id=message_thread_id, - ) - return await self(call, request_timeout=request_timeout) - - async def delete_message( - self, - chat_id: Union[int, str], - message_id: int, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to delete a message, including service messages, with the following limitations: - - - A message can only be deleted if it was sent less than 48 hours ago. - - - Service messages about a supergroup, channel, or forum topic creation can't be deleted. - - - A dice message in a private chat can only be deleted if it was sent more than 24 hours ago. - - - Bots can delete outgoing messages in private chats, groups, and supergroups. - - - Bots can delete incoming messages in private chats. - - - Bots granted *can_post_messages* permissions can delete outgoing messages in channels. - - - If the bot is an administrator of a group, it can delete any message there. - - - If the bot has *can_delete_messages* permission in a supergroup or a channel, it can delete any message there. - - Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletemessage - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param message_id: Identifier of the message to delete - :param request_timeout: Request timeout - :return: Use this method to delete a message, including service messages, with the following limitations: - """ - - call = DeleteMessage( - chat_id=chat_id, - message_id=message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def delete_my_commands( - self, - scope: Optional[ - Union[ - BotCommandScopeDefault, - BotCommandScopeAllPrivateChats, - BotCommandScopeAllGroupChats, - BotCommandScopeAllChatAdministrators, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - ] - ] = None, - language_code: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to delete the list of the bot's commands for the given scope and user language. After deletion, `higher level commands `_ will be shown to affected users. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletemycommands - - :param scope: A JSON-serialized object, describing scope of users for which the commands are relevant. Defaults to :class:`aiogram.types.bot_command_scope_default.BotCommandScopeDefault`. - :param language_code: A two-letter ISO 639-1 language code. If empty, commands will be applied to all users from the given scope, for whose language there are no dedicated commands - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = DeleteMyCommands( - scope=scope, - language_code=language_code, - ) - return await self(call, request_timeout=request_timeout) - - async def delete_sticker_from_set( - self, - sticker: str, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to delete a sticker from a set created by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletestickerfromset - - :param sticker: File identifier of the sticker - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = DeleteStickerFromSet( - sticker=sticker, - ) - return await self(call, request_timeout=request_timeout) - - async def delete_webhook( - self, - drop_pending_updates: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to remove webhook integration if you decide to switch back to :class:`aiogram.methods.get_updates.GetUpdates`. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletewebhook - - :param drop_pending_updates: Pass :code:`True` to drop all pending updates - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = DeleteWebhook( - drop_pending_updates=drop_pending_updates, - ) - return await self(call, request_timeout=request_timeout) - - async def edit_chat_invite_link( - self, - chat_id: Union[int, str], - invite_link: str, - name: Optional[str] = None, - expire_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - member_limit: Optional[int] = None, - creates_join_request: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> ChatInviteLink: - """ - Use this method to edit a non-primary invite link created by the bot. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the edited invite link as a :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - - Source: https://core.telegram.org/bots/api#editchatinvitelink - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param invite_link: The invite link to edit - :param name: Invite link name; 0-32 characters - :param expire_date: Point in time (Unix timestamp) when the link will expire - :param member_limit: The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999 - :param creates_join_request: :code:`True`, if users joining the chat via the link need to be approved by chat administrators. If :code:`True`, *member_limit* can't be specified - :param request_timeout: Request timeout - :return: Returns the edited invite link as a :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - """ - - call = EditChatInviteLink( - chat_id=chat_id, - invite_link=invite_link, - name=name, - expire_date=expire_date, - member_limit=member_limit, - creates_join_request=creates_join_request, - ) - return await self(call, request_timeout=request_timeout) - - async def edit_forum_topic( - self, - chat_id: Union[int, str], - message_thread_id: int, - name: Optional[str] = None, - icon_custom_emoji_id: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to edit name and icon of a topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights, unless it is the creator of the topic. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#editforumtopic - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param message_thread_id: Unique identifier for the target message thread of the forum topic - :param name: New topic name, 0-128 characters. If not specified or empty, the current name of the topic will be kept - :param icon_custom_emoji_id: New unique identifier of the custom emoji shown as the topic icon. Use :class:`aiogram.methods.get_forum_topic_icon_stickers.GetForumTopicIconStickers` to get all allowed custom emoji identifiers. Pass an empty string to remove the icon. If not specified, the current icon will be kept - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = EditForumTopic( - chat_id=chat_id, - message_thread_id=message_thread_id, - name=name, - icon_custom_emoji_id=icon_custom_emoji_id, - ) - return await self(call, request_timeout=request_timeout) - - async def edit_message_caption( - self, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - reply_markup: Optional[InlineKeyboardMarkup] = None, - request_timeout: Optional[int] = None, - ) -> Union[Message, bool]: - """ - Use this method to edit captions of messages. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - - Source: https://core.telegram.org/bots/api#editmessagecaption - - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param chat_id: Required if *inline_message_id* is not specified. Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param message_id: Required if *inline_message_id* is not specified. Identifier of the message to edit - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param caption: New caption of the message, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the message caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media. Supported only for animation, photo and video messages. - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. - :param request_timeout: Request timeout - :return: Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - """ - - call = EditMessageCaption( - business_connection_id=business_connection_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - reply_markup=reply_markup, - ) - return await self(call, request_timeout=request_timeout) - - async def edit_message_live_location( - self, - latitude: float, - longitude: float, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - live_period: Optional[int] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - request_timeout: Optional[int] = None, - ) -> Union[Message, bool]: - """ - Use this method to edit live location messages. A location can be edited until its *live_period* expires or editing is explicitly disabled by a call to :class:`aiogram.methods.stop_message_live_location.StopMessageLiveLocation`. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. - - Source: https://core.telegram.org/bots/api#editmessagelivelocation - - :param latitude: Latitude of new location - :param longitude: Longitude of new location - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param chat_id: Required if *inline_message_id* is not specified. Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param message_id: Required if *inline_message_id* is not specified. Identifier of the message to edit - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param live_period: New period in seconds during which the location can be updated, starting from the message send date. If 0x7FFFFFFF is specified, then the location can be updated forever. Otherwise, the new value must not exceed the current *live_period* by more than a day, and the live location expiration date must remain within the next 90 days. If not specified, then *live_period* remains unchanged - :param horizontal_accuracy: The radius of uncertainty for the location, measured in meters; 0-1500 - :param heading: Direction in which the user is moving, in degrees. Must be between 1 and 360 if specified. - :param proximity_alert_radius: The maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified. - :param reply_markup: A JSON-serialized object for a new `inline keyboard `_. - :param request_timeout: Request timeout - :return: On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. - """ - - call = EditMessageLiveLocation( - latitude=latitude, - longitude=longitude, - business_connection_id=business_connection_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - live_period=live_period, - horizontal_accuracy=horizontal_accuracy, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - reply_markup=reply_markup, - ) - return await self(call, request_timeout=request_timeout) - - async def edit_message_media( - self, - media: Union[ - InputMediaAnimation, - InputMediaDocument, - InputMediaAudio, - InputMediaPhoto, - InputMediaVideo, - ], - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - request_timeout: Optional[int] = None, - ) -> Union[Message, bool]: - """ - Use this method to edit animation, audio, document, photo, or video messages. If a message is part of a message album, then it can be edited only to an audio for audio albums, only to a document for document albums and to a photo or a video otherwise. When an inline message is edited, a new file can't be uploaded; use a previously uploaded file via its file_id or specify a URL. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - - Source: https://core.telegram.org/bots/api#editmessagemedia - - :param media: A JSON-serialized object for a new media content of the message - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param chat_id: Required if *inline_message_id* is not specified. Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param message_id: Required if *inline_message_id* is not specified. Identifier of the message to edit - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param reply_markup: A JSON-serialized object for a new `inline keyboard `_. - :param request_timeout: Request timeout - :return: Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - """ - - call = EditMessageMedia( - media=media, - business_connection_id=business_connection_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - reply_markup=reply_markup, - ) - return await self(call, request_timeout=request_timeout) - - async def edit_message_reply_markup( - self, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - request_timeout: Optional[int] = None, - ) -> Union[Message, bool]: - """ - Use this method to edit only the reply markup of messages. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - - Source: https://core.telegram.org/bots/api#editmessagereplymarkup - - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param chat_id: Required if *inline_message_id* is not specified. Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param message_id: Required if *inline_message_id* is not specified. Identifier of the message to edit - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. - :param request_timeout: Request timeout - :return: Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - """ - - call = EditMessageReplyMarkup( - business_connection_id=business_connection_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - reply_markup=reply_markup, - ) - return await self(call, request_timeout=request_timeout) - - async def edit_message_text( - self, - text: str, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - entities: Optional[List[MessageEntity]] = None, - link_preview_options: Optional[LinkPreviewOptions] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - disable_web_page_preview: Optional[Union[bool, Default]] = Default( - "link_preview_is_disabled" - ), - request_timeout: Optional[int] = None, - ) -> Union[Message, bool]: - """ - Use this method to edit text and `game `_ messages. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - - Source: https://core.telegram.org/bots/api#editmessagetext - - :param text: New text of the message, 1-4096 characters after entities parsing - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param chat_id: Required if *inline_message_id* is not specified. Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param message_id: Required if *inline_message_id* is not specified. Identifier of the message to edit - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param parse_mode: Mode for parsing entities in the message text. See `formatting options `_ for more details. - :param entities: A JSON-serialized list of special entities that appear in message text, which can be specified instead of *parse_mode* - :param link_preview_options: Link preview generation options for the message - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. - :param disable_web_page_preview: Disables link previews for links in this message - :param request_timeout: Request timeout - :return: Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - """ - - call = EditMessageText( - text=text, - business_connection_id=business_connection_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - parse_mode=parse_mode, - entities=entities, - link_preview_options=link_preview_options, - reply_markup=reply_markup, - disable_web_page_preview=disable_web_page_preview, - ) - return await self(call, request_timeout=request_timeout) - - async def export_chat_invite_link( - self, - chat_id: Union[int, str], - request_timeout: Optional[int] = None, - ) -> str: - """ - Use this method to generate a new primary invite link for a chat; any previously generated primary link is revoked. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the new invite link as *String* on success. - - Note: Each administrator in a chat generates their own invite links. Bots can't use invite links generated by other administrators. If you want your bot to work with invite links, it will need to generate its own link using :class:`aiogram.methods.export_chat_invite_link.ExportChatInviteLink` or by calling the :class:`aiogram.methods.get_chat.GetChat` method. If your bot needs to generate a new primary invite link replacing its previous one, use :class:`aiogram.methods.export_chat_invite_link.ExportChatInviteLink` again. - - Source: https://core.telegram.org/bots/api#exportchatinvitelink - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param request_timeout: Request timeout - :return: If your bot needs to generate a new primary invite link replacing its previous one, use :class:`aiogram.methods.export_chat_invite_link.ExportChatInviteLink` again. - """ - - call = ExportChatInviteLink( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def forward_message( - self, - chat_id: Union[int, str], - from_chat_id: Union[int, str], - message_id: int, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to forward messages of any kind. Service messages and messages with protected content can't be forwarded. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#forwardmessage - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param from_chat_id: Unique identifier for the chat where the original message was sent (or channel username in the format :code:`@channelusername`) - :param message_id: Message identifier in the chat specified in *from_chat_id* - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the forwarded message from forwarding and saving - :param request_timeout: Request timeout - :return: On success, the sent :class:`aiogram.types.message.Message` is returned. - """ - - call = ForwardMessage( - chat_id=chat_id, - from_chat_id=from_chat_id, - message_id=message_id, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - ) - return await self(call, request_timeout=request_timeout) - - async def get_chat( - self, - chat_id: Union[int, str], - request_timeout: Optional[int] = None, - ) -> ChatFullInfo: - """ - Use this method to get up-to-date information about the chat. Returns a :class:`aiogram.types.chat_full_info.ChatFullInfo` object on success. - - Source: https://core.telegram.org/bots/api#getchat - - :param chat_id: Unique identifier for the target chat or username of the target supergroup or channel (in the format :code:`@channelusername`) - :param request_timeout: Request timeout - :return: Returns a :class:`aiogram.types.chat_full_info.ChatFullInfo` object on success. - """ - - call = GetChat( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def get_chat_administrators( - self, - chat_id: Union[int, str], - request_timeout: Optional[int] = None, - ) -> List[ - Union[ - ChatMemberOwner, - ChatMemberAdministrator, - ChatMemberMember, - ChatMemberRestricted, - ChatMemberLeft, - ChatMemberBanned, - ] - ]: - """ - Use this method to get a list of administrators in a chat, which aren't bots. Returns an Array of :class:`aiogram.types.chat_member.ChatMember` objects. - - Source: https://core.telegram.org/bots/api#getchatadministrators - - :param chat_id: Unique identifier for the target chat or username of the target supergroup or channel (in the format :code:`@channelusername`) - :param request_timeout: Request timeout - :return: Returns an Array of :class:`aiogram.types.chat_member.ChatMember` objects. - """ - - call = GetChatAdministrators( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def get_chat_member( - self, - chat_id: Union[int, str], - user_id: int, - request_timeout: Optional[int] = None, - ) -> Union[ - ChatMemberOwner, - ChatMemberAdministrator, - ChatMemberMember, - ChatMemberRestricted, - ChatMemberLeft, - ChatMemberBanned, - ]: - """ - Use this method to get information about a member of a chat. The method is only guaranteed to work for other users if the bot is an administrator in the chat. Returns a :class:`aiogram.types.chat_member.ChatMember` object on success. - - Source: https://core.telegram.org/bots/api#getchatmember - - :param chat_id: Unique identifier for the target chat or username of the target supergroup or channel (in the format :code:`@channelusername`) - :param user_id: Unique identifier of the target user - :param request_timeout: Request timeout - :return: Returns a :class:`aiogram.types.chat_member.ChatMember` object on success. - """ - - call = GetChatMember( - chat_id=chat_id, - user_id=user_id, - ) - return await self(call, request_timeout=request_timeout) - - async def get_chat_member_count( - self, - chat_id: Union[int, str], - request_timeout: Optional[int] = None, - ) -> int: - """ - Use this method to get the number of members in a chat. Returns *Int* on success. - - Source: https://core.telegram.org/bots/api#getchatmembercount - - :param chat_id: Unique identifier for the target chat or username of the target supergroup or channel (in the format :code:`@channelusername`) - :param request_timeout: Request timeout - :return: Returns *Int* on success. - """ - - call = GetChatMemberCount( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def get_chat_menu_button( - self, - chat_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Union[MenuButtonDefault, MenuButtonWebApp, MenuButtonCommands]: - """ - Use this method to get the current value of the bot's menu button in a private chat, or the default menu button. Returns :class:`aiogram.types.menu_button.MenuButton` on success. - - Source: https://core.telegram.org/bots/api#getchatmenubutton - - :param chat_id: Unique identifier for the target private chat. If not specified, default bot's menu button will be returned - :param request_timeout: Request timeout - :return: Returns :class:`aiogram.types.menu_button.MenuButton` on success. - """ - - call = GetChatMenuButton( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def get_custom_emoji_stickers( - self, - custom_emoji_ids: List[str], - request_timeout: Optional[int] = None, - ) -> List[Sticker]: - """ - Use this method to get information about custom emoji stickers by their identifiers. Returns an Array of :class:`aiogram.types.sticker.Sticker` objects. - - Source: https://core.telegram.org/bots/api#getcustomemojistickers - - :param custom_emoji_ids: A JSON-serialized list of custom emoji identifiers. At most 200 custom emoji identifiers can be specified. - :param request_timeout: Request timeout - :return: Returns an Array of :class:`aiogram.types.sticker.Sticker` objects. - """ - - call = GetCustomEmojiStickers( - custom_emoji_ids=custom_emoji_ids, - ) - return await self(call, request_timeout=request_timeout) - - async def get_file( - self, - file_id: str, - request_timeout: Optional[int] = None, - ) -> File: - """ - Use this method to get basic information about a file and prepare it for downloading. For the moment, bots can download files of up to 20MB in size. On success, a :class:`aiogram.types.file.File` object is returned. The file can then be downloaded via the link :code:`https://api.telegram.org/file/bot/`, where :code:`` is taken from the response. It is guaranteed that the link will be valid for at least 1 hour. When the link expires, a new one can be requested by calling :class:`aiogram.methods.get_file.GetFile` again. - **Note:** This function may not preserve the original file name and MIME type. You should save the file's MIME type and name (if available) when the File object is received. - - Source: https://core.telegram.org/bots/api#getfile - - :param file_id: File identifier to get information about - :param request_timeout: Request timeout - :return: You should save the file's MIME type and name (if available) when the File object is received. - """ - - call = GetFile( - file_id=file_id, - ) - return await self(call, request_timeout=request_timeout) - - async def get_forum_topic_icon_stickers( - self, - request_timeout: Optional[int] = None, - ) -> List[Sticker]: - """ - Use this method to get custom emoji stickers, which can be used as a forum topic icon by any user. Requires no parameters. Returns an Array of :class:`aiogram.types.sticker.Sticker` objects. - - Source: https://core.telegram.org/bots/api#getforumtopiciconstickers - - :param request_timeout: Request timeout - :return: Returns an Array of :class:`aiogram.types.sticker.Sticker` objects. - """ - - call = GetForumTopicIconStickers() - return await self(call, request_timeout=request_timeout) - - async def get_game_high_scores( - self, - user_id: int, - chat_id: Optional[int] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> List[GameHighScore]: - """ - Use this method to get data for high score tables. Will return the score of the specified user and several of their neighbors in a game. Returns an Array of :class:`aiogram.types.game_high_score.GameHighScore` objects. - - This method will currently return scores for the target user, plus two of their closest neighbors on each side. Will also return the top three users if the user and their neighbors are not among them. Please note that this behavior is subject to change. - - Source: https://core.telegram.org/bots/api#getgamehighscores - - :param user_id: Target user id - :param chat_id: Required if *inline_message_id* is not specified. Unique identifier for the target chat - :param message_id: Required if *inline_message_id* is not specified. Identifier of the sent message - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param request_timeout: Request timeout - :return: Please note that this behavior is subject to change. - """ - - call = GetGameHighScores( - user_id=user_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def get_me( - self, - request_timeout: Optional[int] = None, - ) -> User: - """ - A simple method for testing your bot's authentication token. Requires no parameters. Returns basic information about the bot in form of a :class:`aiogram.types.user.User` object. - - Source: https://core.telegram.org/bots/api#getme - - :param request_timeout: Request timeout - :return: Returns basic information about the bot in form of a :class:`aiogram.types.user.User` object. - """ - - call = GetMe() - return await self(call, request_timeout=request_timeout) - - async def get_my_commands( - self, - scope: Optional[ - Union[ - BotCommandScopeDefault, - BotCommandScopeAllPrivateChats, - BotCommandScopeAllGroupChats, - BotCommandScopeAllChatAdministrators, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - ] - ] = None, - language_code: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> List[BotCommand]: - """ - Use this method to get the current list of the bot's commands for the given scope and user language. Returns an Array of :class:`aiogram.types.bot_command.BotCommand` objects. If commands aren't set, an empty list is returned. - - Source: https://core.telegram.org/bots/api#getmycommands - - :param scope: A JSON-serialized object, describing scope of users. Defaults to :class:`aiogram.types.bot_command_scope_default.BotCommandScopeDefault`. - :param language_code: A two-letter ISO 639-1 language code or an empty string - :param request_timeout: Request timeout - :return: If commands aren't set, an empty list is returned. - """ - - call = GetMyCommands( - scope=scope, - language_code=language_code, - ) - return await self(call, request_timeout=request_timeout) - - async def get_my_default_administrator_rights( - self, - for_channels: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> ChatAdministratorRights: - """ - Use this method to get the current default administrator rights of the bot. Returns :class:`aiogram.types.chat_administrator_rights.ChatAdministratorRights` on success. - - Source: https://core.telegram.org/bots/api#getmydefaultadministratorrights - - :param for_channels: Pass :code:`True` to get default administrator rights of the bot in channels. Otherwise, default administrator rights of the bot for groups and supergroups will be returned. - :param request_timeout: Request timeout - :return: Returns :class:`aiogram.types.chat_administrator_rights.ChatAdministratorRights` on success. - """ - - call = GetMyDefaultAdministratorRights( - for_channels=for_channels, - ) - return await self(call, request_timeout=request_timeout) - - async def get_sticker_set( - self, - name: str, - request_timeout: Optional[int] = None, - ) -> StickerSet: - """ - Use this method to get a sticker set. On success, a :class:`aiogram.types.sticker_set.StickerSet` object is returned. - - Source: https://core.telegram.org/bots/api#getstickerset - - :param name: Name of the sticker set - :param request_timeout: Request timeout - :return: On success, a :class:`aiogram.types.sticker_set.StickerSet` object is returned. - """ - - call = GetStickerSet( - name=name, - ) - return await self(call, request_timeout=request_timeout) - - async def get_updates( - self, - offset: Optional[int] = None, - limit: Optional[int] = None, - timeout: Optional[int] = None, - allowed_updates: Optional[List[str]] = None, - request_timeout: Optional[int] = None, - ) -> List[Update]: - """ - Use this method to receive incoming updates using long polling (`wiki `_). Returns an Array of :class:`aiogram.types.update.Update` objects. - - **Notes** - - **1.** This method will not work if an outgoing webhook is set up. - - **2.** In order to avoid getting duplicate updates, recalculate *offset* after each server response. - - Source: https://core.telegram.org/bots/api#getupdates - - :param offset: Identifier of the first update to be returned. Must be greater by one than the highest among the identifiers of previously received updates. By default, updates starting with the earliest unconfirmed update are returned. An update is considered confirmed as soon as :class:`aiogram.methods.get_updates.GetUpdates` is called with an *offset* higher than its *update_id*. The negative offset can be specified to retrieve updates starting from *-offset* update from the end of the updates queue. All previous updates will be forgotten. - :param limit: Limits the number of updates to be retrieved. Values between 1-100 are accepted. Defaults to 100. - :param timeout: Timeout in seconds for long polling. Defaults to 0, i.e. usual short polling. Should be positive, short polling should be used for testing purposes only. - :param allowed_updates: A JSON-serialized list of the update types you want your bot to receive. For example, specify :code:`["message", "edited_channel_post", "callback_query"]` to only receive updates of these types. See :class:`aiogram.types.update.Update` for a complete list of available update types. Specify an empty list to receive all update types except *chat_member*, *message_reaction*, and *message_reaction_count* (default). If not specified, the previous setting will be used. - :param request_timeout: Request timeout - :return: Returns an Array of :class:`aiogram.types.update.Update` objects. - """ - - call = GetUpdates( - offset=offset, - limit=limit, - timeout=timeout, - allowed_updates=allowed_updates, - ) - return await self(call, request_timeout=request_timeout) - - async def get_user_profile_photos( - self, - user_id: int, - offset: Optional[int] = None, - limit: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> UserProfilePhotos: - """ - Use this method to get a list of profile pictures for a user. Returns a :class:`aiogram.types.user_profile_photos.UserProfilePhotos` object. - - Source: https://core.telegram.org/bots/api#getuserprofilephotos - - :param user_id: Unique identifier of the target user - :param offset: Sequential number of the first photo to be returned. By default, all photos are returned. - :param limit: Limits the number of photos to be retrieved. Values between 1-100 are accepted. Defaults to 100. - :param request_timeout: Request timeout - :return: Returns a :class:`aiogram.types.user_profile_photos.UserProfilePhotos` object. - """ - - call = GetUserProfilePhotos( - user_id=user_id, - offset=offset, - limit=limit, - ) - return await self(call, request_timeout=request_timeout) - - async def get_webhook_info( - self, - request_timeout: Optional[int] = None, - ) -> WebhookInfo: - """ - Use this method to get current webhook status. Requires no parameters. On success, returns a :class:`aiogram.types.webhook_info.WebhookInfo` object. If the bot is using :class:`aiogram.methods.get_updates.GetUpdates`, will return an object with the *url* field empty. - - Source: https://core.telegram.org/bots/api#getwebhookinfo - - :param request_timeout: Request timeout - :return: If the bot is using :class:`aiogram.methods.get_updates.GetUpdates`, will return an object with the *url* field empty. - """ - - call = GetWebhookInfo() - return await self(call, request_timeout=request_timeout) - - async def leave_chat( - self, - chat_id: Union[int, str], - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method for your bot to leave a group, supergroup or channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#leavechat - - :param chat_id: Unique identifier for the target chat or username of the target supergroup or channel (in the format :code:`@channelusername`) - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = LeaveChat( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def log_out( - self, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to log out from the cloud Bot API server before launching the bot locally. You **must** log out the bot before running it locally, otherwise there is no guarantee that the bot will receive updates. After a successful call, you can immediately log in on a local server, but will not be able to log in back to the cloud Bot API server for 10 minutes. Returns :code:`True` on success. Requires no parameters. - - Source: https://core.telegram.org/bots/api#logout - - :param request_timeout: Request timeout - :return: Requires no parameters. - """ - - call = LogOut() - return await self(call, request_timeout=request_timeout) - - async def pin_chat_message( - self, - chat_id: Union[int, str], - message_id: int, - business_connection_id: Optional[str] = None, - disable_notification: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to add a message to the list of pinned messages in a chat. If the chat is not a private chat, the bot must be an administrator in the chat for this to work and must have the 'can_pin_messages' administrator right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#pinchatmessage - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param message_id: Identifier of a message to pin - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be pinned - :param disable_notification: Pass :code:`True` if it is not necessary to send a notification to all chat members about the new pinned message. Notifications are always disabled in channels and private chats. - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = PinChatMessage( - chat_id=chat_id, - message_id=message_id, - business_connection_id=business_connection_id, - disable_notification=disable_notification, - ) - return await self(call, request_timeout=request_timeout) - - async def promote_chat_member( - self, - chat_id: Union[int, str], - user_id: int, - is_anonymous: Optional[bool] = None, - can_manage_chat: Optional[bool] = None, - can_delete_messages: Optional[bool] = None, - can_manage_video_chats: Optional[bool] = None, - can_restrict_members: Optional[bool] = None, - can_promote_members: Optional[bool] = None, - can_change_info: Optional[bool] = None, - can_invite_users: Optional[bool] = None, - can_post_stories: Optional[bool] = None, - can_edit_stories: Optional[bool] = None, - can_delete_stories: Optional[bool] = None, - can_post_messages: Optional[bool] = None, - can_edit_messages: Optional[bool] = None, - can_pin_messages: Optional[bool] = None, - can_manage_topics: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Pass :code:`False` for all boolean parameters to demote a user. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#promotechatmember - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param user_id: Unique identifier of the target user - :param is_anonymous: Pass :code:`True` if the administrator's presence in the chat is hidden - :param can_manage_chat: Pass :code:`True` if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report spam messages and ignore slow mode. Implied by any other administrator privilege. - :param can_delete_messages: Pass :code:`True` if the administrator can delete messages of other users - :param can_manage_video_chats: Pass :code:`True` if the administrator can manage video chats - :param can_restrict_members: Pass :code:`True` if the administrator can restrict, ban or unban chat members, or access supergroup statistics - :param can_promote_members: Pass :code:`True` if the administrator can add new administrators with a subset of their own privileges or demote administrators that they have promoted, directly or indirectly (promoted by administrators that were appointed by him) - :param can_change_info: Pass :code:`True` if the administrator can change chat title, photo and other settings - :param can_invite_users: Pass :code:`True` if the administrator can invite new users to the chat - :param can_post_stories: Pass :code:`True` if the administrator can post stories to the chat - :param can_edit_stories: Pass :code:`True` if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access the chat's story archive - :param can_delete_stories: Pass :code:`True` if the administrator can delete stories posted by other users - :param can_post_messages: Pass :code:`True` if the administrator can post messages in the channel, or access channel statistics; for channels only - :param can_edit_messages: Pass :code:`True` if the administrator can edit messages of other users and can pin messages; for channels only - :param can_pin_messages: Pass :code:`True` if the administrator can pin messages; for supergroups only - :param can_manage_topics: Pass :code:`True` if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = PromoteChatMember( - chat_id=chat_id, - user_id=user_id, - is_anonymous=is_anonymous, - can_manage_chat=can_manage_chat, - can_delete_messages=can_delete_messages, - can_manage_video_chats=can_manage_video_chats, - can_restrict_members=can_restrict_members, - can_promote_members=can_promote_members, - can_change_info=can_change_info, - can_invite_users=can_invite_users, - can_post_stories=can_post_stories, - can_edit_stories=can_edit_stories, - can_delete_stories=can_delete_stories, - can_post_messages=can_post_messages, - can_edit_messages=can_edit_messages, - can_pin_messages=can_pin_messages, - can_manage_topics=can_manage_topics, - ) - return await self(call, request_timeout=request_timeout) - - async def reopen_forum_topic( - self, - chat_id: Union[int, str], - message_thread_id: int, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to reopen a closed topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights, unless it is the creator of the topic. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#reopenforumtopic - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param message_thread_id: Unique identifier for the target message thread of the forum topic - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = ReopenForumTopic( - chat_id=chat_id, - message_thread_id=message_thread_id, - ) - return await self(call, request_timeout=request_timeout) - - async def restrict_chat_member( - self, - chat_id: Union[int, str], - user_id: int, - permissions: ChatPermissions, - use_independent_chat_permissions: Optional[bool] = None, - until_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to restrict a user in a supergroup. The bot must be an administrator in the supergroup for this to work and must have the appropriate administrator rights. Pass :code:`True` for all permissions to lift restrictions from a user. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#restrictchatmember - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param user_id: Unique identifier of the target user - :param permissions: A JSON-serialized object for new user permissions - :param use_independent_chat_permissions: Pass :code:`True` if chat permissions are set independently. Otherwise, the *can_send_other_messages* and *can_add_web_page_previews* permissions will imply the *can_send_messages*, *can_send_audios*, *can_send_documents*, *can_send_photos*, *can_send_videos*, *can_send_video_notes*, and *can_send_voice_notes* permissions; the *can_send_polls* permission will imply the *can_send_messages* permission. - :param until_date: Date when restrictions will be lifted for the user; Unix time. If user is restricted for more than 366 days or less than 30 seconds from the current time, they are considered to be restricted forever - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = RestrictChatMember( - chat_id=chat_id, - user_id=user_id, - permissions=permissions, - use_independent_chat_permissions=use_independent_chat_permissions, - until_date=until_date, - ) - return await self(call, request_timeout=request_timeout) - - async def revoke_chat_invite_link( - self, - chat_id: Union[int, str], - invite_link: str, - request_timeout: Optional[int] = None, - ) -> ChatInviteLink: - """ - Use this method to revoke an invite link created by the bot. If the primary link is revoked, a new link is automatically generated. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the revoked invite link as :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - - Source: https://core.telegram.org/bots/api#revokechatinvitelink - - :param chat_id: Unique identifier of the target chat or username of the target channel (in the format :code:`@channelusername`) - :param invite_link: The invite link to revoke - :param request_timeout: Request timeout - :return: Returns the revoked invite link as :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - """ - - call = RevokeChatInviteLink( - chat_id=chat_id, - invite_link=invite_link, - ) - return await self(call, request_timeout=request_timeout) - - async def send_animation( - self, - chat_id: Union[int, str], - animation: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendanimation - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param animation: Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param duration: Duration of sent animation in seconds - :param width: Animation width - :param height: Animation height - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Animation caption (may also be used when resending animation by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the animation caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the animation needs to be covered with a spoiler animation - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future. - """ - - call = SendAnimation( - chat_id=chat_id, - animation=animation, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_audio( - self, - chat_id: Union[int, str], - audio: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future. - For sending voice messages, use the :class:`aiogram.methods.send_voice.SendVoice` method instead. - - Source: https://core.telegram.org/bots/api#sendaudio - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param audio: Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: Audio caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the audio caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param duration: Duration of the audio in seconds - :param performer: Performer - :param title: Track name - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future. - """ - - call = SendAudio( - chat_id=chat_id, - audio=audio, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - performer=performer, - title=title, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_chat_action( - self, - chat_id: Union[int, str], - action: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method when you need to tell the user that something is happening on the bot's side. The status is set for 5 seconds or less (when a message arrives from your bot, Telegram clients clear its typing status). Returns :code:`True` on success. - - Example: The `ImageBot `_ needs some time to process a request and upload the image. Instead of sending a text message along the lines of 'Retrieving image, please wait…', the bot may use :class:`aiogram.methods.send_chat_action.SendChatAction` with *action* = *upload_photo*. The user will see a 'sending photo' status for the bot. - - We only recommend using this method when a response from the bot will take a **noticeable** amount of time to arrive. - - Source: https://core.telegram.org/bots/api#sendchataction - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param action: Type of action to broadcast. Choose one, depending on what the user is about to receive: *typing* for `text messages `_, *upload_photo* for `photos `_, *record_video* or *upload_video* for `videos `_, *record_voice* or *upload_voice* for `voice notes `_, *upload_document* for `general files `_, *choose_sticker* for `stickers `_, *find_location* for `location data `_, *record_video_note* or *upload_video_note* for `video notes `_. - :param business_connection_id: Unique identifier of the business connection on behalf of which the action will be sent - :param message_thread_id: Unique identifier for the target message thread; for supergroups only - :param request_timeout: Request timeout - :return: The user will see a 'sending photo' status for the bot. - """ - - call = SendChatAction( - chat_id=chat_id, - action=action, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_contact( - self, - chat_id: Union[int, str], - phone_number: str, - first_name: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - last_name: Optional[str] = None, - vcard: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send phone contacts. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendcontact - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param phone_number: Contact's phone number - :param first_name: Contact's first name - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param last_name: Contact's last name - :param vcard: Additional data about the contact in the form of a `vCard `_, 0-2048 bytes - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: On success, the sent :class:`aiogram.types.message.Message` is returned. - """ - - call = SendContact( - chat_id=chat_id, - phone_number=phone_number, - first_name=first_name, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - last_name=last_name, - vcard=vcard, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_dice( - self, - chat_id: Union[int, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send an animated emoji that will display a random value. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#senddice - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param emoji: Emoji on which the dice throw animation is based. Currently, must be one of '🎲', '🎯', '🏀', '⚽', '🎳', or '🎰'. Dice can have values 1-6 for '🎲', '🎯' and '🎳', values 1-5 for '🏀' and '⚽', and values 1-64 for '🎰'. Defaults to '🎲' - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: On success, the sent :class:`aiogram.types.message.Message` is returned. - """ - - call = SendDice( - chat_id=chat_id, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_document( - self, - chat_id: Union[int, str], - document: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - disable_content_type_detection: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send general files. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#senddocument - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param document: File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Document caption (may also be used when resending documents by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the document caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param disable_content_type_detection: Disables automatic server-side content type detection for files uploaded using multipart/form-data - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future. - """ - - call = SendDocument( - chat_id=chat_id, - document=document, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_content_type_detection=disable_content_type_detection, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_game( - self, - chat_id: int, - game_short_name: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send a game. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendgame - - :param chat_id: Unique identifier for the target chat - :param game_short_name: Short name of the game, serves as the unique identifier for the game. Set up your games via `@BotFather `_. - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. If empty, one 'Play game_title' button will be shown. If not empty, the first button must launch the game. - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: On success, the sent :class:`aiogram.types.message.Message` is returned. - """ - - call = SendGame( - chat_id=chat_id, - game_short_name=game_short_name, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_invoice( - self, - chat_id: Union[int, str], - title: str, - description: str, - payload: str, - currency: str, - prices: List[LabeledPrice], - message_thread_id: Optional[int] = None, - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[List[int]] = None, - start_parameter: Optional[str] = None, - provider_data: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send invoices. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendinvoice - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param title: Product name, 1-32 characters - :param description: Product description, 1-255 characters - :param payload: Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes. - :param currency: Three-letter ISO 4217 currency code, see `more on currencies `_. Pass 'XTR' for payments in `Telegram Stars `_. - :param prices: Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in `Telegram Stars `_. - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param provider_token: Payment provider token, obtained via `@BotFather `_. Pass an empty string for payments in `Telegram Stars `_. - :param max_tip_amount: The maximum accepted amount for tips in the *smallest units* of the currency (integer, **not** float/double). For example, for a maximum tip of :code:`US$ 1.45` pass :code:`max_tip_amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in `Telegram Stars `_. - :param suggested_tip_amounts: A JSON-serialized array of suggested amounts of tips in the *smallest units* of the currency (integer, **not** float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed *max_tip_amount*. - :param start_parameter: Unique deep-linking parameter. If left empty, **forwarded copies** of the sent message will have a *Pay* button, allowing multiple users to pay directly from the forwarded message, using the same invoice. If non-empty, forwarded copies of the sent message will have a *URL* button with a deep link to the bot (instead of a *Pay* button), with the value used as the start parameter - :param provider_data: JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider. - :param photo_url: URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for. - :param photo_size: Photo size in bytes - :param photo_width: Photo width - :param photo_height: Photo height - :param need_name: Pass :code:`True` if you require the user's full name to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_phone_number: Pass :code:`True` if you require the user's phone number to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_email: Pass :code:`True` if you require the user's email address to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_shipping_address: Pass :code:`True` if you require the user's shipping address to complete the order. Ignored for payments in `Telegram Stars `_. - :param send_phone_number_to_provider: Pass :code:`True` if the user's phone number should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param send_email_to_provider: Pass :code:`True` if the user's email address should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param is_flexible: Pass :code:`True` if the final price depends on the shipping method. Ignored for payments in `Telegram Stars `_. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. If empty, one 'Pay :code:`total price`' button will be shown. If not empty, the first button must be a Pay button. - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: On success, the sent :class:`aiogram.types.message.Message` is returned. - """ - - call = SendInvoice( - chat_id=chat_id, - title=title, - description=description, - payload=payload, - currency=currency, - prices=prices, - message_thread_id=message_thread_id, - provider_token=provider_token, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - start_parameter=start_parameter, - provider_data=provider_data, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - is_flexible=is_flexible, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_location( - self, - chat_id: Union[int, str], - latitude: float, - longitude: float, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - horizontal_accuracy: Optional[float] = None, - live_period: Optional[int] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send point on the map. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendlocation - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param latitude: Latitude of the location - :param longitude: Longitude of the location - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param horizontal_accuracy: The radius of uncertainty for the location, measured in meters; 0-1500 - :param live_period: Period in seconds during which the location will be updated (see `Live Locations `_, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely. - :param heading: For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified. - :param proximity_alert_radius: For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: On success, the sent :class:`aiogram.types.message.Message` is returned. - """ - - call = SendLocation( - chat_id=chat_id, - latitude=latitude, - longitude=longitude, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - horizontal_accuracy=horizontal_accuracy, - live_period=live_period, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_media_group( - self, - chat_id: Union[int, str], - media: List[Union[InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo]], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> List[Message]: - """ - Use this method to send a group of photos, videos, documents or audios as an album. Documents and audio files can be only grouped in an album with messages of the same type. On success, an array of `Messages `_ that were sent is returned. - - Source: https://core.telegram.org/bots/api#sendmediagroup - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param media: A JSON-serialized array describing messages to be sent, must include 2-10 items - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param disable_notification: Sends messages `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent messages from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the messages are a reply, ID of the original message - :param request_timeout: Request timeout - :return: On success, an array of `Messages `_ that were sent is returned. - """ - - call = SendMediaGroup( - chat_id=chat_id, - media=media, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_message( - self, - chat_id: Union[int, str], - text: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - entities: Optional[List[MessageEntity]] = None, - link_preview_options: Optional[Union[LinkPreviewOptions, Default]] = Default( - "link_preview" - ), - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - disable_web_page_preview: Optional[Union[bool, Default]] = Default( - "link_preview_is_disabled" - ), - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send text messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendmessage - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param text: Text of the message to be sent, 1-4096 characters after entities parsing - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param parse_mode: Mode for parsing entities in the message text. See `formatting options `_ for more details. - :param entities: A JSON-serialized list of special entities that appear in message text, which can be specified instead of *parse_mode* - :param link_preview_options: Link preview generation options for the message - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param disable_web_page_preview: Disables link previews for links in this message - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: On success, the sent :class:`aiogram.types.message.Message` is returned. - """ - - call = SendMessage( - chat_id=chat_id, - text=text, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - parse_mode=parse_mode, - entities=entities, - link_preview_options=link_preview_options, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - disable_web_page_preview=disable_web_page_preview, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_photo( - self, - chat_id: Union[int, str], - photo: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send photos. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendphoto - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param photo: Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: Photo caption (may also be used when resending photos by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the photo caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the photo needs to be covered with a spoiler animation - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: On success, the sent :class:`aiogram.types.message.Message` is returned. - """ - - call = SendPhoto( - chat_id=chat_id, - photo=photo, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_poll( - self, - chat_id: Union[int, str], - question: str, - options: List[Union[InputPollOption, str]], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - question_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - question_entities: Optional[List[MessageEntity]] = None, - is_anonymous: Optional[bool] = None, - type: Optional[str] = None, - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[int] = None, - explanation: Optional[str] = None, - explanation_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - explanation_entities: Optional[List[MessageEntity]] = None, - open_period: Optional[int] = None, - close_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - is_closed: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send a native poll. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendpoll - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param question: Poll question, 1-300 characters - :param options: A JSON-serialized list of 2-10 answer options - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param question_parse_mode: Mode for parsing entities in the question. See `formatting options `_ for more details. Currently, only custom emoji entities are allowed - :param question_entities: A JSON-serialized list of special entities that appear in the poll question. It can be specified instead of *question_parse_mode* - :param is_anonymous: :code:`True`, if the poll needs to be anonymous, defaults to :code:`True` - :param type: Poll type, 'quiz' or 'regular', defaults to 'regular' - :param allows_multiple_answers: :code:`True`, if the poll allows multiple answers, ignored for polls in quiz mode, defaults to :code:`False` - :param correct_option_id: 0-based identifier of the correct answer option, required for polls in quiz mode - :param explanation: Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters with at most 2 line feeds after entities parsing - :param explanation_parse_mode: Mode for parsing entities in the explanation. See `formatting options `_ for more details. - :param explanation_entities: A JSON-serialized list of special entities that appear in the poll explanation. It can be specified instead of *explanation_parse_mode* - :param open_period: Amount of time in seconds the poll will be active after creation, 5-600. Can't be used together with *close_date*. - :param close_date: Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 600 seconds in the future. Can't be used together with *open_period*. - :param is_closed: Pass :code:`True` if the poll needs to be immediately closed. This can be useful for poll preview. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: On success, the sent :class:`aiogram.types.message.Message` is returned. - """ - - call = SendPoll( - chat_id=chat_id, - question=question, - options=options, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - question_parse_mode=question_parse_mode, - question_entities=question_entities, - is_anonymous=is_anonymous, - type=type, - allows_multiple_answers=allows_multiple_answers, - correct_option_id=correct_option_id, - explanation=explanation, - explanation_parse_mode=explanation_parse_mode, - explanation_entities=explanation_entities, - open_period=open_period, - close_date=close_date, - is_closed=is_closed, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_sticker( - self, - chat_id: Union[int, str], - sticker: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send static .WEBP, `animated `_ .TGS, or `video `_ .WEBM stickers. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendsticker - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param sticker: Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. :ref:`More information on Sending Files » `. Video and animated stickers can't be sent via an HTTP URL. - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param emoji: Emoji associated with the sticker; only for just uploaded stickers - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: On success, the sent :class:`aiogram.types.message.Message` is returned. - """ - - call = SendSticker( - chat_id=chat_id, - sticker=sticker, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_venue( - self, - chat_id: Union[int, str], - latitude: float, - longitude: float, - title: str, - address: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send information about a venue. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvenue - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param latitude: Latitude of the venue - :param longitude: Longitude of the venue - :param title: Name of the venue - :param address: Address of the venue - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param foursquare_id: Foursquare identifier of the venue - :param foursquare_type: Foursquare type of the venue, if known. (For example, 'arts_entertainment/default', 'arts_entertainment/aquarium' or 'food/icecream'.) - :param google_place_id: Google Places identifier of the venue - :param google_place_type: Google Places type of the venue. (See `supported types `_.) - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: On success, the sent :class:`aiogram.types.message.Message` is returned. - """ - - call = SendVenue( - chat_id=chat_id, - latitude=latitude, - longitude=longitude, - title=title, - address=address, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - foursquare_id=foursquare_id, - foursquare_type=foursquare_type, - google_place_id=google_place_id, - google_place_type=google_place_type, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_video( - self, - chat_id: Union[int, str], - video: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - supports_streaming: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvideo - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param video: Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param duration: Duration of sent video in seconds - :param width: Video width - :param height: Video height - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Video caption (may also be used when resending videos by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the video caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the video needs to be covered with a spoiler animation - :param supports_streaming: Pass :code:`True` if the uploaded video is suitable for streaming - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future. - """ - - call = SendVideo( - chat_id=chat_id, - video=video, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - supports_streaming=supports_streaming, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_video_note( - self, - chat_id: Union[int, str], - video_note: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - length: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - As of `v.4.0 `_, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvideonote - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param video_note: Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. :ref:`More information on Sending Files » `. Sending video notes by a URL is currently unsupported - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param duration: Duration of sent video in seconds - :param length: Video width and height, i.e. diameter of the video message - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: On success, the sent :class:`aiogram.types.message.Message` is returned. - """ - - call = SendVideoNote( - chat_id=chat_id, - video_note=video_note, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - length=length, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def send_voice( - self, - chat_id: Union[int, str], - voice: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as :class:`aiogram.types.audio.Audio` or :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvoice - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param voice: Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: Voice message caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the voice message caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param duration: Duration of the voice message in seconds - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :param request_timeout: Request timeout - :return: Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future. - """ - - call = SendVoice( - chat_id=chat_id, - voice=voice, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def set_chat_administrator_custom_title( - self, - chat_id: Union[int, str], - user_id: int, - custom_title: str, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to set a custom title for an administrator in a supergroup promoted by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatadministratorcustomtitle - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param user_id: Unique identifier of the target user - :param custom_title: New custom title for the administrator; 0-16 characters, emoji are not allowed - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetChatAdministratorCustomTitle( - chat_id=chat_id, - user_id=user_id, - custom_title=custom_title, - ) - return await self(call, request_timeout=request_timeout) - - async def set_chat_description( - self, - chat_id: Union[int, str], - description: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to change the description of a group, a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatdescription - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param description: New chat description, 0-255 characters - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetChatDescription( - chat_id=chat_id, - description=description, - ) - return await self(call, request_timeout=request_timeout) - - async def set_chat_menu_button( - self, - chat_id: Optional[int] = None, - menu_button: Optional[ - Union[MenuButtonCommands, MenuButtonWebApp, MenuButtonDefault] - ] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to change the bot's menu button in a private chat, or the default menu button. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatmenubutton - - :param chat_id: Unique identifier for the target private chat. If not specified, default bot's menu button will be changed - :param menu_button: A JSON-serialized object for the bot's new menu button. Defaults to :class:`aiogram.types.menu_button_default.MenuButtonDefault` - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetChatMenuButton( - chat_id=chat_id, - menu_button=menu_button, - ) - return await self(call, request_timeout=request_timeout) - - async def set_chat_permissions( - self, - chat_id: Union[int, str], - permissions: ChatPermissions, - use_independent_chat_permissions: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to set default chat permissions for all members. The bot must be an administrator in the group or a supergroup for this to work and must have the *can_restrict_members* administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatpermissions - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param permissions: A JSON-serialized object for new default chat permissions - :param use_independent_chat_permissions: Pass :code:`True` if chat permissions are set independently. Otherwise, the *can_send_other_messages* and *can_add_web_page_previews* permissions will imply the *can_send_messages*, *can_send_audios*, *can_send_documents*, *can_send_photos*, *can_send_videos*, *can_send_video_notes*, and *can_send_voice_notes* permissions; the *can_send_polls* permission will imply the *can_send_messages* permission. - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetChatPermissions( - chat_id=chat_id, - permissions=permissions, - use_independent_chat_permissions=use_independent_chat_permissions, - ) - return await self(call, request_timeout=request_timeout) - - async def set_chat_photo( - self, - chat_id: Union[int, str], - photo: InputFile, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to set a new profile photo for the chat. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatphoto - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param photo: New chat photo, uploaded using multipart/form-data - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetChatPhoto( - chat_id=chat_id, - photo=photo, - ) - return await self(call, request_timeout=request_timeout) - - async def set_chat_sticker_set( - self, - chat_id: Union[int, str], - sticker_set_name: str, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to set a new group sticker set for a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field *can_set_sticker_set* optionally returned in :class:`aiogram.methods.get_chat.GetChat` requests to check if the bot can use this method. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatstickerset - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param sticker_set_name: Name of the sticker set to be set as the group sticker set - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetChatStickerSet( - chat_id=chat_id, - sticker_set_name=sticker_set_name, - ) - return await self(call, request_timeout=request_timeout) - - async def set_chat_title( - self, - chat_id: Union[int, str], - title: str, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to change the title of a chat. Titles can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchattitle - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param title: New chat title, 1-128 characters - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetChatTitle( - chat_id=chat_id, - title=title, - ) - return await self(call, request_timeout=request_timeout) - - async def set_game_score( - self, - user_id: int, - score: int, - force: Optional[bool] = None, - disable_edit_message: Optional[bool] = None, - chat_id: Optional[int] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> Union[Message, bool]: - """ - Use this method to set the score of the specified user in a game message. On success, if the message is not an inline message, the :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Returns an error, if the new score is not greater than the user's current score in the chat and *force* is :code:`False`. - - Source: https://core.telegram.org/bots/api#setgamescore - - :param user_id: User identifier - :param score: New score, must be non-negative - :param force: Pass :code:`True` if the high score is allowed to decrease. This can be useful when fixing mistakes or banning cheaters - :param disable_edit_message: Pass :code:`True` if the game message should not be automatically edited to include the current scoreboard - :param chat_id: Required if *inline_message_id* is not specified. Unique identifier for the target chat - :param message_id: Required if *inline_message_id* is not specified. Identifier of the sent message - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param request_timeout: Request timeout - :return: Returns an error, if the new score is not greater than the user's current score in the chat and *force* is :code:`False`. - """ - - call = SetGameScore( - user_id=user_id, - score=score, - force=force, - disable_edit_message=disable_edit_message, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def set_my_commands( - self, - commands: List[BotCommand], - scope: Optional[ - Union[ - BotCommandScopeDefault, - BotCommandScopeAllPrivateChats, - BotCommandScopeAllGroupChats, - BotCommandScopeAllChatAdministrators, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - ] - ] = None, - language_code: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to change the list of the bot's commands. See `this manual `_ for more details about bot commands. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setmycommands - - :param commands: A JSON-serialized list of bot commands to be set as the list of the bot's commands. At most 100 commands can be specified. - :param scope: A JSON-serialized object, describing scope of users for which the commands are relevant. Defaults to :class:`aiogram.types.bot_command_scope_default.BotCommandScopeDefault`. - :param language_code: A two-letter ISO 639-1 language code. If empty, commands will be applied to all users from the given scope, for whose language there are no dedicated commands - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetMyCommands( - commands=commands, - scope=scope, - language_code=language_code, - ) - return await self(call, request_timeout=request_timeout) - - async def set_my_default_administrator_rights( - self, - rights: Optional[ChatAdministratorRights] = None, - for_channels: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to change the default administrator rights requested by the bot when it's added as an administrator to groups or channels. These rights will be suggested to users, but they are free to modify the list before adding the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setmydefaultadministratorrights - - :param rights: A JSON-serialized object describing new default administrator rights. If not specified, the default administrator rights will be cleared. - :param for_channels: Pass :code:`True` to change the default administrator rights of the bot in channels. Otherwise, the default administrator rights of the bot for groups and supergroups will be changed. - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetMyDefaultAdministratorRights( - rights=rights, - for_channels=for_channels, - ) - return await self(call, request_timeout=request_timeout) - - async def set_passport_data_errors( - self, - user_id: int, - errors: List[ - Union[ - PassportElementErrorDataField, - PassportElementErrorFrontSide, - PassportElementErrorReverseSide, - PassportElementErrorSelfie, - PassportElementErrorFile, - PassportElementErrorFiles, - PassportElementErrorTranslationFile, - PassportElementErrorTranslationFiles, - PassportElementErrorUnspecified, - ] - ], - request_timeout: Optional[int] = None, - ) -> bool: - """ - Informs a user that some of the Telegram Passport elements they provided contains errors. The user will not be able to re-submit their Passport to you until the errors are fixed (the contents of the field for which you returned the error must change). Returns :code:`True` on success. - Use this if the data submitted by the user doesn't satisfy the standards your service requires for any reason. For example, if a birthday date seems invalid, a submitted document is blurry, a scan shows evidence of tampering, etc. Supply some details in the error message to make sure the user knows how to correct the issues. - - Source: https://core.telegram.org/bots/api#setpassportdataerrors - - :param user_id: User identifier - :param errors: A JSON-serialized array describing the errors - :param request_timeout: Request timeout - :return: Supply some details in the error message to make sure the user knows how to correct the issues. - """ - - call = SetPassportDataErrors( - user_id=user_id, - errors=errors, - ) - return await self(call, request_timeout=request_timeout) - - async def set_sticker_position_in_set( - self, - sticker: str, - position: int, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to move a sticker in a set created by the bot to a specific position. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setstickerpositioninset - - :param sticker: File identifier of the sticker - :param position: New sticker position in the set, zero-based - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetStickerPositionInSet( - sticker=sticker, - position=position, - ) - return await self(call, request_timeout=request_timeout) - - async def set_webhook( - self, - url: str, - certificate: Optional[InputFile] = None, - ip_address: Optional[str] = None, - max_connections: Optional[int] = None, - allowed_updates: Optional[List[str]] = None, - drop_pending_updates: Optional[bool] = None, - secret_token: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to specify a URL and receive incoming updates via an outgoing webhook. Whenever there is an update for the bot, we will send an HTTPS POST request to the specified URL, containing a JSON-serialized :class:`aiogram.types.update.Update`. In case of an unsuccessful request, we will give up after a reasonable amount of attempts. Returns :code:`True` on success. - If you'd like to make sure that the webhook was set by you, you can specify secret data in the parameter *secret_token*. If specified, the request will contain a header 'X-Telegram-Bot-Api-Secret-Token' with the secret token as content. - - **Notes** - - **1.** You will not be able to receive updates using :class:`aiogram.methods.get_updates.GetUpdates` for as long as an outgoing webhook is set up. - - **2.** To use a self-signed certificate, you need to upload your `public key certificate `_ using *certificate* parameter. Please upload as InputFile, sending a String will not work. - - **3.** Ports currently supported *for webhooks*: **443, 80, 88, 8443**. - If you're having any trouble setting up webhooks, please check out this `amazing guide to webhooks `_. - - Source: https://core.telegram.org/bots/api#setwebhook - - :param url: HTTPS URL to send updates to. Use an empty string to remove webhook integration - :param certificate: Upload your public key certificate so that the root certificate in use can be checked. See our `self-signed guide `_ for details. - :param ip_address: The fixed IP address which will be used to send webhook requests instead of the IP address resolved through DNS - :param max_connections: The maximum allowed number of simultaneous HTTPS connections to the webhook for update delivery, 1-100. Defaults to *40*. Use lower values to limit the load on your bot's server, and higher values to increase your bot's throughput. - :param allowed_updates: A JSON-serialized list of the update types you want your bot to receive. For example, specify :code:`["message", "edited_channel_post", "callback_query"]` to only receive updates of these types. See :class:`aiogram.types.update.Update` for a complete list of available update types. Specify an empty list to receive all update types except *chat_member*, *message_reaction*, and *message_reaction_count* (default). If not specified, the previous setting will be used. - :param drop_pending_updates: Pass :code:`True` to drop all pending updates - :param secret_token: A secret token to be sent in a header 'X-Telegram-Bot-Api-Secret-Token' in every webhook request, 1-256 characters. Only characters :code:`A-Z`, :code:`a-z`, :code:`0-9`, :code:`_` and :code:`-` are allowed. The header is useful to ensure that the request comes from a webhook set by you. - :param request_timeout: Request timeout - :return: Please upload as InputFile, sending a String will not work. - """ - - call = SetWebhook( - url=url, - certificate=certificate, - ip_address=ip_address, - max_connections=max_connections, - allowed_updates=allowed_updates, - drop_pending_updates=drop_pending_updates, - secret_token=secret_token, - ) - return await self(call, request_timeout=request_timeout) - - async def stop_message_live_location( - self, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - request_timeout: Optional[int] = None, - ) -> Union[Message, bool]: - """ - Use this method to stop updating a live location message before *live_period* expires. On success, if the message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. - - Source: https://core.telegram.org/bots/api#stopmessagelivelocation - - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param chat_id: Required if *inline_message_id* is not specified. Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param message_id: Required if *inline_message_id* is not specified. Identifier of the message with live location to stop - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param reply_markup: A JSON-serialized object for a new `inline keyboard `_. - :param request_timeout: Request timeout - :return: On success, if the message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. - """ - - call = StopMessageLiveLocation( - business_connection_id=business_connection_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - reply_markup=reply_markup, - ) - return await self(call, request_timeout=request_timeout) - - async def stop_poll( - self, - chat_id: Union[int, str], - message_id: int, - business_connection_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - request_timeout: Optional[int] = None, - ) -> Poll: - """ - Use this method to stop a poll which was sent by the bot. On success, the stopped :class:`aiogram.types.poll.Poll` is returned. - - Source: https://core.telegram.org/bots/api#stoppoll - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param message_id: Identifier of the original message with the poll - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param reply_markup: A JSON-serialized object for a new message `inline keyboard `_. - :param request_timeout: Request timeout - :return: On success, the stopped :class:`aiogram.types.poll.Poll` is returned. - """ - - call = StopPoll( - chat_id=chat_id, - message_id=message_id, - business_connection_id=business_connection_id, - reply_markup=reply_markup, - ) - return await self(call, request_timeout=request_timeout) - - async def unban_chat_member( - self, - chat_id: Union[int, str], - user_id: int, - only_if_banned: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to unban a previously banned user in a supergroup or channel. The user will **not** return to the group or channel automatically, but will be able to join via link, etc. The bot must be an administrator for this to work. By default, this method guarantees that after the call the user is not a member of the chat, but will be able to join it. So if the user is a member of the chat they will also be **removed** from the chat. If you don't want this, use the parameter *only_if_banned*. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unbanchatmember - - :param chat_id: Unique identifier for the target group or username of the target supergroup or channel (in the format :code:`@channelusername`) - :param user_id: Unique identifier of the target user - :param only_if_banned: Do nothing if the user is not banned - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = UnbanChatMember( - chat_id=chat_id, - user_id=user_id, - only_if_banned=only_if_banned, - ) - return await self(call, request_timeout=request_timeout) - - async def unban_chat_sender_chat( - self, - chat_id: Union[int, str], - sender_chat_id: int, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to unban a previously banned channel chat in a supergroup or channel. The bot must be an administrator for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unbanchatsenderchat - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param sender_chat_id: Unique identifier of the target sender chat - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = UnbanChatSenderChat( - chat_id=chat_id, - sender_chat_id=sender_chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def unpin_all_chat_messages( - self, - chat_id: Union[int, str], - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to clear the list of pinned messages in a chat. If the chat is not a private chat, the bot must be an administrator in the chat for this to work and must have the 'can_pin_messages' administrator right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unpinallchatmessages - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = UnpinAllChatMessages( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def unpin_all_forum_topic_messages( - self, - chat_id: Union[int, str], - message_thread_id: int, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to clear the list of pinned messages in a forum topic. The bot must be an administrator in the chat for this to work and must have the *can_pin_messages* administrator right in the supergroup. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unpinallforumtopicmessages - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param message_thread_id: Unique identifier for the target message thread of the forum topic - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = UnpinAllForumTopicMessages( - chat_id=chat_id, - message_thread_id=message_thread_id, - ) - return await self(call, request_timeout=request_timeout) - - async def unpin_chat_message( - self, - chat_id: Union[int, str], - business_connection_id: Optional[str] = None, - message_id: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to remove a message from the list of pinned messages in a chat. If the chat is not a private chat, the bot must be an administrator in the chat for this to work and must have the 'can_pin_messages' administrator right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unpinchatmessage - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be unpinned - :param message_id: Identifier of the message to unpin. Required if *business_connection_id* is specified. If not specified, the most recent pinned message (by sending date) will be unpinned. - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = UnpinChatMessage( - chat_id=chat_id, - business_connection_id=business_connection_id, - message_id=message_id, - ) - return await self(call, request_timeout=request_timeout) - - async def upload_sticker_file( - self, - user_id: int, - sticker: InputFile, - sticker_format: str, - request_timeout: Optional[int] = None, - ) -> File: - """ - Use this method to upload a file with a sticker for later use in the :class:`aiogram.methods.create_new_sticker_set.CreateNewStickerSet`, :class:`aiogram.methods.add_sticker_to_set.AddStickerToSet`, or :class:`aiogram.methods.replace_sticker_in_set.ReplaceStickerInSet` methods (the file can be used multiple times). Returns the uploaded :class:`aiogram.types.file.File` on success. - - Source: https://core.telegram.org/bots/api#uploadstickerfile - - :param user_id: User identifier of sticker file owner - :param sticker: A file with the sticker in .WEBP, .PNG, .TGS, or .WEBM format. See `https://core.telegram.org/stickers `_`https://core.telegram.org/stickers `_ for technical requirements. :ref:`More information on Sending Files » ` - :param sticker_format: Format of the sticker, must be one of 'static', 'animated', 'video' - :param request_timeout: Request timeout - :return: Returns the uploaded :class:`aiogram.types.file.File` on success. - """ - - call = UploadStickerFile( - user_id=user_id, - sticker=sticker, - sticker_format=sticker_format, - ) - return await self(call, request_timeout=request_timeout) - - async def close_general_forum_topic( - self, - chat_id: Union[int, str], - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to close an open 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#closegeneralforumtopic - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = CloseGeneralForumTopic( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def edit_general_forum_topic( - self, - chat_id: Union[int, str], - name: str, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to edit the name of the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#editgeneralforumtopic - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param name: New topic name, 1-128 characters - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = EditGeneralForumTopic( - chat_id=chat_id, - name=name, - ) - return await self(call, request_timeout=request_timeout) - - async def hide_general_forum_topic( - self, - chat_id: Union[int, str], - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to hide the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights. The topic will be automatically closed if it was open. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#hidegeneralforumtopic - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = HideGeneralForumTopic( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def reopen_general_forum_topic( - self, - chat_id: Union[int, str], - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to reopen a closed 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights. The topic will be automatically unhidden if it was hidden. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#reopengeneralforumtopic - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = ReopenGeneralForumTopic( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def unhide_general_forum_topic( - self, - chat_id: Union[int, str], - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to unhide the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unhidegeneralforumtopic - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = UnhideGeneralForumTopic( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def delete_sticker_set( - self, - name: str, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to delete a sticker set that was created by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletestickerset - - :param name: Sticker set name - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = DeleteStickerSet( - name=name, - ) - return await self(call, request_timeout=request_timeout) - - async def get_my_description( - self, - language_code: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> BotDescription: - """ - Use this method to get the current bot description for the given user language. Returns :class:`aiogram.types.bot_description.BotDescription` on success. - - Source: https://core.telegram.org/bots/api#getmydescription - - :param language_code: A two-letter ISO 639-1 language code or an empty string - :param request_timeout: Request timeout - :return: Returns :class:`aiogram.types.bot_description.BotDescription` on success. - """ - - call = GetMyDescription( - language_code=language_code, - ) - return await self(call, request_timeout=request_timeout) - - async def get_my_short_description( - self, - language_code: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> BotShortDescription: - """ - Use this method to get the current bot short description for the given user language. Returns :class:`aiogram.types.bot_short_description.BotShortDescription` on success. - - Source: https://core.telegram.org/bots/api#getmyshortdescription - - :param language_code: A two-letter ISO 639-1 language code or an empty string - :param request_timeout: Request timeout - :return: Returns :class:`aiogram.types.bot_short_description.BotShortDescription` on success. - """ - - call = GetMyShortDescription( - language_code=language_code, - ) - return await self(call, request_timeout=request_timeout) - - async def set_custom_emoji_sticker_set_thumbnail( - self, - name: str, - custom_emoji_id: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to set the thumbnail of a custom emoji sticker set. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setcustomemojistickersetthumbnail - - :param name: Sticker set name - :param custom_emoji_id: Custom emoji identifier of a sticker from the sticker set; pass an empty string to drop the thumbnail and use the first sticker as the thumbnail. - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetCustomEmojiStickerSetThumbnail( - name=name, - custom_emoji_id=custom_emoji_id, - ) - return await self(call, request_timeout=request_timeout) - - async def set_my_description( - self, - description: Optional[str] = None, - language_code: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to change the bot's description, which is shown in the chat with the bot if the chat is empty. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setmydescription - - :param description: New bot description; 0-512 characters. Pass an empty string to remove the dedicated description for the given language. - :param language_code: A two-letter ISO 639-1 language code. If empty, the description will be applied to all users for whose language there is no dedicated description. - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetMyDescription( - description=description, - language_code=language_code, - ) - return await self(call, request_timeout=request_timeout) - - async def set_my_short_description( - self, - short_description: Optional[str] = None, - language_code: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to change the bot's short description, which is shown on the bot's profile page and is sent together with the link when users share the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setmyshortdescription - - :param short_description: New short description for the bot; 0-120 characters. Pass an empty string to remove the dedicated short description for the given language. - :param language_code: A two-letter ISO 639-1 language code. If empty, the short description will be applied to all users for whose language there is no dedicated short description. - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetMyShortDescription( - short_description=short_description, - language_code=language_code, - ) - return await self(call, request_timeout=request_timeout) - - async def set_sticker_emoji_list( - self, - sticker: str, - emoji_list: List[str], - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to change the list of emoji assigned to a regular or custom emoji sticker. The sticker must belong to a sticker set created by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setstickeremojilist - - :param sticker: File identifier of the sticker - :param emoji_list: A JSON-serialized list of 1-20 emoji associated with the sticker - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetStickerEmojiList( - sticker=sticker, - emoji_list=emoji_list, - ) - return await self(call, request_timeout=request_timeout) - - async def set_sticker_keywords( - self, - sticker: str, - keywords: Optional[List[str]] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to change search keywords assigned to a regular or custom emoji sticker. The sticker must belong to a sticker set created by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setstickerkeywords - - :param sticker: File identifier of the sticker - :param keywords: A JSON-serialized list of 0-20 search keywords for the sticker with total length of up to 64 characters - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetStickerKeywords( - sticker=sticker, - keywords=keywords, - ) - return await self(call, request_timeout=request_timeout) - - async def set_sticker_mask_position( - self, - sticker: str, - mask_position: Optional[MaskPosition] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to change the `mask position `_ of a mask sticker. The sticker must belong to a sticker set that was created by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setstickermaskposition - - :param sticker: File identifier of the sticker - :param mask_position: A JSON-serialized object with the position where the mask should be placed on faces. Omit the parameter to remove the mask position. - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetStickerMaskPosition( - sticker=sticker, - mask_position=mask_position, - ) - return await self(call, request_timeout=request_timeout) - - async def set_sticker_set_thumbnail( - self, - name: str, - user_id: int, - format: str, - thumbnail: Optional[Union[InputFile, str]] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to set the thumbnail of a regular or mask sticker set. The format of the thumbnail file must match the format of the stickers in the set. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setstickersetthumbnail - - :param name: Sticker set name - :param user_id: User identifier of the sticker set owner - :param format: Format of the thumbnail, must be one of 'static' for a **.WEBP** or **.PNG** image, 'animated' for a **.TGS** animation, or 'video' for a **WEBM** video - :param thumbnail: A **.WEBP** or **.PNG** image with the thumbnail, must be up to 128 kilobytes in size and have a width and height of exactly 100px, or a **.TGS** animation with a thumbnail up to 32 kilobytes in size (see `https://core.telegram.org/stickers#animation-requirements `_`https://core.telegram.org/stickers#animation-requirements `_ for animated sticker technical requirements), or a **WEBM** video with the thumbnail up to 32 kilobytes in size; see `https://core.telegram.org/stickers#video-requirements `_`https://core.telegram.org/stickers#video-requirements `_ for video sticker technical requirements. Pass a *file_id* as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » `. Animated and video sticker set thumbnails can't be uploaded via HTTP URL. If omitted, then the thumbnail is dropped and the first sticker is used as the thumbnail. - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetStickerSetThumbnail( - name=name, - user_id=user_id, - format=format, - thumbnail=thumbnail, - ) - return await self(call, request_timeout=request_timeout) - - async def set_sticker_set_title( - self, - name: str, - title: str, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to set the title of a created sticker set. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setstickersettitle - - :param name: Sticker set name - :param title: Sticker set title, 1-64 characters - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetStickerSetTitle( - name=name, - title=title, - ) - return await self(call, request_timeout=request_timeout) - - async def get_my_name( - self, - language_code: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> BotName: - """ - Use this method to get the current bot name for the given user language. Returns :class:`aiogram.types.bot_name.BotName` on success. - - Source: https://core.telegram.org/bots/api#getmyname - - :param language_code: A two-letter ISO 639-1 language code or an empty string - :param request_timeout: Request timeout - :return: Returns :class:`aiogram.types.bot_name.BotName` on success. - """ - - call = GetMyName( - language_code=language_code, - ) - return await self(call, request_timeout=request_timeout) - - async def set_my_name( - self, - name: Optional[str] = None, - language_code: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to change the bot's name. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setmyname - - :param name: New bot name; 0-64 characters. Pass an empty string to remove the dedicated name for the given language. - :param language_code: A two-letter ISO 639-1 language code. If empty, the name will be shown to all users for whose language there is no dedicated name. - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetMyName( - name=name, - language_code=language_code, - ) - return await self(call, request_timeout=request_timeout) - - async def unpin_all_general_forum_topic_messages( - self, - chat_id: Union[int, str], - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to clear the list of pinned messages in a General forum topic. The bot must be an administrator in the chat for this to work and must have the *can_pin_messages* administrator right in the supergroup. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unpinallgeneralforumtopicmessages - - :param chat_id: Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`) - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = UnpinAllGeneralForumTopicMessages( - chat_id=chat_id, - ) - return await self(call, request_timeout=request_timeout) - - async def copy_messages( - self, - chat_id: Union[int, str], - from_chat_id: Union[int, str], - message_ids: List[int], - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - remove_caption: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> List[MessageId]: - """ - Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz :class:`aiogram.methods.poll.Poll` can be copied only if the value of the field *correct_option_id* is known to the bot. The method is analogous to the method :class:`aiogram.methods.forward_messages.ForwardMessages`, but the copied messages don't have a link to the original message. Album grouping is kept for copied messages. On success, an array of :class:`aiogram.types.message_id.MessageId` of the sent messages is returned. - - Source: https://core.telegram.org/bots/api#copymessages - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param from_chat_id: Unique identifier for the chat where the original messages were sent (or channel username in the format :code:`@channelusername`) - :param message_ids: A JSON-serialized list of 1-100 identifiers of messages in the chat *from_chat_id* to copy. The identifiers must be specified in a strictly increasing order. - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param disable_notification: Sends the messages `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent messages from forwarding and saving - :param remove_caption: Pass :code:`True` to copy the messages without their captions - :param request_timeout: Request timeout - :return: On success, an array of :class:`aiogram.types.message_id.MessageId` of the sent messages is returned. - """ - - call = CopyMessages( - chat_id=chat_id, - from_chat_id=from_chat_id, - message_ids=message_ids, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - remove_caption=remove_caption, - ) - return await self(call, request_timeout=request_timeout) - - async def delete_messages( - self, - chat_id: Union[int, str], - message_ids: List[int], - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to delete multiple messages simultaneously. If some of the specified messages can't be found, they are skipped. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletemessages - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param message_ids: A JSON-serialized list of 1-100 identifiers of messages to delete. See :class:`aiogram.methods.delete_message.DeleteMessage` for limitations on which messages can be deleted - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = DeleteMessages( - chat_id=chat_id, - message_ids=message_ids, - ) - return await self(call, request_timeout=request_timeout) - - async def forward_messages( - self, - chat_id: Union[int, str], - from_chat_id: Union[int, str], - message_ids: List[int], - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> List[MessageId]: - """ - Use this method to forward multiple messages of any kind. If some of the specified messages can't be found or forwarded, they are skipped. Service messages and messages with protected content can't be forwarded. Album grouping is kept for forwarded messages. On success, an array of :class:`aiogram.types.message_id.MessageId` of the sent messages is returned. - - Source: https://core.telegram.org/bots/api#forwardmessages - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param from_chat_id: Unique identifier for the chat where the original messages were sent (or channel username in the format :code:`@channelusername`) - :param message_ids: A JSON-serialized list of 1-100 identifiers of messages in the chat *from_chat_id* to forward. The identifiers must be specified in a strictly increasing order. - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param disable_notification: Sends the messages `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the forwarded messages from forwarding and saving - :param request_timeout: Request timeout - :return: On success, an array of :class:`aiogram.types.message_id.MessageId` of the sent messages is returned. - """ - - call = ForwardMessages( - chat_id=chat_id, - from_chat_id=from_chat_id, - message_ids=message_ids, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - ) - return await self(call, request_timeout=request_timeout) - - async def get_user_chat_boosts( - self, - chat_id: Union[int, str], - user_id: int, - request_timeout: Optional[int] = None, - ) -> UserChatBoosts: - """ - Use this method to get the list of boosts added to a chat by a user. Requires administrator rights in the chat. Returns a :class:`aiogram.types.user_chat_boosts.UserChatBoosts` object. - - Source: https://core.telegram.org/bots/api#getuserchatboosts - - :param chat_id: Unique identifier for the chat or username of the channel (in the format :code:`@channelusername`) - :param user_id: Unique identifier of the target user - :param request_timeout: Request timeout - :return: Returns a :class:`aiogram.types.user_chat_boosts.UserChatBoosts` object. - """ - - call = GetUserChatBoosts( - chat_id=chat_id, - user_id=user_id, - ) - return await self(call, request_timeout=request_timeout) - - async def set_message_reaction( - self, - chat_id: Union[int, str], - message_id: int, - reaction: Optional[ - List[Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid]] - ] = None, - is_big: Optional[bool] = None, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to change the chosen reactions on a message. Service messages can't be reacted to. Automatically forwarded messages from a channel to its discussion group have the same available reactions as messages in the channel. Bots can't use paid reactions. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setmessagereaction - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param message_id: Identifier of the target message. If the message belongs to a media group, the reaction is set to the first non-deleted message in the group instead. - :param reaction: A JSON-serialized list of reaction types to set on the message. Currently, as non-premium users, bots can set up to one reaction per message. A custom emoji reaction can be used if it is either already present on the message or explicitly allowed by chat administrators. Paid reactions can't be used by bots. - :param is_big: Pass :code:`True` to set the reaction with a big animation - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = SetMessageReaction( - chat_id=chat_id, - message_id=message_id, - reaction=reaction, - is_big=is_big, - ) - return await self(call, request_timeout=request_timeout) - - async def get_business_connection( - self, - business_connection_id: str, - request_timeout: Optional[int] = None, - ) -> BusinessConnection: - """ - Use this method to get information about the connection of the bot with a business account. Returns a :class:`aiogram.types.business_connection.BusinessConnection` object on success. - - Source: https://core.telegram.org/bots/api#getbusinessconnection - - :param business_connection_id: Unique identifier of the business connection - :param request_timeout: Request timeout - :return: Returns a :class:`aiogram.types.business_connection.BusinessConnection` object on success. - """ - - call = GetBusinessConnection( - business_connection_id=business_connection_id, - ) - return await self(call, request_timeout=request_timeout) - - async def replace_sticker_in_set( - self, - user_id: int, - name: str, - old_sticker: str, - sticker: InputSticker, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Use this method to replace an existing sticker in a sticker set with a new one. The method is equivalent to calling :class:`aiogram.methods.delete_sticker_from_set.DeleteStickerFromSet`, then :class:`aiogram.methods.add_sticker_to_set.AddStickerToSet`, then :class:`aiogram.methods.set_sticker_position_in_set.SetStickerPositionInSet`. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#replacestickerinset - - :param user_id: User identifier of the sticker set owner - :param name: Sticker set name - :param old_sticker: File identifier of the replaced sticker - :param sticker: A JSON-serialized object with information about the added sticker. If exactly the same sticker had already been added to the set, then the set remains unchanged. - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = ReplaceStickerInSet( - user_id=user_id, - name=name, - old_sticker=old_sticker, - sticker=sticker, - ) - return await self(call, request_timeout=request_timeout) - - async def refund_star_payment( - self, - user_id: int, - telegram_payment_charge_id: str, - request_timeout: Optional[int] = None, - ) -> bool: - """ - Refunds a successful payment in `Telegram Stars `_. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#refundstarpayment - - :param user_id: Identifier of the user whose payment will be refunded - :param telegram_payment_charge_id: Telegram payment identifier - :param request_timeout: Request timeout - :return: Returns :code:`True` on success. - """ - - call = RefundStarPayment( - user_id=user_id, - telegram_payment_charge_id=telegram_payment_charge_id, - ) - return await self(call, request_timeout=request_timeout) - - async def get_star_transactions( - self, - offset: Optional[int] = None, - limit: Optional[int] = None, - request_timeout: Optional[int] = None, - ) -> StarTransactions: - """ - Returns the bot's Telegram Star transactions in chronological order. On success, returns a :class:`aiogram.types.star_transactions.StarTransactions` object. - - Source: https://core.telegram.org/bots/api#getstartransactions - - :param offset: Number of transactions to skip in the response - :param limit: The maximum number of transactions to be retrieved. Values between 1-100 are accepted. Defaults to 100. - :param request_timeout: Request timeout - :return: On success, returns a :class:`aiogram.types.star_transactions.StarTransactions` object. - """ - - call = GetStarTransactions( - offset=offset, - limit=limit, - ) - return await self(call, request_timeout=request_timeout) - - async def send_paid_media( - self, - chat_id: Union[int, str], - star_count: int, - media: List[Union[InputPaidMediaPhoto, InputPaidMediaVideo]], - business_connection_id: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[str] = None, - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - request_timeout: Optional[int] = None, - ) -> Message: - """ - Use this method to send paid media. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendpaidmedia - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`). If the chat is a channel, all Telegram Star proceeds from this media will be credited to the chat's balance. Otherwise, they will be credited to the bot's balance. - :param star_count: The number of Telegram Stars that must be paid to buy access to the media - :param media: A JSON-serialized array describing the media to be sent; up to 10 items - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param caption: Media caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the media caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param request_timeout: Request timeout - :return: On success, the sent :class:`aiogram.types.message.Message` is returned. - """ - - call = SendPaidMedia( - chat_id=chat_id, - star_count=star_count, - media=media, - business_connection_id=business_connection_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - disable_notification=disable_notification, - protect_content=protect_content, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - ) - return await self(call, request_timeout=request_timeout) - - async def create_chat_subscription_invite_link( - self, - chat_id: Union[int, str], - subscription_period: Union[datetime.datetime, datetime.timedelta, int], - subscription_price: int, - name: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> ChatInviteLink: - """ - Use this method to create a `subscription invite link `_ for a channel chat. The bot must have the *can_invite_users* administrator rights. The link can be edited using the method :class:`aiogram.methods.edit_chat_subscription_invite_link.EditChatSubscriptionInviteLink` or revoked using the method :class:`aiogram.methods.revoke_chat_invite_link.RevokeChatInviteLink`. Returns the new invite link as a :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - - Source: https://core.telegram.org/bots/api#createchatsubscriptioninvitelink - - :param chat_id: Unique identifier for the target channel chat or username of the target channel (in the format :code:`@channelusername`) - :param subscription_period: The number of seconds the subscription will be active for before the next payment. Currently, it must always be 2592000 (30 days). - :param subscription_price: The amount of Telegram Stars a user must pay initially and after each subsequent subscription period to be a member of the chat; 1-2500 - :param name: Invite link name; 0-32 characters - :param request_timeout: Request timeout - :return: Returns the new invite link as a :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - """ - - call = CreateChatSubscriptionInviteLink( - chat_id=chat_id, - subscription_period=subscription_period, - subscription_price=subscription_price, - name=name, - ) - return await self(call, request_timeout=request_timeout) - - async def edit_chat_subscription_invite_link( - self, - chat_id: Union[int, str], - invite_link: str, - name: Optional[str] = None, - request_timeout: Optional[int] = None, - ) -> ChatInviteLink: - """ - Use this method to edit a subscription invite link created by the bot. The bot must have the *can_invite_users* administrator rights. Returns the edited invite link as a :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - - Source: https://core.telegram.org/bots/api#editchatsubscriptioninvitelink - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param invite_link: The invite link to edit - :param name: Invite link name; 0-32 characters - :param request_timeout: Request timeout - :return: Returns the edited invite link as a :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - """ - - call = EditChatSubscriptionInviteLink( - chat_id=chat_id, - invite_link=invite_link, - name=name, - ) - return await self(call, request_timeout=request_timeout) diff --git a/env/Lib/site-packages/aiogram/client/context_controller.py b/env/Lib/site-packages/aiogram/client/context_controller.py deleted file mode 100644 index 97795a7..0000000 --- a/env/Lib/site-packages/aiogram/client/context_controller.py +++ /dev/null @@ -1,33 +0,0 @@ -from typing import TYPE_CHECKING, Any, Optional - -from pydantic import BaseModel, PrivateAttr -from typing_extensions import Self - -if TYPE_CHECKING: - from aiogram.client.bot import Bot - - -class BotContextController(BaseModel): - _bot: Optional["Bot"] = PrivateAttr() - - def model_post_init(self, __context: Any) -> None: - self._bot = __context.get("bot") if __context else None - - def as_(self, bot: Optional["Bot"]) -> Self: - """ - Bind object to a bot instance. - - :param bot: Bot instance - :return: self - """ - self._bot = bot - return self - - @property - def bot(self) -> Optional["Bot"]: - """ - Get bot instance. - - :return: Bot instance - """ - return self._bot diff --git a/env/Lib/site-packages/aiogram/client/default.py b/env/Lib/site-packages/aiogram/client/default.py deleted file mode 100644 index 6c857be..0000000 --- a/env/Lib/site-packages/aiogram/client/default.py +++ /dev/null @@ -1,85 +0,0 @@ -from __future__ import annotations - -import sys -from dataclasses import dataclass -from typing import TYPE_CHECKING, Any, Dict, Optional - -if TYPE_CHECKING: - from aiogram.types import LinkPreviewOptions - - -# @dataclass ?? -class Default: - # Is not a dataclass because of JSON serialization. - - __slots__ = ("_name",) - - def __init__(self, name: str) -> None: - self._name = name - - @property - def name(self) -> str: - return self._name - - def __str__(self) -> str: - return f"Default({self._name!r})" - - def __repr__(self) -> str: - return f"<{self}>" - - -_dataclass_properties: Dict[str, Any] = {} -if sys.version_info >= (3, 10): - # Speedup attribute access for dataclasses in Python 3.10+ - _dataclass_properties.update({"slots": True, "kw_only": True}) - - -@dataclass(**_dataclass_properties) -class DefaultBotProperties: - """ - Default bot properties. - """ - - parse_mode: Optional[str] = None - """Default parse mode for messages.""" - disable_notification: Optional[bool] = None - """Sends the message silently. Users will receive a notification with no sound.""" - protect_content: Optional[bool] = None - """Protects content from copying.""" - allow_sending_without_reply: Optional[bool] = None - """Allows to send messages without reply.""" - link_preview: Optional[LinkPreviewOptions] = None - """Link preview settings.""" - link_preview_is_disabled: Optional[bool] = None - """Disables link preview.""" - link_preview_prefer_small_media: Optional[bool] = None - """Prefer small media in link preview.""" - link_preview_prefer_large_media: Optional[bool] = None - """Prefer large media in link preview.""" - link_preview_show_above_text: Optional[bool] = None - """Show link preview above text.""" - show_caption_above_media: Optional[bool] = None - """Show caption above media.""" - - def __post_init__(self) -> None: - has_any_link_preview_option = any( - ( - self.link_preview_is_disabled, - self.link_preview_prefer_small_media, - self.link_preview_prefer_large_media, - self.link_preview_show_above_text, - ) - ) - - if has_any_link_preview_option and self.link_preview is None: - from ..types import LinkPreviewOptions - - self.link_preview = LinkPreviewOptions( - is_disabled=self.link_preview_is_disabled, - prefer_small_media=self.link_preview_prefer_small_media, - prefer_large_media=self.link_preview_prefer_large_media, - show_above_text=self.link_preview_show_above_text, - ) - - def __getitem__(self, item: str) -> Any: - return getattr(self, item, None) diff --git a/env/Lib/site-packages/aiogram/client/session/__init__.py b/env/Lib/site-packages/aiogram/client/session/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/Lib/site-packages/aiogram/client/session/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/client/session/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index b9e3c263e29902f6d4a5842b6aa59b21d615b12e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmZ3^%ge<81lwkxNdwW3K?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCU%@U`G2!_| z*)h)fDVcfcG1;X>i6!|(@k#k5F{ycFF+Q0|F~ylBsk#M;$=QkNsl_pgnfd8OiMjg8 zIhm<>CHlpw#l@NVdHV73nR%Hd@$q^EmA^P_a`RJ4b5iY!Sb=tcTv5yqBt9@RGBSQ( KfDuK^KrsL%OfvZZ diff --git a/env/Lib/site-packages/aiogram/client/session/__pycache__/aiohttp.cpython-311.pyc b/env/Lib/site-packages/aiogram/client/session/__pycache__/aiohttp.cpython-311.pyc deleted file mode 100644 index 1f1da0f47505aa5b3ddcabcd99a8d550f9b52585..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11243 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 diff --git a/env/Lib/site-packages/aiogram/client/session/__pycache__/base.cpython-311.pyc b/env/Lib/site-packages/aiogram/client/session/__pycache__/base.cpython-311.pyc deleted file mode 100644 index 41405967faf2cd2f99c84fd5bc5ebd8a199bfe88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11434 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 diff --git a/env/Lib/site-packages/aiogram/client/session/aiohttp.py b/env/Lib/site-packages/aiogram/client/session/aiohttp.py deleted file mode 100644 index 69f36bf..0000000 --- a/env/Lib/site-packages/aiogram/client/session/aiohttp.py +++ /dev/null @@ -1,215 +0,0 @@ -from __future__ import annotations - -import asyncio -import ssl -from typing import ( - TYPE_CHECKING, - Any, - AsyncGenerator, - Dict, - Iterable, - List, - Optional, - Tuple, - Type, - Union, - cast, -) - -import certifi -from aiohttp import BasicAuth, ClientError, ClientSession, FormData, TCPConnector -from aiohttp.hdrs import USER_AGENT -from aiohttp.http import SERVER_SOFTWARE - -from aiogram.__meta__ import __version__ -from aiogram.methods import TelegramMethod - -from ...exceptions import TelegramNetworkError -from ...methods.base import TelegramType -from ...types import InputFile -from .base import BaseSession - -if TYPE_CHECKING: - from ..bot import Bot - -_ProxyBasic = Union[str, Tuple[str, BasicAuth]] -_ProxyChain = Iterable[_ProxyBasic] -_ProxyType = Union[_ProxyChain, _ProxyBasic] - - -def _retrieve_basic(basic: _ProxyBasic) -> Dict[str, Any]: - from aiohttp_socks.utils import parse_proxy_url # type: ignore - - proxy_auth: Optional[BasicAuth] = None - - if isinstance(basic, str): - proxy_url = basic - else: - proxy_url, proxy_auth = basic - - proxy_type, host, port, username, password = parse_proxy_url(proxy_url) - if isinstance(proxy_auth, BasicAuth): - username = proxy_auth.login - password = proxy_auth.password - - return { - "proxy_type": proxy_type, - "host": host, - "port": port, - "username": username, - "password": password, - "rdns": True, - } - - -def _prepare_connector(chain_or_plain: _ProxyType) -> Tuple[Type["TCPConnector"], Dict[str, Any]]: - from aiohttp_socks import ( # type: ignore - ChainProxyConnector, - ProxyConnector, - ProxyInfo, - ) - - # since tuple is Iterable(compatible with _ProxyChain) object, we assume that - # user wants chained proxies if tuple is a pair of string(url) and BasicAuth - if isinstance(chain_or_plain, str) or ( - isinstance(chain_or_plain, tuple) and len(chain_or_plain) == 2 - ): - chain_or_plain = cast(_ProxyBasic, chain_or_plain) - return ProxyConnector, _retrieve_basic(chain_or_plain) - - chain_or_plain = cast(_ProxyChain, chain_or_plain) - infos: List[ProxyInfo] = [] - for basic in chain_or_plain: - infos.append(ProxyInfo(**_retrieve_basic(basic))) - - return ChainProxyConnector, {"proxy_infos": infos} - - -class AiohttpSession(BaseSession): - def __init__( - self, proxy: Optional[_ProxyType] = None, limit: int = 100, **kwargs: Any - ) -> None: - """ - Client session based on aiohttp. - - :param proxy: The proxy to be used for requests. Default is None. - :param limit: The total number of simultaneous connections. Default is 100. - :param kwargs: Additional keyword arguments. - """ - super().__init__(**kwargs) - - self._session: Optional[ClientSession] = None - self._connector_type: Type[TCPConnector] = TCPConnector - self._connector_init: Dict[str, Any] = { - "ssl": ssl.create_default_context(cafile=certifi.where()), - "limit": limit, - "ttl_dns_cache": 3600, # Workaround for https://github.com/aiogram/aiogram/issues/1500 - } - self._should_reset_connector = True # flag determines connector state - self._proxy: Optional[_ProxyType] = None - - if proxy is not None: - try: - self._setup_proxy_connector(proxy) - except ImportError as exc: # pragma: no cover - raise RuntimeError( - "In order to use aiohttp client for proxy requests, install " - "https://pypi.org/project/aiohttp-socks/" - ) from exc - - def _setup_proxy_connector(self, proxy: _ProxyType) -> None: - self._connector_type, self._connector_init = _prepare_connector(proxy) - self._proxy = proxy - - @property - def proxy(self) -> Optional[_ProxyType]: - return self._proxy - - @proxy.setter - def proxy(self, proxy: _ProxyType) -> None: - self._setup_proxy_connector(proxy) - self._should_reset_connector = True - - async def create_session(self) -> ClientSession: - if self._should_reset_connector: - await self.close() - - if self._session is None or self._session.closed: - self._session = ClientSession( - connector=self._connector_type(**self._connector_init), - headers={ - USER_AGENT: f"{SERVER_SOFTWARE} aiogram/{__version__}", - }, - ) - self._should_reset_connector = False - - return self._session - - async def close(self) -> None: - if self._session is not None and not self._session.closed: - await self._session.close() - - # Wait 250 ms for the underlying SSL connections to close - # https://docs.aiohttp.org/en/stable/client_advanced.html#graceful-shutdown - await asyncio.sleep(0.25) - - def build_form_data(self, bot: Bot, method: TelegramMethod[TelegramType]) -> FormData: - form = FormData(quote_fields=False) - files: Dict[str, InputFile] = {} - for key, value in method.model_dump(warnings=False).items(): - value = self.prepare_value(value, bot=bot, files=files) - if not value: - continue - form.add_field(key, value) - for key, value in files.items(): - form.add_field( - key, - value.read(bot), - filename=value.filename or key, - ) - return form - - async def make_request( - self, bot: Bot, method: TelegramMethod[TelegramType], timeout: Optional[int] = None - ) -> TelegramType: - session = await self.create_session() - - url = self.api.api_url(token=bot.token, method=method.__api_method__) - form = self.build_form_data(bot=bot, method=method) - - try: - async with session.post( - url, data=form, timeout=self.timeout if timeout is None else timeout - ) as resp: - raw_result = await resp.text() - except asyncio.TimeoutError: - raise TelegramNetworkError(method=method, message="Request timeout error") - except ClientError as e: - raise TelegramNetworkError(method=method, message=f"{type(e).__name__}: {e}") - response = self.check_response( - bot=bot, method=method, status_code=resp.status, content=raw_result - ) - return cast(TelegramType, response.result) - - async def stream_content( - self, - url: str, - headers: Optional[Dict[str, Any]] = None, - timeout: int = 30, - chunk_size: int = 65536, - raise_for_status: bool = True, - ) -> AsyncGenerator[bytes, None]: - if headers is None: - headers = {} - - session = await self.create_session() - - async with session.get( - url, timeout=timeout, headers=headers, raise_for_status=raise_for_status - ) as resp: - async for chunk in resp.content.iter_chunked(chunk_size): - yield chunk - - async def __aenter__(self) -> AiohttpSession: - await self.create_session() - return self diff --git a/env/Lib/site-packages/aiogram/client/session/base.py b/env/Lib/site-packages/aiogram/client/session/base.py deleted file mode 100644 index 82ec469..0000000 --- a/env/Lib/site-packages/aiogram/client/session/base.py +++ /dev/null @@ -1,265 +0,0 @@ -from __future__ import annotations - -import abc -import datetime -import json -import secrets -from enum import Enum -from http import HTTPStatus -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - AsyncGenerator, - Callable, - Dict, - Final, - Optional, - Type, - cast, -) - -from pydantic import ValidationError - -from aiogram.exceptions import ( - ClientDecodeError, - RestartingTelegram, - TelegramAPIError, - TelegramBadRequest, - TelegramConflictError, - TelegramEntityTooLarge, - TelegramForbiddenError, - TelegramMigrateToChat, - TelegramNotFound, - TelegramRetryAfter, - TelegramServerError, - TelegramUnauthorizedError, -) - -from ...methods import Response, TelegramMethod -from ...methods.base import TelegramType -from ...types import InputFile, TelegramObject -from ..default import Default -from ..telegram import PRODUCTION, TelegramAPIServer -from .middlewares.manager import RequestMiddlewareManager - -if TYPE_CHECKING: - from ..bot import Bot - -_JsonLoads = Callable[..., Any] -_JsonDumps = Callable[..., str] - -DEFAULT_TIMEOUT: Final[float] = 60.0 - - -class BaseSession(abc.ABC): - """ - This is base class for all HTTP sessions in aiogram. - - If you want to create your own session, you must inherit from this class. - """ - - def __init__( - self, - api: TelegramAPIServer = PRODUCTION, - json_loads: _JsonLoads = json.loads, - json_dumps: _JsonDumps = json.dumps, - timeout: float = DEFAULT_TIMEOUT, - ) -> None: - """ - - :param api: Telegram Bot API URL patterns - :param json_loads: JSON loader - :param json_dumps: JSON dumper - :param timeout: Session scope request timeout - """ - self.api = api - self.json_loads = json_loads - self.json_dumps = json_dumps - self.timeout = timeout - - self.middleware = RequestMiddlewareManager() - - def check_response( - self, bot: Bot, method: TelegramMethod[TelegramType], status_code: int, content: str - ) -> Response[TelegramType]: - """ - Check response status - """ - try: - json_data = self.json_loads(content) - except Exception as e: - # Handled error type can't be classified as specific error - # in due to decoder can be customized and raise any exception - - raise ClientDecodeError("Failed to decode object", e, content) - - try: - response_type = Response[method.__returning__] # type: ignore - response = response_type.model_validate(json_data, context={"bot": bot}) - except ValidationError as e: - raise ClientDecodeError("Failed to deserialize object", e, json_data) - - if HTTPStatus.OK <= status_code <= HTTPStatus.IM_USED and response.ok: - return response - - description = cast(str, response.description) - - if parameters := response.parameters: - if parameters.retry_after: - raise TelegramRetryAfter( - method=method, message=description, retry_after=parameters.retry_after - ) - if parameters.migrate_to_chat_id: - raise TelegramMigrateToChat( - method=method, - message=description, - migrate_to_chat_id=parameters.migrate_to_chat_id, - ) - if status_code == HTTPStatus.BAD_REQUEST: - raise TelegramBadRequest(method=method, message=description) - if status_code == HTTPStatus.NOT_FOUND: - raise TelegramNotFound(method=method, message=description) - if status_code == HTTPStatus.CONFLICT: - raise TelegramConflictError(method=method, message=description) - if status_code == HTTPStatus.UNAUTHORIZED: - raise TelegramUnauthorizedError(method=method, message=description) - if status_code == HTTPStatus.FORBIDDEN: - raise TelegramForbiddenError(method=method, message=description) - if status_code == HTTPStatus.REQUEST_ENTITY_TOO_LARGE: - raise TelegramEntityTooLarge(method=method, message=description) - if status_code >= HTTPStatus.INTERNAL_SERVER_ERROR: - if "restart" in description: - raise RestartingTelegram(method=method, message=description) - raise TelegramServerError(method=method, message=description) - - raise TelegramAPIError( - method=method, - message=description, - ) - - @abc.abstractmethod - async def close(self) -> None: # pragma: no cover - """ - Close client session - """ - pass - - @abc.abstractmethod - async def make_request( - self, - bot: Bot, - method: TelegramMethod[TelegramType], - timeout: Optional[int] = None, - ) -> TelegramType: # pragma: no cover - """ - Make request to Telegram Bot API - - :param bot: Bot instance - :param method: Method instance - :param timeout: Request timeout - :return: - :raise TelegramApiError: - """ - pass - - @abc.abstractmethod - async def stream_content( - self, - url: str, - headers: Optional[Dict[str, Any]] = None, - timeout: int = 30, - chunk_size: int = 65536, - raise_for_status: bool = True, - ) -> AsyncGenerator[bytes, None]: # pragma: no cover - """ - Stream reader - """ - yield b"" - - def prepare_value( - self, - value: Any, - bot: Bot, - files: Dict[str, Any], - _dumps_json: bool = True, - ) -> Any: - """ - Prepare value before send - """ - if value is None: - return None - if isinstance(value, str): - return value - if isinstance(value, Default): - default_value = bot.default[value.name] - return self.prepare_value(default_value, bot=bot, files=files, _dumps_json=_dumps_json) - if isinstance(value, InputFile): - key = secrets.token_urlsafe(10) - files[key] = value - return f"attach://{key}" - if isinstance(value, dict): - value = { - key: prepared_item - for key, item in value.items() - if ( - prepared_item := self.prepare_value( - item, bot=bot, files=files, _dumps_json=False - ) - ) - is not None - } - if _dumps_json: - return self.json_dumps(value) - return value - if isinstance(value, list): - value = [ - prepared_item - for item in value - if ( - prepared_item := self.prepare_value( - item, bot=bot, files=files, _dumps_json=False - ) - ) - is not None - ] - if _dumps_json: - return self.json_dumps(value) - return value - if isinstance(value, datetime.timedelta): - now = datetime.datetime.now() - return str(round((now + value).timestamp())) - if isinstance(value, datetime.datetime): - return str(round(value.timestamp())) - if isinstance(value, Enum): - return self.prepare_value(value.value, bot=bot, files=files) - if isinstance(value, TelegramObject): - return self.prepare_value( - value.model_dump(warnings=False), - bot=bot, - files=files, - _dumps_json=_dumps_json, - ) - if _dumps_json: - return self.json_dumps(value) - return value - - async def __call__( - self, - bot: Bot, - method: TelegramMethod[TelegramType], - timeout: Optional[int] = None, - ) -> TelegramType: - middleware = self.middleware.wrap_middlewares(self.make_request, timeout=timeout) - return cast(TelegramType, await middleware(bot, method)) - - async def __aenter__(self) -> BaseSession: - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_value: Optional[BaseException], - traceback: Optional[TracebackType], - ) -> None: - await self.close() diff --git a/env/Lib/site-packages/aiogram/client/session/middlewares/__init__.py b/env/Lib/site-packages/aiogram/client/session/middlewares/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/Lib/site-packages/aiogram/client/session/middlewares/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/client/session/middlewares/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e13aa3e027f63e17157e48cd72cfac4f1cb409ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmZ3^%ge<81lwkxNdwW3K?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCU-2$hG2!_| z*)h)fDVcfcG1;X>i6!|(@k#k5F{ycFF+Q0|F~ylBsk#M;$=QkNsl_pgnfd8OiMjg8 zIhm<>CHlpw#l@NVdHT7TDJeOr<%vb9#rpB_nR%Hd@$q^EmA^P_a`RJ4b5iY!Sb_F| WTvW^tBt9@RGBSQ(fDuK^KrsLv?l;8% diff --git a/env/Lib/site-packages/aiogram/client/session/middlewares/__pycache__/base.cpython-311.pyc b/env/Lib/site-packages/aiogram/client/session/middlewares/__pycache__/base.cpython-311.pyc deleted file mode 100644 index 1ecc3eed2450e33bf817c934b25d0803ba0fbe10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2553 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 diff --git a/env/Lib/site-packages/aiogram/client/session/middlewares/base.py b/env/Lib/site-packages/aiogram/client/session/middlewares/base.py deleted file mode 100644 index c5f3e7c..0000000 --- a/env/Lib/site-packages/aiogram/client/session/middlewares/base.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import annotations - -from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Protocol - -from aiogram.methods import Response, TelegramMethod -from aiogram.methods.base import TelegramType - -if TYPE_CHECKING: - from ...bot import Bot - - -class NextRequestMiddlewareType(Protocol[TelegramType]): # pragma: no cover - async def __call__( - self, - bot: "Bot", - method: TelegramMethod[TelegramType], - ) -> Response[TelegramType]: - pass - - -class RequestMiddlewareType(Protocol): # pragma: no cover - async def __call__( - self, - make_request: NextRequestMiddlewareType[TelegramType], - bot: "Bot", - method: TelegramMethod[TelegramType], - ) -> Response[TelegramType]: - pass - - -class BaseRequestMiddleware(ABC): - """ - Generic middleware class - """ - - @abstractmethod - async def __call__( - self, - make_request: NextRequestMiddlewareType[TelegramType], - bot: "Bot", - method: TelegramMethod[TelegramType], - ) -> Response[TelegramType]: - """ - Execute middleware - - :param make_request: Wrapped make_request in middlewares chain - :param bot: bot for request making - :param method: Request method (Subclass of :class:`aiogram.methods.base.TelegramMethod`) - - :return: :class:`aiogram.methods.Response` - """ - pass diff --git a/env/Lib/site-packages/aiogram/client/session/middlewares/manager.py b/env/Lib/site-packages/aiogram/client/session/middlewares/manager.py deleted file mode 100644 index 2346715..0000000 --- a/env/Lib/site-packages/aiogram/client/session/middlewares/manager.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import annotations - -from functools import partial -from typing import Any, Callable, List, Optional, Sequence, Union, cast, overload - -from aiogram.client.session.middlewares.base import ( - NextRequestMiddlewareType, - RequestMiddlewareType, -) -from aiogram.methods.base import TelegramType - - -class RequestMiddlewareManager(Sequence[RequestMiddlewareType]): - def __init__(self) -> None: - self._middlewares: List[RequestMiddlewareType] = [] - - def register( - self, - middleware: RequestMiddlewareType, - ) -> RequestMiddlewareType: - self._middlewares.append(middleware) - return middleware - - def unregister(self, middleware: RequestMiddlewareType) -> None: - self._middlewares.remove(middleware) - - def __call__( - self, - middleware: Optional[RequestMiddlewareType] = None, - ) -> Union[ - Callable[[RequestMiddlewareType], RequestMiddlewareType], - RequestMiddlewareType, - ]: - if middleware is None: - return self.register - return self.register(middleware) - - @overload - def __getitem__(self, item: int) -> RequestMiddlewareType: - pass - - @overload - def __getitem__(self, item: slice) -> Sequence[RequestMiddlewareType]: - pass - - def __getitem__( - self, item: Union[int, slice] - ) -> Union[RequestMiddlewareType, Sequence[RequestMiddlewareType]]: - return self._middlewares[item] - - def __len__(self) -> int: - return len(self._middlewares) - - def wrap_middlewares( - self, - callback: NextRequestMiddlewareType[TelegramType], - **kwargs: Any, - ) -> NextRequestMiddlewareType[TelegramType]: - middleware = partial(callback, **kwargs) - for m in reversed(self._middlewares): - middleware = partial(m, middleware) - return cast(NextRequestMiddlewareType[TelegramType], middleware) diff --git a/env/Lib/site-packages/aiogram/client/session/middlewares/request_logging.py b/env/Lib/site-packages/aiogram/client/session/middlewares/request_logging.py deleted file mode 100644 index af7b9d6..0000000 --- a/env/Lib/site-packages/aiogram/client/session/middlewares/request_logging.py +++ /dev/null @@ -1,37 +0,0 @@ -import logging -from typing import TYPE_CHECKING, Any, List, Optional, Type - -from aiogram import loggers -from aiogram.methods import TelegramMethod -from aiogram.methods.base import Response, TelegramType - -from .base import BaseRequestMiddleware, NextRequestMiddlewareType - -if TYPE_CHECKING: - from ...bot import Bot - -logger = logging.getLogger(__name__) - - -class RequestLogging(BaseRequestMiddleware): - def __init__(self, ignore_methods: Optional[List[Type[TelegramMethod[Any]]]] = None): - """ - Middleware for logging outgoing requests - - :param ignore_methods: methods to ignore in logging middleware - """ - self.ignore_methods = ignore_methods if ignore_methods else [] - - async def __call__( - self, - make_request: NextRequestMiddlewareType[TelegramType], - bot: "Bot", - method: TelegramMethod[TelegramType], - ) -> Response[TelegramType]: - if type(method) not in self.ignore_methods: - loggers.middlewares.info( - "Make request with method=%r by bot id=%d", - type(method).__name__, - bot.id, - ) - return await make_request(bot, method) diff --git a/env/Lib/site-packages/aiogram/client/telegram.py b/env/Lib/site-packages/aiogram/client/telegram.py deleted file mode 100644 index 5e29722..0000000 --- a/env/Lib/site-packages/aiogram/client/telegram.py +++ /dev/null @@ -1,103 +0,0 @@ -from abc import ABC, abstractmethod -from dataclasses import dataclass -from pathlib import Path -from typing import Any, Union - - -class FilesPathWrapper(ABC): - @abstractmethod - def to_local(self, path: Union[Path, str]) -> Union[Path, str]: - pass - - @abstractmethod - def to_server(self, path: Union[Path, str]) -> Union[Path, str]: - pass - - -class BareFilesPathWrapper(FilesPathWrapper): - def to_local(self, path: Union[Path, str]) -> Union[Path, str]: - return path - - def to_server(self, path: Union[Path, str]) -> Union[Path, str]: - return path - - -class SimpleFilesPathWrapper(FilesPathWrapper): - def __init__(self, server_path: Path, local_path: Path) -> None: - self.server_path = server_path - self.local_path = local_path - - @classmethod - def _resolve( - cls, base1: Union[Path, str], base2: Union[Path, str], value: Union[Path, str] - ) -> Path: - relative = Path(value).relative_to(base1) - return base2 / relative - - def to_local(self, path: Union[Path, str]) -> Union[Path, str]: - return self._resolve(base1=self.server_path, base2=self.local_path, value=path) - - def to_server(self, path: Union[Path, str]) -> Union[Path, str]: - return self._resolve(base1=self.local_path, base2=self.server_path, value=path) - - -@dataclass(frozen=True) -class TelegramAPIServer: - """ - Base config for API Endpoints - """ - - base: str - """Base URL""" - file: str - """Files URL""" - is_local: bool = False - """Mark this server is - in `local mode `_.""" - wrap_local_file: FilesPathWrapper = BareFilesPathWrapper() - """Callback to wrap files path in local mode""" - - def api_url(self, token: str, method: str) -> str: - """ - Generate URL for API methods - - :param token: Bot token - :param method: API method name (case insensitive) - :return: URL - """ - return self.base.format(token=token, method=method) - - def file_url(self, token: str, path: str) -> str: - """ - Generate URL for downloading files - - :param token: Bot token - :param path: file path - :return: URL - """ - return self.file.format(token=token, path=path) - - @classmethod - def from_base(cls, base: str, **kwargs: Any) -> "TelegramAPIServer": - """ - Use this method to auto-generate TelegramAPIServer instance from base URL - - :param base: Base URL - :return: instance of :class:`TelegramAPIServer` - """ - base = base.rstrip("/") - return cls( - base=f"{base}/bot{{token}}/{{method}}", - file=f"{base}/file/bot{{token}}/{{path}}", - **kwargs, - ) - - -PRODUCTION = TelegramAPIServer( - base="https://api.telegram.org/bot{token}/{method}", - file="https://api.telegram.org/file/bot{token}/{path}", -) -TEST = TelegramAPIServer( - base="https://api.telegram.org/bot{token}/test/{method}", - file="https://api.telegram.org/file/bot{token}/test/{path}", -) diff --git a/env/Lib/site-packages/aiogram/dispatcher/__init__.py b/env/Lib/site-packages/aiogram/dispatcher/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/Lib/site-packages/aiogram/dispatcher/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/dispatcher/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index f299e3c08e916429b9137209927369a8360ba50b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmZ3^%ge<81lwkxNdwW3K?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCU;ZvuG2!_| z*)h)fDVcfcG1;X>i6!|(@k#k5F{ycFF+Q0|F~ylBsk#M;$=QkNsl_pgnfd8OiMjeI znZ*T(CCM47Mf&manR%Hd@$q^EmA^P_a`RJ4b5iY!Sb^q)Tu{spBt9@RGBSQ(fDuK^ GKrsL}iZN;c diff --git a/env/Lib/site-packages/aiogram/dispatcher/__pycache__/dispatcher.cpython-311.pyc b/env/Lib/site-packages/aiogram/dispatcher/__pycache__/dispatcher.cpython-311.pyc deleted file mode 100644 index 75a1afa70796dbf000a990142f13e7027afec6e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29372 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 z 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 NikAPOPAy%W{{uOs1 None: - """ - Root router - - :param storage: Storage for FSM - :param fsm_strategy: FSM strategy - :param events_isolation: Events isolation - :param disable_fsm: Disable FSM, note that if you disable FSM - then you should not use storage and events isolation - :param kwargs: Other arguments, will be passed as keyword arguments to handlers - """ - super(Dispatcher, self).__init__(name=name) - - if storage and not isinstance(storage, BaseStorage): - raise TypeError( - f"FSM storage should be instance of 'BaseStorage' not {type(storage).__name__}" - ) - - # Telegram API provides originally only one event type - Update - # For making easily interactions with events here is registered handler which helps - # to separate Update to different event types like Message, CallbackQuery etc. - self.update = self.observers["update"] = TelegramEventObserver( - router=self, event_name="update" - ) - self.update.register(self._listen_update) - - # Error handlers should work is out of all other functions - # and should be registered before all others middlewares - self.update.outer_middleware(ErrorsMiddleware(self)) - - # User context middleware makes small optimization for all other builtin - # middlewares via caching the user and chat instances in the event context - self.update.outer_middleware(UserContextMiddleware()) - - # FSM middleware should always be registered after User context middleware - # because here is used context from previous step - self.fsm = FSMContextMiddleware( - storage=storage or MemoryStorage(), - strategy=fsm_strategy, - events_isolation=events_isolation or DisabledEventIsolation(), - ) - if not disable_fsm: - # Note that when FSM middleware is disabled, the event isolation is also disabled - # Because the isolation mechanism is a part of the FSM - self.update.outer_middleware(self.fsm) - self.shutdown.register(self.fsm.close) - - self.workflow_data: Dict[str, Any] = kwargs - self._running_lock = Lock() - self._stop_signal: Optional[Event] = None - self._stopped_signal: Optional[Event] = None - self._handle_update_tasks: Set[asyncio.Task[Any]] = set() - - def __getitem__(self, item: str) -> Any: - return self.workflow_data[item] - - def __setitem__(self, key: str, value: Any) -> None: - self.workflow_data[key] = value - - def __delitem__(self, key: str) -> None: - del self.workflow_data[key] - - def get(self, key: str, /, default: Optional[Any] = None) -> Optional[Any]: - return self.workflow_data.get(key, default) - - @property - def storage(self) -> BaseStorage: - return self.fsm.storage - - @property - def parent_router(self) -> Optional[Router]: - """ - Dispatcher has no parent router and can't be included to any other routers or dispatchers - - :return: - """ - return None # noqa: RET501 - - @parent_router.setter - def parent_router(self, value: Router) -> None: - """ - Dispatcher is root Router then configuring parent router is not allowed - - :param value: - :return: - """ - raise RuntimeError("Dispatcher can not be attached to another Router.") - - async def feed_update(self, bot: Bot, update: Update, **kwargs: Any) -> Any: - """ - Main entry point for incoming updates - Response of this method can be used as Webhook response - - :param bot: - :param update: - """ - loop = asyncio.get_running_loop() - handled = False - start_time = loop.time() - - if update.bot != bot: - # Re-mounting update to the current bot instance for making possible to - # use it in shortcuts. - # Here is update is re-created because we need to propagate context to - # all nested objects and attributes of the Update, but it - # is impossible without roundtrip to JSON :( - # The preferred way is that pass already mounted Bot instance to this update - # before call feed_update method - update = Update.model_validate(update.model_dump(), context={"bot": bot}) - - try: - response = await self.update.wrap_outer_middleware( - self.update.trigger, - update, - { - **self.workflow_data, - **kwargs, - "bot": bot, - }, - ) - handled = response is not UNHANDLED - return response - finally: - finish_time = loop.time() - duration = (finish_time - start_time) * 1000 - loggers.event.info( - "Update id=%s is %s. Duration %d ms by bot id=%d", - update.update_id, - "handled" if handled else "not handled", - duration, - bot.id, - ) - - async def feed_raw_update(self, bot: Bot, update: Dict[str, Any], **kwargs: Any) -> Any: - """ - Main entry point for incoming updates with automatic Dict->Update serializer - - :param bot: - :param update: - :param kwargs: - """ - parsed_update = Update.model_validate(update, context={"bot": bot}) - return await self._feed_webhook_update(bot=bot, update=parsed_update, **kwargs) - - @classmethod - async def _listen_updates( - cls, - bot: Bot, - polling_timeout: int = 30, - backoff_config: BackoffConfig = DEFAULT_BACKOFF_CONFIG, - allowed_updates: Optional[List[str]] = None, - ) -> AsyncGenerator[Update, None]: - """ - Endless updates reader with correctly handling any server-side or connection errors. - - So you may not worry that the polling will stop working. - """ - backoff = Backoff(config=backoff_config) - get_updates = GetUpdates(timeout=polling_timeout, allowed_updates=allowed_updates) - kwargs = {} - if bot.session.timeout: - # Request timeout can be lower than session timeout and that's OK. - # To prevent false-positive TimeoutError we should wait longer than polling timeout - kwargs["request_timeout"] = int(bot.session.timeout + polling_timeout) - failed = False - while True: - try: - updates = await bot(get_updates, **kwargs) - except Exception as e: - failed = True - # In cases when Telegram Bot API was inaccessible don't need to stop polling - # process because some developers can't make auto-restarting of the script - loggers.dispatcher.error("Failed to fetch updates - %s: %s", type(e).__name__, e) - # And also backoff timeout is best practice to retry any network activity - loggers.dispatcher.warning( - "Sleep for %f seconds and try again... (tryings = %d, bot id = %d)", - backoff.next_delay, - backoff.counter, - bot.id, - ) - await backoff.asleep() - continue - - # In case when network connection was fixed let's reset the backoff - # to initial value and then process updates - if failed: - loggers.dispatcher.info( - "Connection established (tryings = %d, bot id = %d)", - backoff.counter, - bot.id, - ) - backoff.reset() - failed = False - - for update in updates: - yield update - # The getUpdates method returns the earliest 100 unconfirmed updates. - # To confirm an update, use the offset parameter when calling getUpdates - # All updates with update_id less than or equal to offset will be marked - # as confirmed on the server and will no longer be returned. - get_updates.offset = update.update_id + 1 - - async def _listen_update(self, update: Update, **kwargs: Any) -> Any: - """ - Main updates listener - - Workflow: - - Detect content type and propagate to observers in current router - - If no one filter is pass - propagate update to child routers as Update - - :param update: - :param kwargs: - :return: - """ - try: - update_type = update.event_type - event = update.event - except UpdateTypeLookupError as e: - warnings.warn( - "Detected unknown update type.\n" - "Seems like Telegram Bot API was updated and you have " - "installed not latest version of aiogram framework" - f"\nUpdate: {update.model_dump_json(exclude_unset=True)}", - RuntimeWarning, - ) - raise SkipHandler() from e - - kwargs.update(event_update=update) - - return await self.propagate_event(update_type=update_type, event=event, **kwargs) - - @classmethod - async def silent_call_request(cls, bot: Bot, result: TelegramMethod[Any]) -> None: - """ - Simulate answer into WebHook - - :param bot: - :param result: - :return: - """ - try: - await bot(result) - except TelegramAPIError as e: - # In due to WebHook mechanism doesn't allow getting response for - # requests called in answer to WebHook request. - # Need to skip unsuccessful responses. - # For debugging here is added logging. - loggers.event.error("Failed to make answer: %s: %s", e.__class__.__name__, e) - - async def _process_update( - self, bot: Bot, update: Update, call_answer: bool = True, **kwargs: Any - ) -> bool: - """ - Propagate update to event listeners - - :param bot: instance of Bot - :param update: instance of Update - :param call_answer: need to execute response as Telegram method (like answer into webhook) - :param kwargs: contextual data for middlewares, filters and handlers - :return: status - """ - try: - response = await self.feed_update(bot, update, **kwargs) - if call_answer and isinstance(response, TelegramMethod): - await self.silent_call_request(bot=bot, result=response) - return response is not UNHANDLED - - except Exception as e: - loggers.event.exception( - "Cause exception while process update id=%d by bot id=%d\n%s: %s", - update.update_id, - bot.id, - e.__class__.__name__, - e, - ) - return True # because update was processed but unsuccessful - - async def _polling( - self, - bot: Bot, - polling_timeout: int = 30, - handle_as_tasks: bool = True, - backoff_config: BackoffConfig = DEFAULT_BACKOFF_CONFIG, - allowed_updates: Optional[List[str]] = None, - **kwargs: Any, - ) -> None: - """ - Internal polling process - - :param bot: - :param kwargs: - :return: - """ - user: User = await bot.me() - loggers.dispatcher.info( - "Run polling for bot @%s id=%d - %r", user.username, bot.id, user.full_name - ) - try: - async for update in self._listen_updates( - bot, - polling_timeout=polling_timeout, - backoff_config=backoff_config, - allowed_updates=allowed_updates, - ): - handle_update = self._process_update(bot=bot, update=update, **kwargs) - if handle_as_tasks: - handle_update_task = asyncio.create_task(handle_update) - self._handle_update_tasks.add(handle_update_task) - handle_update_task.add_done_callback(self._handle_update_tasks.discard) - else: - await handle_update - finally: - loggers.dispatcher.info( - "Polling stopped for bot @%s id=%d - %r", user.username, bot.id, user.full_name - ) - - async def _feed_webhook_update(self, bot: Bot, update: Update, **kwargs: Any) -> Any: - """ - The same with `Dispatcher.process_update()` but returns real response instead of bool - """ - try: - return await self.feed_update(bot, update, **kwargs) - except Exception as e: - loggers.event.exception( - "Cause exception while process update id=%d by bot id=%d\n%s: %s", - update.update_id, - bot.id, - e.__class__.__name__, - e, - ) - raise - - async def feed_webhook_update( - self, bot: Bot, update: Union[Update, Dict[str, Any]], _timeout: float = 55, **kwargs: Any - ) -> Optional[TelegramMethod[TelegramType]]: - if not isinstance(update, Update): # Allow to use raw updates - update = Update.model_validate(update, context={"bot": bot}) - - ctx = contextvars.copy_context() - loop = asyncio.get_running_loop() - waiter = loop.create_future() - - def release_waiter(*_: Any) -> None: - if not waiter.done(): - waiter.set_result(None) - - timeout_handle = loop.call_later(_timeout, release_waiter) - - process_updates: Future[Any] = asyncio.ensure_future( - self._feed_webhook_update(bot=bot, update=update, **kwargs) - ) - process_updates.add_done_callback(release_waiter, context=ctx) - - def process_response(task: Future[Any]) -> None: - warnings.warn( - "Detected slow response into webhook.\n" - "Telegram is waiting for response only first 60 seconds and then re-send update.\n" - "For preventing this situation response into webhook returned immediately " - "and handler is moved to background and still processing update.", - RuntimeWarning, - ) - try: - result = task.result() - except Exception as e: - raise e - if isinstance(result, TelegramMethod): - asyncio.ensure_future(self.silent_call_request(bot=bot, result=result)) - - try: - try: - await waiter - except CancelledError: # pragma: no cover - process_updates.remove_done_callback(release_waiter) - process_updates.cancel() - raise - - if process_updates.done(): - # TODO: handle exceptions - response: Any = process_updates.result() - if isinstance(response, TelegramMethod): - return response - - else: - process_updates.remove_done_callback(release_waiter) - process_updates.add_done_callback(process_response, context=ctx) - - finally: - timeout_handle.cancel() - - return None - - async def stop_polling(self) -> None: - """ - Execute this method if you want to stop polling programmatically - - :return: - """ - if not self._running_lock.locked(): - raise RuntimeError("Polling is not started") - if not self._stop_signal or not self._stopped_signal: - return - self._stop_signal.set() - await self._stopped_signal.wait() - - def _signal_stop_polling(self, sig: signal.Signals) -> None: - if not self._running_lock.locked(): - return - - loggers.dispatcher.warning("Received %s signal", sig.name) - if not self._stop_signal: - return - self._stop_signal.set() - - async def start_polling( - self, - *bots: Bot, - polling_timeout: int = 10, - handle_as_tasks: bool = True, - backoff_config: BackoffConfig = DEFAULT_BACKOFF_CONFIG, - allowed_updates: Optional[Union[List[str], UNSET_TYPE]] = UNSET, - handle_signals: bool = True, - close_bot_session: bool = True, - **kwargs: Any, - ) -> None: - """ - Polling runner - - :param bots: Bot instances (one or more) - :param polling_timeout: Long-polling wait time - :param handle_as_tasks: Run task for each event and no wait result - :param backoff_config: backoff-retry config - :param allowed_updates: List of the update types you want your bot to receive - By default, all used update types are enabled (resolved from handlers) - :param handle_signals: handle signals (SIGINT/SIGTERM) - :param close_bot_session: close bot sessions on shutdown - :param kwargs: contextual data - :return: - """ - if not bots: - raise ValueError("At least one bot instance is required to start polling") - if "bot" in kwargs: - raise ValueError( - "Keyword argument 'bot' is not acceptable, " - "the bot instance should be passed as positional argument" - ) - - async with self._running_lock: # Prevent to run this method twice at a once - if self._stop_signal is None: - self._stop_signal = Event() - if self._stopped_signal is None: - self._stopped_signal = Event() - - if allowed_updates is UNSET: - allowed_updates = self.resolve_used_update_types() - - self._stop_signal.clear() - self._stopped_signal.clear() - - if handle_signals: - loop = asyncio.get_running_loop() - with suppress(NotImplementedError): # pragma: no cover - # Signals handling is not supported on Windows - # It also can't be covered on Windows - loop.add_signal_handler( - signal.SIGTERM, self._signal_stop_polling, signal.SIGTERM - ) - loop.add_signal_handler( - signal.SIGINT, self._signal_stop_polling, signal.SIGINT - ) - - workflow_data = { - "dispatcher": self, - "bots": bots, - **self.workflow_data, - **kwargs, - } - if "bot" in workflow_data: - workflow_data.pop("bot") - - await self.emit_startup(bot=bots[-1], **workflow_data) - loggers.dispatcher.info("Start polling") - try: - tasks: List[asyncio.Task[Any]] = [ - asyncio.create_task( - self._polling( - bot=bot, - handle_as_tasks=handle_as_tasks, - polling_timeout=polling_timeout, - backoff_config=backoff_config, - allowed_updates=allowed_updates, - **workflow_data, - ) - ) - for bot in bots - ] - tasks.append(asyncio.create_task(self._stop_signal.wait())) - done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED) - - for task in pending: - # (mostly) Graceful shutdown unfinished tasks - task.cancel() - with suppress(CancelledError): - await task - # Wait finished tasks to propagate unhandled exceptions - await asyncio.gather(*done) - - finally: - loggers.dispatcher.info("Polling stopped") - try: - await self.emit_shutdown(bot=bots[-1], **workflow_data) - finally: - if close_bot_session: - await asyncio.gather(*(bot.session.close() for bot in bots)) - self._stopped_signal.set() - - def run_polling( - self, - *bots: Bot, - polling_timeout: int = 10, - handle_as_tasks: bool = True, - backoff_config: BackoffConfig = DEFAULT_BACKOFF_CONFIG, - allowed_updates: Optional[Union[List[str], UNSET_TYPE]] = UNSET, - handle_signals: bool = True, - close_bot_session: bool = True, - **kwargs: Any, - ) -> None: - """ - Run many bots with polling - - :param bots: Bot instances (one or more) - :param polling_timeout: Long-polling wait time - :param handle_as_tasks: Run task for each event and no wait result - :param backoff_config: backoff-retry config - :param allowed_updates: List of the update types you want your bot to receive - :param handle_signals: handle signals (SIGINT/SIGTERM) - :param close_bot_session: close bot sessions on shutdown - :param kwargs: contextual data - :return: - """ - with suppress(KeyboardInterrupt): - return asyncio.run( - self.start_polling( - *bots, - **kwargs, - polling_timeout=polling_timeout, - handle_as_tasks=handle_as_tasks, - backoff_config=backoff_config, - allowed_updates=allowed_updates, - handle_signals=handle_signals, - close_bot_session=close_bot_session, - ) - ) diff --git a/env/Lib/site-packages/aiogram/dispatcher/event/__init__.py b/env/Lib/site-packages/aiogram/dispatcher/event/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/Lib/site-packages/aiogram/dispatcher/event/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/dispatcher/event/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 86e914cc3e2aabe3ed6f6cf6c0c70b133a85c88c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmZ3^%ge<81lwkxNdwW3K?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCU!g8mG2!_| z*)h)fDVcfcG1;X>i6!|(@k#k5F{ycFF+Q0|F~ylBsk#M;$=QkNsl_pgnfd8OiMjeI znZ*T(CCM47Mf#~_sd**(@$s2?nI-Y@dIgogIBatBQ%ZAE?TT1|wt(DG%nu|!Ff%eT MeqewRMa)1k0H3il!2kdN diff --git a/env/Lib/site-packages/aiogram/dispatcher/event/__pycache__/bases.cpython-311.pyc b/env/Lib/site-packages/aiogram/dispatcher/event/__pycache__/bases.cpython-311.pyc deleted file mode 100644 index b11bc8220829a5460f2418f0d4dc488a48f58540..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1806 zcmbVMJ#5=n5PnajBvOBoEK6}>M^@`D8e+%pRulnTNvLb23hJK}Wz`Cl_^dJ}DfN*` z;-DymB2&@9n};r)TmE4LxUbwDIq&VBN{b`Nfk=b4j2JbPy|y{L^G%a&5#l@ z!%Enc6v>no*^DR=KTj~CW=x5JEowm{ZYGoj*dZ-!TrrbMl9B*nvL>;_Px5YnkUe;Y zqNG@mrC5lKF<~QcZR94+027&Twm%|D*Yv7GX0{lRsM+wk7gb{^mLD^CSas?{vjWVMyTWxHrO=eeBy@i#{X}aB3oyHf8&oR9GTpfzDXWLtR9Dsdw6^x@Rpt`4@z9@A| z{Q4;4KNJ}+s#b#;qcS;Ch9d=sXp?B=M#|q!od(fg@xmsvZK&ZSKAPpHw!=U3LfjuQ z$Jep(cc;N51g8lPJ$eg_9papeeMQ<-qr2eQJN14;3xUVENFHQG)oqqnt^B#k_<_f9 zf6{pyCe~(Jf%=VtuW9%R8=>+XFYk$%!DqnqBiPC=`BNg%>~_=5-uhwsMP$AgnRmr` zzy1QP6ht3{=OLB9feH&MOd<(3IzVC|0mqWOkh9f>VRI3af~Z2M!l>{Jmr>#W7LS7R z;vGwO9A-PSW~;HuW9SP42D3Tx(My`AoVI6?20V#pQy3GV#okzjJ#x;-jy(4guk7XZ z%F<$`bf;YMq?Ph=xwrr1KaneP%%syuNl2*J=m5QE`kAv6}~CI(3o&-7xsuH28Nd(o+`Gzd{D56ES;UHAjN Z$7dnwa*}^=`-4lFB3&4ee^Wk7{{qF)y`}&F diff --git a/env/Lib/site-packages/aiogram/dispatcher/event/__pycache__/event.cpython-311.pyc b/env/Lib/site-packages/aiogram/dispatcher/event/__pycache__/event.cpython-311.pyc deleted file mode 100644 index 4e1b355826ae8d08fcf6727149523717113d796e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2661 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 diff --git a/env/Lib/site-packages/aiogram/dispatcher/event/__pycache__/telegram.cpython-311.pyc b/env/Lib/site-packages/aiogram/dispatcher/event/__pycache__/telegram.cpython-311.pyc deleted file mode 100644 index eb2991967df4acc6c89a0e7f72cbbef3bc641269..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7459 zcmbVRTWlLwdOkD5%a9^PN|q(+W{<8mW1Dv3tmQbecO6TPHi>1!mJ@`w%Z@lBnbz>q zGebL4DOBhh4UMWrwrJr1o1j9Gb?uFT`l-m{cAxst2T~wlVgLgMiUpcC8cqtsPyPQh zoFS>pZrj7rKWEPMKj-|H@BI4bV9-w>{p+v(W8oh=3HeX_u#?Nma4)}u%zdH|h0{oy zi*p?2d5upCaUt!ByVCBsJMD>k(%!f?EyhJwFKE8BKkkRTOL1#$=|DWd@*XXiZjZOK zyjKgQ!|^cWMa8Feq&wrC={@m1>8^NJdT)F$EB9;N>7IB`Iuehhd*i(vQ3dLO`P;O< zbbq{`BRqMZD1o~~2|nNn`4;}H6dzF9uaIcyd;E-YW}BSJWDVI!WixuzV+Q9wy)>OT zH#2?i!=KN-ZwhBK%cgiv)--uuQ%%=YDruOmk5al}iWhU(N!DPHjteP8(bPLKRWHaH zc~Pa`3)b*`S2KD(m&;N^RX$Xg?_{ZRmM-SgYQ}(mp7SZqP$}fv=TuEyq;mS={4F(U ze9vKbmnmMJ{$Tpt-1L;`yE;2_c6RC`$hJ3Tn_JGQX4{peRBlGj00%TGm;q#WUQRBt z%78V6HLMw|H?uyGgUi`GaFE2^uoJQliF^4cK<^Wk#5sk;d4-D$%6>(>3umiHN*lc0 z%8(L-w?}DLLSJ#pu(J2AC+<~7ls+gGl~JW1-adE_z}sJMHKy!?R&DGY#?8I<%BOF` zrd*uYReD>cD-ZkxI%nmP&SWNyYZMpS7D&sVXgJ^HNgINK{>f15&AU)7lg1 zPRh6`EwHVQvF39(Q+i|6J1I?*bR(OyhLmzNo0AurNJw{Xsu}1?b;B7Ay5?kEw?;BO zlx-mGfxR;QjHg6KPOGM%8x(3)BTqA?Yc`uvll6_o%_XQt@Xfva4P@?<0#_gjEN7{} z!xxGGON#`)904}Gb~zyrAp5QJ39ahNNyr~;<+i&RK|4o4jqj30@|bT`7Z}r-Pa&W< z!fcDIAd`D=86L=hHQ=BLKRfq`&><*ziNn9XI(6#$Ct135{ajW_Wfre5<*96BX<|NW zTvs!IX6Jw3gVaP^#Q-oGbb4;%# zEqYX>eNadHftX@lo^*=V(e$Ssr8mP&2ojAF+Rb_->RmuBUAn3*G)B`=7(l}5h}E#p z>&m`Ayp~>Qt#wSQ6rTb9hG zbGwRp-LN$Yx!ofM1L+cwHBuV8Vm-h0{#tu7Q67J{GXAbpXeod|-+;DE3QUjsnW1Ks zC{GXBWzBq<9&6T>ft|(GszrIy-)HmJ0wfS#KV4~)N^J+LqvOS?^$V52P*n`92SGNU zildw2sKw8}Pr$o8cBKMToU4d)CHrA)z8*#Qd#%+6UbES-9NUc>+fIqu+D+gEPpS2U z3{=H>0%>(5^OjTIdV;NAQ{=|!RldOALOo$=!?CY+3BF-uv^Xraj<6~e1lm{NHXKW9 zx5IZqxFy=(t^GK%ex?Ar@Q9m@`b?36bW>ebOt+EG0Te*PW%`phVvKia zdklutQ$WC&O`a*XJ?q~0b$(;+n`@P^cgy=HEBhzQ-KQ(vr)xy;on)kVzS=Wb={fMU z=g?-)p@&nCFP3{ID?O9NnQEw~M!4X~YPkPtcz82Bym7KJa-tlbsDvj<;fYtzLwzN& zk4ez%BhGX$X!4>?$6#{$9+1}&8_r!rjCT#3_hAXZ-;EolX9;i}w8c|R+QNYfj>i>3 z!*~Y1z%aV#Tg{5Ea4mx6+S%kifI%8Ay!C*81qShJp|$KUxdOk&rwE9g0HSwf)!pps z3vR;^7Jvu9Z3Fqz?t*(4(c~YyT4w>#iZu)D&Z22_0Q2=!;1o9)Z{VqQMFsw`=K(0v zx4S442L=+%xp(EDV`3e1Zkg-43w5exA8hv}Kwy9+BssGz$%
  • m>_fOK@NeW9yQU z1=FwAF(H+ylva(KSw#YG0JvXrz8O^KGtvn!0Et_4E zWJ5}3DQHQKp(IJkCfO1!914I`1;}|xQ)L}jlg{1-USMG>{Y{HqpxLzL=@7}p{Im2d z9M3je`2Y7<^eBu+ncku%)GYx$4*8Y0c2<0Qo0?IW?Vvt^ezt>(oG-EG$;8(K8;j-M zSfw{+l>oIJ6w_C9D@JvZ2~QEMe*W z0j%=Kxg7X72Gyb-%h5Ro!2&~5*vOIYk$^xxW>CXKIVS(lkw=o?tkh3P5-08$AjguiOSeStqrScq(NT@-aYL<5Fj<; z4Yt=hNuZ;6y4uxUoPOTbUn9J4f|26XvrzAsqrdi)LkB9M185Q_s^PAu;pk>K`ovud zN6X<8mGFsD_{6K{=zO1w1DoQ&vp{dPcc{t^;JZcG@N(pQC33#n-Cy&%g6%H|kROn| z5IjEr4+Kb!kuV8IiXnD9rkm+2ZD)H1n=Zd@Z?&aK^dEM@JlF*8WgIfCuyO;f>$cSF zngLX`*tS&{5B3+XO+srq0IicSP*h+p&J5q7a<181(J0oso6a7wHN6PL3}WM)sw5b; z*U|hp9sgc7)K=KPa%g8I*s(EQuXSV(1j9pm2fqqEjhx(!oU8`I2#o?=FWf>eY&MW$ zuqKl5U~%=!s~c10P_z928hlOP};5^jswfID1AELDI|#UwO^)eAeX z`4`|=|6KT(+!y}JbsYq0)wSvd_pKH9ot<>Sz12PXaAzHtwt>RDEfvVl?skiV6q;~h zt5ADj1s;eDY`K#+bD!inxRs9(1GTQ6MhO)-@+ny_-XWg}pOQP=`rjB~yOyw9{K_vK ze|o7N?ojL3BXDi@MHk$w!XhIO@@NW*fM2shB5AywTY(T%jTtB20+%o5KQ+zvpLicj z8M=L+V!pHyM#0{uw>~YPS&9alehkF)SO%PFD!q)wKf_`ddN>N6j8H@&QSTOkrJrIe zh`;E0&Df&QsZ0jkGr~8V7m|f%y#`G!LhNp3aA#4jSEEAd{|)57;0LPfCy{}_U#*dV zZ;+AV`&H>c@%$I>lmmm+q1Z;xH-iuJrJIY<+=9}^q8uK_ST3mI9LsL z-w*y>@Jpo}9;t*!O5u?j@9h|@jvlOxzVmeSgU!(os*!=GkvBIZZX$o{Va zU@ykH!Cs7Ye{liq#qiM$nEA;Zho|2vQWy*=*Vb#g#okDr4R!7%ByYnZbmkT(uX zEuRh=K_id$ia}@zGM|&rxzG8}1qdU#i+qtQ3PrNuQe1ZftFD3zK%!^mlq0oMDxf6{ zBeC1Q?Q0R5wV+1b>0n`fjBe0DAPyUlXKXM~6oZd{aG~M6=V}S=&~O5BMOETwEiA&(3(y&S34;(0MxkgunQU4fWDQbX+${e>SB~y1Zixhncysuw z-r*jMs3Q=21r{{Wi&yC{50(N`8=nBNo+s1r{_bPvySk^pc+mn;t}PqE0zNESXZykT zkYlz0#``=@hX?hikm{-;+RW_+e(d_cz|NrcDbpUgCl5`&sxV^U5UEf&{l^}&%K{Krm{l`>z5 zW|mnKddX>twSXTR^;sjDjeNj)-EUyOX41*I-v*1+LOgri zy*1KGj^X&;b~gk7{wT3_02eydIy9HR98;rl?6QZT%0Z9wt^lORDT&MY?rc3Dgl&Y#y$1)+NOa)2h0KoZVQg zQ}ox&v(Zk>F-M0k%~Dqk8(Jae-W_;p`j>=t&O_LI7|93_h@4wOb%y5P6Ya2m04SJy zj;oU4QtR`aOqc#I&vP NoReturn: - """ - Raise an SkipHandler - """ - raise SkipHandler(message or "Event skipped") diff --git a/env/Lib/site-packages/aiogram/dispatcher/event/event.py b/env/Lib/site-packages/aiogram/dispatcher/event/event.py deleted file mode 100644 index 3cbcffe..0000000 --- a/env/Lib/site-packages/aiogram/dispatcher/event/event.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import annotations - -from typing import Any, Callable, List - -from .handler import CallbackType, HandlerObject - - -class EventObserver: - """ - Simple events observer - - Is used for managing events is not related with Telegram - (For example startup/shutdown processes) - - Handlers can be registered via decorator or method - - .. code-block:: python - - .register(my_handler) - - .. code-block:: python - - @() - async def my_handler(*args, **kwargs): ... - """ - - def __init__(self) -> None: - self.handlers: List[HandlerObject] = [] - - def register(self, callback: CallbackType) -> None: - """ - Register callback with filters - """ - self.handlers.append(HandlerObject(callback=callback)) - - async def trigger(self, *args: Any, **kwargs: Any) -> None: - """ - Propagate event to handlers. - Handler will be called when all its filters is pass. - """ - for handler in self.handlers: - await handler.call(*args, **kwargs) - - def __call__(self) -> Callable[[CallbackType], CallbackType]: - """ - Decorator for registering event handlers - """ - - def wrapper(callback: CallbackType) -> CallbackType: - self.register(callback) - return callback - - return wrapper diff --git a/env/Lib/site-packages/aiogram/dispatcher/event/handler.py b/env/Lib/site-packages/aiogram/dispatcher/event/handler.py deleted file mode 100644 index 8c283dd..0000000 --- a/env/Lib/site-packages/aiogram/dispatcher/event/handler.py +++ /dev/null @@ -1,99 +0,0 @@ -import asyncio -import contextvars -import inspect -import warnings -from dataclasses import dataclass, field -from functools import partial -from typing import Any, Callable, Dict, List, Optional, Set, Tuple - -from magic_filter.magic import MagicFilter as OriginalMagicFilter - -from aiogram.dispatcher.flags import extract_flags_from_object -from aiogram.filters.base import Filter -from aiogram.handlers import BaseHandler -from aiogram.utils.magic_filter import MagicFilter -from aiogram.utils.warnings import Recommendation - -CallbackType = Callable[..., Any] - - -@dataclass -class CallableObject: - callback: CallbackType - awaitable: bool = field(init=False) - params: Set[str] = field(init=False) - varkw: bool = field(init=False) - - def __post_init__(self) -> None: - callback = inspect.unwrap(self.callback) - self.awaitable = inspect.isawaitable(callback) or inspect.iscoroutinefunction(callback) - spec = inspect.getfullargspec(callback) - self.params = {*spec.args, *spec.kwonlyargs} - self.varkw = spec.varkw is not None - - def _prepare_kwargs(self, kwargs: Dict[str, Any]) -> Dict[str, Any]: - if self.varkw: - return kwargs - - return {k: kwargs[k] for k in self.params if k in kwargs} - - async def call(self, *args: Any, **kwargs: Any) -> Any: - wrapped = partial(self.callback, *args, **self._prepare_kwargs(kwargs)) - if self.awaitable: - return await wrapped() - - loop = asyncio.get_event_loop() - context = contextvars.copy_context() - wrapped = partial(context.run, wrapped) - return await loop.run_in_executor(None, wrapped) - - -@dataclass -class FilterObject(CallableObject): - magic: Optional[MagicFilter] = None - - def __post_init__(self) -> None: - if isinstance(self.callback, OriginalMagicFilter): - # MagicFilter instance is callable but generates - # only "CallOperation" instead of applying the filter - self.magic = self.callback - self.callback = self.callback.resolve - if not isinstance(self.magic, MagicFilter): - # Issue: https://github.com/aiogram/aiogram/issues/990 - warnings.warn( - category=Recommendation, - message="You are using F provided by magic_filter package directly, " - "but it lacks `.as_()` extension." - "\n Please change the import statement: from `from magic_filter import F` " - "to `from aiogram import F` to silence this warning.", - stacklevel=6, - ) - - super(FilterObject, self).__post_init__() - - if isinstance(self.callback, Filter): - self.awaitable = True - - -@dataclass -class HandlerObject(CallableObject): - filters: Optional[List[FilterObject]] = None - flags: Dict[str, Any] = field(default_factory=dict) - - def __post_init__(self) -> None: - super(HandlerObject, self).__post_init__() - callback = inspect.unwrap(self.callback) - if inspect.isclass(callback) and issubclass(callback, BaseHandler): - self.awaitable = True - self.flags.update(extract_flags_from_object(callback)) - - async def check(self, *args: Any, **kwargs: Any) -> Tuple[bool, Dict[str, Any]]: - if not self.filters: - return True, kwargs - for event_filter in self.filters: - check = await event_filter.call(*args, **kwargs) - if not check: - return False, kwargs - if isinstance(check, dict): - kwargs.update(check) - return True, kwargs diff --git a/env/Lib/site-packages/aiogram/dispatcher/event/telegram.py b/env/Lib/site-packages/aiogram/dispatcher/event/telegram.py deleted file mode 100644 index afa8938..0000000 --- a/env/Lib/site-packages/aiogram/dispatcher/event/telegram.py +++ /dev/null @@ -1,141 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional - -from aiogram.dispatcher.middlewares.manager import MiddlewareManager - -from ...exceptions import UnsupportedKeywordArgument -from ...filters.base import Filter -from ...types import TelegramObject -from .bases import REJECTED, UNHANDLED, MiddlewareType, SkipHandler -from .handler import CallbackType, FilterObject, HandlerObject - -if TYPE_CHECKING: - from aiogram.dispatcher.router import Router - - -class TelegramEventObserver: - """ - Event observer for Telegram events - - Here you can register handler with filter. - This observer will stop event propagation when first handler is pass. - """ - - def __init__(self, router: Router, event_name: str) -> None: - self.router: Router = router - self.event_name: str = event_name - - self.handlers: List[HandlerObject] = [] - - self.middleware = MiddlewareManager() - self.outer_middleware = MiddlewareManager() - - # Re-used filters check method from already implemented handler object - # with dummy callback which never will be used - self._handler = HandlerObject(callback=lambda: True, filters=[]) - - def filter(self, *filters: CallbackType) -> None: - """ - Register filter for all handlers of this event observer - - :param filters: positional filters - """ - if self._handler.filters is None: - self._handler.filters = [] - self._handler.filters.extend([FilterObject(filter_) for filter_ in filters]) - - def _resolve_middlewares(self) -> List[MiddlewareType[TelegramObject]]: - middlewares: List[MiddlewareType[TelegramObject]] = [] - for router in reversed(tuple(self.router.chain_head)): - observer = router.observers.get(self.event_name) - if observer: - middlewares.extend(observer.middleware) - - return middlewares - - def register( - self, - callback: CallbackType, - *filters: CallbackType, - flags: Optional[Dict[str, Any]] = None, - **kwargs: Any, - ) -> CallbackType: - """ - Register event handler - """ - if kwargs: - raise UnsupportedKeywordArgument( - "Passing any additional keyword arguments to the registrar method " - "is not supported.\n" - "This error may be caused when you are trying to register filters like in 2.x " - "version of this framework, if it's true just look at correspoding " - "documentation pages.\n" - f"Please remove the {set(kwargs.keys())} arguments from this call.\n" - ) - - if flags is None: - flags = {} - - for item in filters: - if isinstance(item, Filter): - item.update_handler_flags(flags=flags) - - self.handlers.append( - HandlerObject( - callback=callback, - filters=[FilterObject(filter_) for filter_ in filters], - flags=flags, - ) - ) - - return callback - - def wrap_outer_middleware( - self, callback: Any, event: TelegramObject, data: Dict[str, Any] - ) -> Any: - wrapped_outer = self.middleware.wrap_middlewares( - self.outer_middleware, - callback, - ) - return wrapped_outer(event, data) - - def check_root_filters(self, event: TelegramObject, **kwargs: Any) -> Any: - return self._handler.check(event, **kwargs) - - async def trigger(self, event: TelegramObject, **kwargs: Any) -> Any: - """ - Propagate event to handlers and stops propagation on first match. - Handler will be called when all its filters are pass. - """ - for handler in self.handlers: - kwargs["handler"] = handler - result, data = await handler.check(event, **kwargs) - if result: - kwargs.update(data) - try: - wrapped_inner = self.outer_middleware.wrap_middlewares( - self._resolve_middlewares(), - handler.call, - ) - return await wrapped_inner(event, kwargs) - except SkipHandler: - continue - - return UNHANDLED - - def __call__( - self, - *filters: CallbackType, - flags: Optional[Dict[str, Any]] = None, - **kwargs: Any, - ) -> Callable[[CallbackType], CallbackType]: - """ - Decorator for registering event handlers - """ - - def wrapper(callback: CallbackType) -> CallbackType: - self.register(callback, *filters, flags=flags, **kwargs) - return callback - - return wrapper diff --git a/env/Lib/site-packages/aiogram/dispatcher/flags.py b/env/Lib/site-packages/aiogram/dispatcher/flags.py deleted file mode 100644 index aad8a29..0000000 --- a/env/Lib/site-packages/aiogram/dispatcher/flags.py +++ /dev/null @@ -1,127 +0,0 @@ -from dataclasses import dataclass -from typing import TYPE_CHECKING, Any, Callable, Dict, Optional, Union, cast, overload - -from magic_filter import AttrDict, MagicFilter - -if TYPE_CHECKING: - from aiogram.dispatcher.event.handler import HandlerObject - - -@dataclass(frozen=True) -class Flag: - name: str - value: Any - - -@dataclass(frozen=True) -class FlagDecorator: - flag: Flag - - @classmethod - def _with_flag(cls, flag: Flag) -> "FlagDecorator": - return cls(flag) - - def _with_value(self, value: Any) -> "FlagDecorator": - new_flag = Flag(self.flag.name, value) - return self._with_flag(new_flag) - - @overload - def __call__(self, value: Callable[..., Any], /) -> Callable[..., Any]: # type: ignore - pass - - @overload - def __call__(self, value: Any, /) -> "FlagDecorator": - pass - - @overload - def __call__(self, **kwargs: Any) -> "FlagDecorator": - pass - - def __call__( - self, - value: Optional[Any] = None, - **kwargs: Any, - ) -> Union[Callable[..., Any], "FlagDecorator"]: - if value and kwargs: - raise ValueError("The arguments `value` and **kwargs can not be used together") - - if value is not None and callable(value): - value.aiogram_flag = { - **extract_flags_from_object(value), - self.flag.name: self.flag.value, - } - return cast(Callable[..., Any], value) - return self._with_value(AttrDict(kwargs) if value is None else value) - - -if TYPE_CHECKING: - - class _ChatActionFlagProtocol(FlagDecorator): - def __call__( # type: ignore[override] - self, - action: str = ..., - interval: float = ..., - initial_sleep: float = ..., - **kwargs: Any, - ) -> FlagDecorator: - pass - - -class FlagGenerator: - def __getattr__(self, name: str) -> FlagDecorator: - if name[0] == "_": - raise AttributeError("Flag name must NOT start with underscore") - return FlagDecorator(Flag(name, True)) - - if TYPE_CHECKING: - chat_action: _ChatActionFlagProtocol - - -def extract_flags_from_object(obj: Any) -> Dict[str, Any]: - if not hasattr(obj, "aiogram_flag"): - return {} - return cast(Dict[str, Any], obj.aiogram_flag) - - -def extract_flags(handler: Union["HandlerObject", Dict[str, Any]]) -> Dict[str, Any]: - """ - Extract flags from handler or middleware context data - - :param handler: handler object or data - :return: dictionary with all handler flags - """ - if isinstance(handler, dict) and "handler" in handler: - handler = handler["handler"] - if hasattr(handler, "flags"): - return handler.flags - return {} - - -def get_flag( - handler: Union["HandlerObject", Dict[str, Any]], - name: str, - *, - default: Optional[Any] = None, -) -> Any: - """ - Get flag by name - - :param handler: handler object or data - :param name: name of the flag - :param default: default value (None) - :return: value of the flag or default - """ - flags = extract_flags(handler) - return flags.get(name, default) - - -def check_flags(handler: Union["HandlerObject", Dict[str, Any]], magic: MagicFilter) -> Any: - """ - Check flags via magic filter - - :param handler: handler object or data - :param magic: instance of the magic - :return: the result of magic filter check - """ - flags = extract_flags(handler) - return magic.resolve(AttrDict(flags)) diff --git a/env/Lib/site-packages/aiogram/dispatcher/middlewares/__init__.py b/env/Lib/site-packages/aiogram/dispatcher/middlewares/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/Lib/site-packages/aiogram/dispatcher/middlewares/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/dispatcher/middlewares/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 0cf8139c055e11a9bf215297ebfb01dc84dc3683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmZ3^%ge<81lwkxNdwW3K?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCU(qgBG2!_| z*)h)fDVcfcG1;X>i6!|(@k#k5F{ycFF+Q0|F~ylBsk#M;$=QkNsl_pgnfd8OiMjeI znZ*T(CCM47Mf$m!DJeOr<%vb9#rpB_nR%Hd@$q^EmA^P_a`RJ4b5iY!Sb=tdTvN;s SBt9@RGBSQ(fDuK^KrsLvNH#VA diff --git a/env/Lib/site-packages/aiogram/dispatcher/middlewares/__pycache__/base.cpython-311.pyc b/env/Lib/site-packages/aiogram/dispatcher/middlewares/__pycache__/base.cpython-311.pyc deleted file mode 100644 index d4a6c6aea3d6023be8d5e9b8967971236374ac98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1551 zcma)6J8#=o6ux|lqAbNhUPy+3XcudUJTyZ=1O^f%Fw(g0V50^Iq4Xv1wal0g^^!_r zPcCYp89I1N(C%&vckonn=+Ga~K|_atlYuVn#=xC2^&Cp3tt3OQ$WQ0Ndmi7p6Ocn{#_6XCtbO4zT;hy+rSZ#&0jek&W%eiv*UN>)1 zFU0DH`xU6lbRZN18~{1a)bxtj8DL$rWMaRFf#AVsnZc$JPXnR&HPO+=Fi5R&X=tZwsXUE zeK_W>yK`;&sB}&pSW?;q_#1w^q_|1y&FAU~7|3#a1_Q)2;;x&Ut{Ww67@|Dmx?ciU z6Hm=`S>n5{zQ~6JW)uX$ zAo}G(ZfVWqi`QQ+{CN9FIa)a~eqI>euz!8{yZ_tr=*B01UVKz&@JOMP*_%ZTC4*eJ zwExjdW&h)EE@h7fa5T57#@&8`}4k?7V&_gUpI2Hi{g(M{r)U6tzWfQd8csIdh*EVn0gtP`B zKoy6o;?$rPq#i2TiXyd_p3A)lBjsSNgoM;fBUP%a^nh~e%yaBueh!^|{ycBq+wr__ zW}d%~$0LC9>o>p8>oUL}G-->{QrP;}sH}hqCbPj|8e^mf?0_R_k|S%fqiBkwYN`{| zf=);a;ksnXcG!t%5htoe#ayvtPF#zlu9`tR;Uu-BlhRU7T1%rXWQOe?r&sG`U`brX zJrR4Gvt8THAOI)8jNSq>X7xUh03PC}C0fRePeU%TM$;VgqeiJz_6)CBF1b0?kDosG z;e`JpkxwuL5-7Ym**7Yx^1Bj>q*pEzyV)&e)2 z59TgfxTv0~n1*NJk3=RoFY}4ZR>@ln&}PXGpUF>-=EqM>jQjC1qg1f$Nuy-i7Wbpm zi^a<3WR10=OdK~{>;0mM84nq;T0}e{D9LrzI(tTK1V9cen{7grJ|?npZ33eoRRiY5`%E#2-l&J z*>zj~B6=I2bu@q6uAjGo~lm8+18opn<-nMbi~ibr&{^+a0( zs0F%Xs>wgSWHF_C82NYXOZH;CSCyLLrMCQ384uQ!Lf{;p>8gAU&vRo_TVhLaMLGvd zET`m=SxPk4lv)+NzIPczv^@}sjqpLsHLcy;LTZ4 zq@Nas5zz%N)T|#B^*b_${|c@sTT$?$^nIDEyqBEPg)CTY9k!c*jnI)6Wk>nDxR3s6 z+`kc;5@W0Zd+Oce8N65jKjRtftG{kEUNJV{SpChT0oi)@cqXMVH7whZ2kYIVsb(0a S=vBCL?H{uK`n1fH~&? diff --git a/env/Lib/site-packages/aiogram/dispatcher/middlewares/__pycache__/manager.cpython-311.pyc b/env/Lib/site-packages/aiogram/dispatcher/middlewares/__pycache__/manager.cpython-311.pyc deleted file mode 100644 index 96bf53e4380f9c43c37f3c285a7e0c095edb7071..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4299 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 Any: # pragma: no cover - """ - Execute middleware - - :param handler: Wrapped handler in middlewares chain - :param event: Incoming event (Subclass of :class:`aiogram.types.base.TelegramObject`) - :param data: Contextual data. Will be mapped to handler arguments - :return: :class:`Any` - """ - pass diff --git a/env/Lib/site-packages/aiogram/dispatcher/middlewares/error.py b/env/Lib/site-packages/aiogram/dispatcher/middlewares/error.py deleted file mode 100644 index 4b68c0b..0000000 --- a/env/Lib/site-packages/aiogram/dispatcher/middlewares/error.py +++ /dev/null @@ -1,36 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Awaitable, Callable, Dict, cast - -from ...types import TelegramObject, Update -from ...types.error_event import ErrorEvent -from ..event.bases import UNHANDLED, CancelHandler, SkipHandler -from .base import BaseMiddleware - -if TYPE_CHECKING: - from ..router import Router - - -class ErrorsMiddleware(BaseMiddleware): - def __init__(self, router: Router): - self.router = router - - async def __call__( - self, - handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]], - event: TelegramObject, - data: Dict[str, Any], - ) -> Any: - try: - return await handler(event, data) - except (SkipHandler, CancelHandler): # pragma: no cover - raise - except Exception as e: - response = await self.router.propagate_event( - update_type="error", - event=ErrorEvent(update=cast(Update, event), exception=e), - **data, - ) - if response is not UNHANDLED: - return response - raise diff --git a/env/Lib/site-packages/aiogram/dispatcher/middlewares/manager.py b/env/Lib/site-packages/aiogram/dispatcher/middlewares/manager.py deleted file mode 100644 index bcad4de..0000000 --- a/env/Lib/site-packages/aiogram/dispatcher/middlewares/manager.py +++ /dev/null @@ -1,65 +0,0 @@ -import functools -from typing import Any, Callable, Dict, List, Optional, Sequence, Union, overload - -from aiogram.dispatcher.event.bases import ( - MiddlewareEventType, - MiddlewareType, - NextMiddlewareType, -) -from aiogram.dispatcher.event.handler import CallbackType -from aiogram.types import TelegramObject - - -class MiddlewareManager(Sequence[MiddlewareType[TelegramObject]]): - def __init__(self) -> None: - self._middlewares: List[MiddlewareType[TelegramObject]] = [] - - def register( - self, - middleware: MiddlewareType[TelegramObject], - ) -> MiddlewareType[TelegramObject]: - self._middlewares.append(middleware) - return middleware - - def unregister(self, middleware: MiddlewareType[TelegramObject]) -> None: - self._middlewares.remove(middleware) - - def __call__( - self, - middleware: Optional[MiddlewareType[TelegramObject]] = None, - ) -> Union[ - Callable[[MiddlewareType[TelegramObject]], MiddlewareType[TelegramObject]], - MiddlewareType[TelegramObject], - ]: - if middleware is None: - return self.register - return self.register(middleware) - - @overload - def __getitem__(self, item: int) -> MiddlewareType[TelegramObject]: - pass - - @overload - def __getitem__(self, item: slice) -> Sequence[MiddlewareType[TelegramObject]]: - pass - - def __getitem__( - self, item: Union[int, slice] - ) -> Union[MiddlewareType[TelegramObject], Sequence[MiddlewareType[TelegramObject]]]: - return self._middlewares[item] - - def __len__(self) -> int: - return len(self._middlewares) - - @staticmethod - def wrap_middlewares( - middlewares: Sequence[MiddlewareType[MiddlewareEventType]], handler: CallbackType - ) -> NextMiddlewareType[MiddlewareEventType]: - @functools.wraps(handler) - def handler_wrapper(event: TelegramObject, kwargs: Dict[str, Any]) -> Any: - return handler(event, **kwargs) - - middleware = handler_wrapper - for m in reversed(middlewares): - middleware = functools.partial(m, middleware) # type: ignore[assignment] - return middleware diff --git a/env/Lib/site-packages/aiogram/dispatcher/middlewares/user_context.py b/env/Lib/site-packages/aiogram/dispatcher/middlewares/user_context.py deleted file mode 100644 index aa03ee6..0000000 --- a/env/Lib/site-packages/aiogram/dispatcher/middlewares/user_context.py +++ /dev/null @@ -1,178 +0,0 @@ -from dataclasses import dataclass -from typing import Any, Awaitable, Callable, Dict, Optional - -from aiogram.dispatcher.middlewares.base import BaseMiddleware -from aiogram.types import ( - Chat, - ChatBoostSourcePremium, - InaccessibleMessage, - TelegramObject, - Update, - User, -) - -EVENT_CONTEXT_KEY = "event_context" - -EVENT_FROM_USER_KEY = "event_from_user" -EVENT_CHAT_KEY = "event_chat" -EVENT_THREAD_ID_KEY = "event_thread_id" - - -@dataclass(frozen=True) -class EventContext: - chat: Optional[Chat] = None - user: Optional[User] = None - thread_id: Optional[int] = None - business_connection_id: Optional[str] = None - - @property - def user_id(self) -> Optional[int]: - return self.user.id if self.user else None - - @property - def chat_id(self) -> Optional[int]: - return self.chat.id if self.chat else None - - -class UserContextMiddleware(BaseMiddleware): - async def __call__( - self, - handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]], - event: TelegramObject, - data: Dict[str, Any], - ) -> Any: - if not isinstance(event, Update): - raise RuntimeError("UserContextMiddleware got an unexpected event type!") - event_context = data[EVENT_CONTEXT_KEY] = self.resolve_event_context(event=event) - - # Backward compatibility - if event_context.user is not None: - data[EVENT_FROM_USER_KEY] = event_context.user - if event_context.chat is not None: - data[EVENT_CHAT_KEY] = event_context.chat - if event_context.thread_id is not None: - data[EVENT_THREAD_ID_KEY] = event_context.thread_id - - return await handler(event, data) - - @classmethod - def resolve_event_context(cls, event: Update) -> EventContext: - """ - Resolve chat and user instance from Update object - """ - if event.message: - return EventContext( - chat=event.message.chat, - user=event.message.from_user, - thread_id=( - event.message.message_thread_id if event.message.is_topic_message else None - ), - ) - if event.edited_message: - return EventContext( - chat=event.edited_message.chat, - user=event.edited_message.from_user, - thread_id=( - event.edited_message.message_thread_id - if event.edited_message.is_topic_message - else None - ), - ) - if event.channel_post: - return EventContext(chat=event.channel_post.chat) - if event.edited_channel_post: - return EventContext(chat=event.edited_channel_post.chat) - if event.inline_query: - return EventContext(user=event.inline_query.from_user) - if event.chosen_inline_result: - return EventContext(user=event.chosen_inline_result.from_user) - if event.callback_query: - callback_query_message = event.callback_query.message - if callback_query_message: - return EventContext( - chat=callback_query_message.chat, - user=event.callback_query.from_user, - thread_id=( - callback_query_message.message_thread_id - if not isinstance(callback_query_message, InaccessibleMessage) - and callback_query_message.is_topic_message - else None - ), - business_connection_id=( - callback_query_message.business_connection_id - if not isinstance(callback_query_message, InaccessibleMessage) - else None - ), - ) - return EventContext(user=event.callback_query.from_user) - if event.shipping_query: - return EventContext(user=event.shipping_query.from_user) - if event.pre_checkout_query: - return EventContext(user=event.pre_checkout_query.from_user) - if event.poll_answer: - return EventContext( - chat=event.poll_answer.voter_chat, - user=event.poll_answer.user, - ) - if event.my_chat_member: - return EventContext( - chat=event.my_chat_member.chat, user=event.my_chat_member.from_user - ) - if event.chat_member: - return EventContext(chat=event.chat_member.chat, user=event.chat_member.from_user) - if event.chat_join_request: - return EventContext( - chat=event.chat_join_request.chat, user=event.chat_join_request.from_user - ) - if event.message_reaction: - return EventContext( - chat=event.message_reaction.chat, - user=event.message_reaction.user, - ) - if event.message_reaction_count: - return EventContext(chat=event.message_reaction_count.chat) - if event.chat_boost: - # We only check the premium source, because only it has a sender user, - # other sources have a user, but it is not the sender, but the recipient - if isinstance(event.chat_boost.boost.source, ChatBoostSourcePremium): - return EventContext( - chat=event.chat_boost.chat, - user=event.chat_boost.boost.source.user, - ) - - return EventContext(chat=event.chat_boost.chat) - if event.removed_chat_boost: - return EventContext(chat=event.removed_chat_boost.chat) - if event.deleted_business_messages: - return EventContext( - chat=event.deleted_business_messages.chat, - business_connection_id=event.deleted_business_messages.business_connection_id, - ) - if event.business_connection: - return EventContext( - user=event.business_connection.user, - business_connection_id=event.business_connection.id, - ) - if event.business_message: - return EventContext( - chat=event.business_message.chat, - user=event.business_message.from_user, - thread_id=( - event.business_message.message_thread_id - if event.business_message.is_topic_message - else None - ), - business_connection_id=event.business_message.business_connection_id, - ) - if event.edited_business_message: - return EventContext( - chat=event.edited_business_message.chat, - user=event.edited_business_message.from_user, - thread_id=( - event.edited_business_message.message_thread_id - if event.edited_business_message.is_topic_message - else None - ), - business_connection_id=event.edited_business_message.business_connection_id, - ) - return EventContext() diff --git a/env/Lib/site-packages/aiogram/dispatcher/router.py b/env/Lib/site-packages/aiogram/dispatcher/router.py deleted file mode 100644 index 400c1c0..0000000 --- a/env/Lib/site-packages/aiogram/dispatcher/router.py +++ /dev/null @@ -1,271 +0,0 @@ -from __future__ import annotations - -from typing import Any, Dict, Final, Generator, List, Optional, Set - -from ..types import TelegramObject -from .event.bases import REJECTED, UNHANDLED -from .event.event import EventObserver -from .event.telegram import TelegramEventObserver - -INTERNAL_UPDATE_TYPES: Final[frozenset[str]] = frozenset({"update", "error"}) - - -class Router: - """ - Router can route update, and it nested update types like messages, callback query, - polls and all other event types. - - Event handlers can be registered in observer by two ways: - - - By observer method - :obj:`router..register(handler, )` - - By decorator - :obj:`@router.()` - """ - - def __init__(self, *, name: Optional[str] = None) -> None: - """ - :param name: Optional router name, can be useful for debugging - """ - - self.name = name or hex(id(self)) - - self._parent_router: Optional[Router] = None - self.sub_routers: List[Router] = [] - - # Observers - self.message = TelegramEventObserver(router=self, event_name="message") - self.edited_message = TelegramEventObserver(router=self, event_name="edited_message") - self.channel_post = TelegramEventObserver(router=self, event_name="channel_post") - self.edited_channel_post = TelegramEventObserver( - router=self, event_name="edited_channel_post" - ) - self.inline_query = TelegramEventObserver(router=self, event_name="inline_query") - self.chosen_inline_result = TelegramEventObserver( - router=self, event_name="chosen_inline_result" - ) - self.callback_query = TelegramEventObserver(router=self, event_name="callback_query") - self.shipping_query = TelegramEventObserver(router=self, event_name="shipping_query") - self.pre_checkout_query = TelegramEventObserver( - router=self, event_name="pre_checkout_query" - ) - self.poll = TelegramEventObserver(router=self, event_name="poll") - self.poll_answer = TelegramEventObserver(router=self, event_name="poll_answer") - self.my_chat_member = TelegramEventObserver(router=self, event_name="my_chat_member") - self.chat_member = TelegramEventObserver(router=self, event_name="chat_member") - self.chat_join_request = TelegramEventObserver(router=self, event_name="chat_join_request") - self.message_reaction = TelegramEventObserver(router=self, event_name="message_reaction") - self.message_reaction_count = TelegramEventObserver( - router=self, event_name="message_reaction_count" - ) - self.chat_boost = TelegramEventObserver(router=self, event_name="chat_boost") - self.removed_chat_boost = TelegramEventObserver( - router=self, event_name="removed_chat_boost" - ) - self.deleted_business_messages = TelegramEventObserver( - router=self, event_name="deleted_business_messages" - ) - self.business_connection = TelegramEventObserver( - router=self, event_name="business_connection" - ) - self.edited_business_message = TelegramEventObserver( - router=self, event_name="edited_business_message" - ) - self.business_message = TelegramEventObserver(router=self, event_name="business_message") - - self.errors = self.error = TelegramEventObserver(router=self, event_name="error") - - self.startup = EventObserver() - self.shutdown = EventObserver() - - self.observers: Dict[str, TelegramEventObserver] = { - "message": self.message, - "edited_message": self.edited_message, - "channel_post": self.channel_post, - "edited_channel_post": self.edited_channel_post, - "inline_query": self.inline_query, - "chosen_inline_result": self.chosen_inline_result, - "callback_query": self.callback_query, - "shipping_query": self.shipping_query, - "pre_checkout_query": self.pre_checkout_query, - "poll": self.poll, - "poll_answer": self.poll_answer, - "my_chat_member": self.my_chat_member, - "chat_member": self.chat_member, - "chat_join_request": self.chat_join_request, - "message_reaction": self.message_reaction, - "message_reaction_count": self.message_reaction_count, - "chat_boost": self.chat_boost, - "removed_chat_boost": self.removed_chat_boost, - "deleted_business_messages": self.deleted_business_messages, - "business_connection": self.business_connection, - "edited_business_message": self.edited_business_message, - "business_message": self.business_message, - "error": self.errors, - } - - def __str__(self) -> str: - return f"{type(self).__name__} {self.name!r}" - - def __repr__(self) -> str: - return f"<{self}>" - - def resolve_used_update_types(self, skip_events: Optional[Set[str]] = None) -> List[str]: - """ - Resolve registered event names - - Is useful for getting updates only for registered event types. - - :param skip_events: skip specified event names - :return: set of registered names - """ - handlers_in_use: Set[str] = set() - if skip_events is None: - skip_events = set() - skip_events = {*skip_events, *INTERNAL_UPDATE_TYPES} - - for router in self.chain_tail: - for update_name, observer in router.observers.items(): - if observer.handlers and update_name not in skip_events: - handlers_in_use.add(update_name) - - return list(sorted(handlers_in_use)) # NOQA: C413 - - async def propagate_event(self, update_type: str, event: TelegramObject, **kwargs: Any) -> Any: - kwargs.update(event_router=self) - observer = self.observers.get(update_type) - - async def _wrapped(telegram_event: TelegramObject, **data: Any) -> Any: - return await self._propagate_event( - observer=observer, update_type=update_type, event=telegram_event, **data - ) - - if observer: - return await observer.wrap_outer_middleware(_wrapped, event=event, data=kwargs) - return await _wrapped(event, **kwargs) - - async def _propagate_event( - self, - observer: Optional[TelegramEventObserver], - update_type: str, - event: TelegramObject, - **kwargs: Any, - ) -> Any: - response = UNHANDLED - if observer: - # Check globally defined filters before any other handler will be checked. - # This check is placed here instead of `trigger` method to add possibility - # to pass context to handlers from global filters. - result, data = await observer.check_root_filters(event, **kwargs) - if not result: - return UNHANDLED - kwargs.update(data) - - response = await observer.trigger(event, **kwargs) - if response is REJECTED: # pragma: no cover - # Possible only if some handler returns REJECTED - return UNHANDLED - if response is not UNHANDLED: - return response - - for router in self.sub_routers: - response = await router.propagate_event(update_type=update_type, event=event, **kwargs) - if response is not UNHANDLED: - break - - return response - - @property - def chain_head(self) -> Generator[Router, None, None]: - router: Optional[Router] = self - while router: - yield router - router = router.parent_router - - @property - def chain_tail(self) -> Generator[Router, None, None]: - yield self - for router in self.sub_routers: - yield from router.chain_tail - - @property - def parent_router(self) -> Optional[Router]: - return self._parent_router - - @parent_router.setter - def parent_router(self, router: Router) -> None: - """ - Internal property setter of parent router fot this router. - Do not use this method in own code. - All routers should be included via `include_router` method. - - Self- and circular- referencing are not allowed here - - :param router: - """ - if not isinstance(router, Router): - raise ValueError(f"router should be instance of Router not {type(router).__name__!r}") - if self._parent_router: - raise RuntimeError(f"Router is already attached to {self._parent_router!r}") - if self == router: - raise RuntimeError("Self-referencing routers is not allowed") - - parent: Optional[Router] = router - while parent is not None: - if parent == self: - raise RuntimeError("Circular referencing of Router is not allowed") - - parent = parent.parent_router - - self._parent_router = router - router.sub_routers.append(self) - - def include_routers(self, *routers: Router) -> None: - """ - Attach multiple routers. - - :param routers: - :return: - """ - if not routers: - raise ValueError("At least one router must be provided") - for router in routers: - self.include_router(router) - - def include_router(self, router: Router) -> Router: - """ - Attach another router. - - :param router: - :return: - """ - if not isinstance(router, Router): - raise ValueError( - f"router should be instance of Router not {type(router).__class__.__name__}" - ) - router.parent_router = self - return router - - async def emit_startup(self, *args: Any, **kwargs: Any) -> None: - """ - Recursively call startup callbacks - - :param args: - :param kwargs: - :return: - """ - kwargs.update(router=self) - await self.startup.trigger(*args, **kwargs) - for router in self.sub_routers: - await router.emit_startup(*args, **kwargs) - - async def emit_shutdown(self, *args: Any, **kwargs: Any) -> None: - """ - Recursively call shutdown callbacks to graceful shutdown - - :param args: - :param kwargs: - :return: - """ - kwargs.update(router=self) - await self.shutdown.trigger(*args, **kwargs) - for router in self.sub_routers: - await router.emit_shutdown(*args, **kwargs) diff --git a/env/Lib/site-packages/aiogram/enums/__init__.py b/env/Lib/site-packages/aiogram/enums/__init__.py deleted file mode 100644 index f8c4532..0000000 --- a/env/Lib/site-packages/aiogram/enums/__init__.py +++ /dev/null @@ -1,59 +0,0 @@ -from .bot_command_scope_type import BotCommandScopeType -from .chat_action import ChatAction -from .chat_boost_source_type import ChatBoostSourceType -from .chat_member_status import ChatMemberStatus -from .chat_type import ChatType -from .content_type import ContentType -from .currency import Currency -from .dice_emoji import DiceEmoji -from .encrypted_passport_element import EncryptedPassportElement -from .inline_query_result_type import InlineQueryResultType -from .input_media_type import InputMediaType -from .input_paid_media_type import InputPaidMediaType -from .keyboard_button_poll_type_type import KeyboardButtonPollTypeType -from .mask_position_point import MaskPositionPoint -from .menu_button_type import MenuButtonType -from .message_entity_type import MessageEntityType -from .message_origin_type import MessageOriginType -from .paid_media_type import PaidMediaType -from .parse_mode import ParseMode -from .passport_element_error_type import PassportElementErrorType -from .poll_type import PollType -from .reaction_type_type import ReactionTypeType -from .revenue_withdrawal_state_type import RevenueWithdrawalStateType -from .sticker_format import StickerFormat -from .sticker_type import StickerType -from .topic_icon_color import TopicIconColor -from .transaction_partner_type import TransactionPartnerType -from .update_type import UpdateType - -__all__ = ( - "BotCommandScopeType", - "ChatAction", - "ChatBoostSourceType", - "ChatMemberStatus", - "ChatType", - "ContentType", - "Currency", - "DiceEmoji", - "EncryptedPassportElement", - "InlineQueryResultType", - "InputMediaType", - "InputPaidMediaType", - "KeyboardButtonPollTypeType", - "MaskPositionPoint", - "MenuButtonType", - "MessageEntityType", - "MessageOriginType", - "PaidMediaType", - "ParseMode", - "PassportElementErrorType", - "PollType", - "ReactionTypeType", - "RevenueWithdrawalStateType", - "StickerFormat", - "StickerType", - "TopicIconColor", - "TransactionPartnerType", - "UpdateType", -) diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 46aed5f41918aec629f427700ecb5df057fc6957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2410 zcmZuyOK%)S5bpIO-iLR+ey`scV}g@7&I4l}fe<^6WWZo-qe!ilTH~3HGq`(t=$TEl zH~s|&egNVR@GCgXanuJcoVZ2GEhoBaW}S@f-O{ITs;hgts=nI&qh7BP`}ynlzn}dx zM99DJ(EIe|Z_Q!L6Qx`cdGyeF6GGV(F;zFeUz$j8M8a+R(kpAa9)>-0ME zN%4_fqie{g#0`0q-b6kvZpn4Jj=Uvq%MH4Ld`8@ncj;Z^v*Mn-Pwyk26CcY>x`}*V zd?L5#mgNidQ*ZHztS$X#>r2*3W_(-4J4#9?@Qz#+^5bsEt-HGO+=(B#v9AIMf~Rez zqWDO4wA%}6f_tCK6RwY9C+&DP?;P~FV z-q~+?_e43`+wR1%3J#PI5TEZE-FKq10~Ps@>4Ea`osE4Sbh7aCFdjwDDc=oZKki;| z{-FI+KggZ+i|?--I6C6{%7e1DE+n|CwbJ>{a_?$3u6f8EEIzE|>$8Xag}oPl>c`JL z?YwjZ6uq}vKZ0ch6P9juJ}SfT?5c1X1=Hd&fB7y_-~j z3ccRR^Sa*(MGpWB0$c;IV@q@ypaKB%tZM+n0Cj){zz9GSU=&~sU>slqU=m;oU>cwW zFat0PFb6OXumG@V;rq4E%+!gBnVTt=MIc!g+alpLP0h9HV_8mkXETMK6VNV;P`p_< z_{-SwS-nipFx7S*!F+)GW+Z z&3GnjER|{bsBHENNSkTYc6L4#(KLO~H}BLTk&T{K_}m?D4c+71=?#y zF5VCNZK@%R0+V(Yu=i%}Vr3YIfyfR5VVKH!3aAk?rt`tTm@E)L!hG9wt28?;C_~eV-wurJDNamw0}!aGb#Q7j z52)1)G3M9?us_Lb`$*n=^Z4`jQ>D+^JIeEe)Am_MJF!jID!R>s7wzx-leTROUk@Gk z%>LR$ZO2!q+L0T!F*4d<%n$sSvD;zyP5FT>V@L3>^h0|z{Fp~&`{((pzf>xvWGg9J zN>-AhT@`aDAq7jxQc|>(tR_WE$zoEplq@GjOUc(s(Ngk7QnZxZN{W_}&7^24d6E<@ zCHIn|U3Jdon9H6U2`SiBSv*Qe!LF)Lp@6oYDcMbmmXfukXjfJBay1?#q+pkO`f6aI O*7xfWeD#-B5&r`hdGTie diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/bot_command_scope_type.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/bot_command_scope_type.cpython-311.pyc deleted file mode 100644 index 925763458f076751aac07e2758fea2c1df42ded9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 946 zcmZuv&u`N(6n5J5$J$NPn8wBs5NQWgAzE%o6GC)r858X`wHZuNB+HGxHY}-w?GBAo z4_rBK5_b^d&R@Zy$H)>VPTY#dX(#NoLqhC1d4B#r`+LcI{xmmN0Ls38_;&c+0N{sS zTv~P-oIg;(DZl_50SFDpFhB}y0i1dVaGIou@zDg}i+U&Kq_NosrOZ#gEE&?Q_XnXj zC6h@dO6rc*$GV_@KsFKiub{|ZQ^BQ>PLUj!IZO`G zAP{l^1p$nhe~biyUJnT_=QY%2bP!E}WesQ!A{_dCp9_WrWn7vXl#5qU#RLpV*dc7E zRFruL`zRz3$^wKT#e+b{vk<->pkT`6AjH&DaIRK=THSBha-rI2z`fS?i>h6Ro6o9t zTh41}tF^noHwBh8pgCBrHMe)R+jgsJ@3z{~)Sz6viYg{xv)Ui8<&zhB~zOE16W!?GOcV1bdi5FDf(k}OD**U=S}6tX~QsL cur&Jj8E5AVYYhH(XKQETm&SizK_=<`0Mncn&Hw-a diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/chat_action.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/chat_action.cpython-311.pyc deleted file mode 100644 index ccea966c21305584c247d84e757588c45050f223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1446 zcmZuxy>A;g6zA#7iXzD{QU@J6FbRUfsBLvNiU7t*Nrc)u!v7%pQCBMST{syb~Rkq>ZV^zP#?)mpw&9Afj zeuLHhCTl>LrmndostyAciikP|glZU8e-tKIT)g6e!ji|5Cp=OKz7PsiOHKA`mgtUz zNH`V|-^Gl_JYr!q1c+aQSFA=HrwNxBywMAh!j1rc0S~YFLFQl&tGBWF=2A$k_#1^M zJW1$~C%ZPl9!}%2pp3*L0UsNd)s|*(CnO`+A>#srHK%9T(5-fdF2VrPUePVKbgM-| z-N}H7Ae}%TY!X8raY@JcG90gnf$auKR2W=A)y7?}FXLZ^5hG&}P}6YBSOP{BT@<}u z6*0-I=W0sLHkb8bn{YmqGm*-GAK;NvadOaVL4)|d;$uFPbh0nxumyumS~L!yz+71X zqspdgJFY9)M09<<^SZvC($Z#|yRwv#0ldN8~72f8r_`_pmzVDO`mR|8j=!!)=`B~?NanAw0w*Mp<* zVvvN2@5MB@G6!WqLt!S{;&4+WEi+D%&2v9~E6d>13Uk9G=OCub-@LF{uFjDWk5TjC z^!e<;qv_FS#lx?s-fa8nv^V?W$@F;kZ#*Jvozf1<^OjoA>6u-|ywU$;a*OI#BZE{nv2=0`Ofs7gF9B z>)XmW1q2W{0}*r~1P15Mw-DDP))8oyerUG|Gpie?k-rJ%n<|vc z`li}W0R=83z%>X|P{Xx|>6VD)mPtv`l(Q?H36}R56Y_|q+^55NLf^ct+e(I$P}pqr zlKRr-G~raxSPC24QsvleZ2Jmok2Ka6Ik;8Nfdy0Bo=BO9w&VDW)0U(&8gLx77!RBg zlfuDCxTh&{hJql6XBAZ|3eza71>smCpAni>gYbmn*LZ%|tYlS$VjNL~vN}Q$Bk4@r zTL`^M@oW>RAViq2jw_F!bO-&XgRIu;-yfpRql0c%?e(8^_mB5qd;)7dtn=pwZSR=z zsn=m7j010)ax57~>O(ympLh?$ktae)Zzb5D;(!VdhfKHQP&I$y=sr}k8U-pkL3&87 zWX?;9K3Dn*MN_H8pS3cqQgsEi+5$UQ7ro`~jYWUCb8YcJFMjC)d)TxxOIPBiI?7BT zc|p9ZGxD^{$~v#!DW-9kHnrfDI@>#wKlS;q{{-`L FzX2f<$&mm6 diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/chat_member_status.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/chat_member_status.cpython-311.pyc deleted file mode 100644 index 56fc5f05420b3550a496437187110ff308fdb79c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 793 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 DcjDp~ diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/currency.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/currency.cpython-311.pyc deleted file mode 100644 index e09e3c099765642d0f2be45c396c6c8a4282a06d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2262 zcmeIzJ5w816bJBKBtQr-FN1Bswrrj<5BZ6WjIs4tR?n4KNeG>2W+QYqgcuN6Ntq#& zf+9uAbS~1zlS!Y?kRnA&kJ?n}$T*d&oWGDglbPfLWF{-|(>?c`J$t2qlU3qz>u)^x0a-@=~DqV`MaM#xgyX-Do{obu8Kg!?5K`wUZ z6o2>c2>oiytsOUys-0x}MePJ{Ka8=!au0d9m-^U4 zUhboQ_R;|N(;yGfB_5<9zC^=3L?b**qdY=mJW7{&jK=vgP4GBf;R(9RSLhmFrAfX< zQ#?u2JVn=enr`rQy2&@l$2aK~`{*{`q8YwTvphp{JWKODM+-bpi@ZR7UZgwhrzO5a z%e+J@yiBXSLIGZ-yBwfMwoXqSsr;$68VrIshsbR7G*div#8UY{JD@W8J7 z>dljrn$xh^w|DBx+lThPQ#ta5YYks08~3)WbG4>ZwS&G-8;z5CFc7HL9DB9VDP65O z`+>b$qaHY^oF3W7jrz=omMhhZ%gS}yjasgd78SM(A(ax+2+f>Oz=$Lf4yA=?UeFO5 zk_czQf+=T&OEMP;$y_A1C8V-~Q4%s3nGu1KEmt%NFc&2$)^r(ZdFi4R%$7?JOQ>to zPtR|+T(P8-#0&{zrkoZlNauJ|>f$L`THL@WCy4}>o5;%5lA0uvIxvd@$#PR@no3G> z8tY3(rC-{RL>iY&?|@xdeY%7Z-l~B&Xv8x@M%o)$Nf=meHY6*}YLd;yq-hpSvnhln zz2({tNoZyyG;>mH7Nj_bxtu0la=OgrV=|Xd$olf8EH|IWToI7W6+$sV-xbiHP$~#W z?BK&LY0`>9rs1cS$FhzqN490Pyq0xTBjE?-t*E?9M1$pG&3Rdl)cD|dzx=Z4 zR2ntMlAm#% ze~gND*`AEvc{VP#i%rLtP`(OE9bd(Bm#V67l<{Bx{ygs~tLpH%^3Q%#|2FzZJNM_m IRJ1Sr7n@jS#Q*>R diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/dice_emoji.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/dice_emoji.cpython-311.pyc deleted file mode 100644 index f44f8960a913ff01e0898776fe2d8878ca46241a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 772 zcmZuv&x_MQ6rM@apLW%*Tf|$yQw1B3Qbg!4yVYz9wy+QaLz)@e*d|jaiHn|c@T_}V z(1SNcJSYm@{0}^MEII1QTcn=$78v zvKz9x#>ol50K++Op#dR~Ko?-?3BWRu2z;dg@Rq-8Gi0m`K{fM3xK$V{9WQk4jhJq{ zP-?3yd^-UI7!U(P!jNB;3ey2?m=YE95Kb69QZ3JMt-#^3OEDB{VeS7|StGwTmkNs*f&LiYmE~9E;bv(JDpLpq3dz})?lz^rJ+6;p@T+i zzt``?x#r+d@AbQHz)FntRBzYKL&|1mi(s0cD8yV-oM7sXJrScLH*CVc9cl zLVVM5sOVZF{44pIXcrMN;M(F5%kY#bh~E9{9HKufk(5k60Rl>(v>UaTXUZJP7o*$D zb9>SL^1`J^U!L8Ix?-{NHdVi>#EK}!#MENh57@fSc@dF@?Q(XSzp&qf|UgP3&-;D=%+aU^&c@U_Z!l<&^`bF diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/encrypted_passport_element.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/encrypted_passport_element.cpython-311.pyc deleted file mode 100644 index 0f12c3b0db9c476447f1b8b57c98ecac06549184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1197 zcmZuw&5zqe6dxzfCQY4eR=a7p2qdFYq!h71LR?k|$-5c07Kt~qT~J4nrjBQtHS5@B zW>P7fa^T9jNL)C95O>b}0UUCS=E{j%&~oaDalWJ#ePchruiu;JH*bEa)v7?z??3+e z;*SCVf91-S_BO)JM@o1F2q0Pv#v0NzPyiQz6utwbNDEZ^SqI=Z^{xpOiSB_`>F-=^ zX;O#DWE^gstB*O13B3E4Cgl=K76vy=%K(=koNx8GMyMgCR9&2;!R4TZ^Q z#wb@lZi;C}&Gdyyw`eolz)iZwpHx?PFP*TEo|;!eWc;+<4pT-?go+ulV0@CYQG1vQ z-VUc9I zQ6ebIp*uu5AVmEOm&QayaUMC0;#k&)L2`|`2*j!fvcXgyg$qWEt}V@N3e4yz;(`St zN)vfc0aWt>Hoa{(va2+qSe@mNGFhTyRk_nTkQI!RU`#QVRgA|enZ&tlVEoM_h&P@x z#v~1uxzUHNcj;JN+=0GjcRg9@Tb|dybbVRxxb~OO#a;UxIv$iYy8|8H_MhQ%%k9Vm z+wq~BLwAU>)#@%86UiIPHX;6cB>v0Eb_l7;E;VuD}z)g~7Ko8+V!us^)}4l2H$D zH&4@al5Drz9-(+M#Ub{o8*LKmw~tAhwB1Q?yVxV&VzGnBz*ILw0bx2KUKZgvWwIZf zuu3$+{+1)4IyogNVOo*~-WXG+o(BjMK9Rt~Omivsha7k$PF*i$itk34=^^plG$1i2 z;yA;D)+*B-C+0E7VO7V82+Bf%YmRf4x#1$BISxMwcdMPFu4Oa5Ya2&>b1-Cb&)Q*? z{=V7Uas*WOckQ9gw8NogJT?!Q`qb*0HlJ+EFqzgl;Ql=h40|x_7(=G?I(?Jrd$!RT zTK0ew&B2lR9$bm0Uc>J8=oz8okwH)p`=fD2-IP#=mv4mQ^U+>#JW7HT-=DbN*!6KT zaswiY+~&87l6FyDeiPmyr>L)!^6qU;E~v^A|8?+Rrh|^J-yO^A$v^dHg z!N_U%IJ(v!7QJ{xTig_{Jn3^amnBJ>fsN09fAjL1v_1#_s#nIF_3y&}<3GVX-A@Md B7MlP7 diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/input_media_type.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/input_media_type.cpython-311.pyc deleted file mode 100644 index 47e46d27bfb234682b2b241c3b6eadd780cd87cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 745 zcmZuv&5P4O6ragQo7S!(?g|SY0xLofZUt{egt9Gez&2vL3L!A0nXw()Wa4D9u%3GG z5Ae2vcSXGWS9tJP=IY5?rJnZWOxhJh-%Q@TkKcQ5-kW^f*{K6XU*3OxaR34Mu9Zuw zY=!kbC7c5cFr0$~1`q-RJObEw1F%U90zX&)d{*Cv0ux(9(6oPOwF#xwON%7lI?F>9 zDrtR39p`|60Adgr7^+Ysu&^1}*a|Ax4yw2kIJm0PIr6HPW`*bzOrz0RMqbbBuAC`LqXT`E^9R!IoOC^3I$i(hq~9Bir2XXBANkUL=5>4i zC$QFIyLj4dhtCc!K7UUD$&If$1w*n({e4HlM#VX`w##$ee-)?zj^cKL#NY1AfMlTIr#m=$TV3Dz6l7^?>W zE)Yi%W+-wPhEgZ;m>c$m;(pcTGJ`-w`z(bS*U~$f|)V79)w{c74I9q;8R7@zEsn2 zB8?7dE*=WohNY+(>*~_aXVS>hKNXD2gI=R-5|YuB6H>MaNhK>57Pkp`UC_lQa*Gfq z6L9;7yQA@_^k44n3`ZZ)%8umvcxMnFOEr(TB@@{+o)?N5sR;BD^XxQ!AttdFhCj|} zGKY)kme|8 zIkZdNxhXs7d8KF1P%gMiR~xnFylpe;w7Y<=n@`vGex|x$+IQCbpeh$*e1-0R{rjsL WO}tg1f7NC8lKrs$pZ^Kg$NdK6YP|&j diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/keyboard_button_poll_type_type.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/keyboard_button_poll_type_type.cpython-311.pyc deleted file mode 100644 index 616b2359aad31c77cdc5d8ff8446e757e0ee3e36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 783 zcmZuv&2Q5%6t~m#Lsd5r69VmI2`-hO;anjkpi_ky6YN7sQ6%HUZ*6EAXST!CoqFJZ z*n!JVAjF;j0f__0DOXP1ipFUt?4(6P@EkwC=lAjZ+0KWxwKg*H`Q6vU0Y>P%bym_? z8W;DBaf&$NI6+hFV~iX$MBI6ccnuuD?_GpGnOTWnd5@|s_-S`?d4VHOG|`J-HGkvmg#H6w$5y!xZ79<1`NnqM|Eak)&nmkB}9-D}e zrdK9X9;YJ`mhiUTA}HX!c8R_xav4FNjJ3{G-}6ir^fV+el5E-&a^!_VE01OIt;zBv zRV&NNaxA+P?ol3}6io@EJYjOD+bCL;rfdq77HvwWg6D~~JCq*fELldHlyVW7ZTH2& z6TfKgZVeB%AMSoc7xs29Uk&=fOCcx0V`0w_OmfMzkkl{=Abk^T$6=si4Rva(NK^2OD!pZ`kN7R}?RRpQD)2wJlJQqGYv;ry9?9jG- zE?7shh|L6vJ6z1{3745o((s<5NjE#GYD;qp*#RT8)Y%2gN+agE3`*S(!erPsOVjfb z5;M;$o1PbQnnwz^JnvObqD`dXd6fI$HXoln@AZ3+x-hqwy-{flPR_>tQa|oL9ezS9 zHMi@t?xFjFi@AHuX_(C1c`k_L!h=1!EID_dg%cM>#qOuXpOYEOToQ715}UzQWVSkj zw><*@7-uKF5C(8pN?m2v0ag5YmNnflmq@7=x_P(gFK+A>-9>A^=vAob7G1HwB^b7K zm<99_8n{X=lVZ)jr!uOvTY#?3hwE`1i92Ab-y$1;T51^M1-kw1?{`^m;=LvMS6yjW Np#J&-EZ4^%tZhI diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/menu_button_type.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/menu_button_type.cpython-311.pyc deleted file mode 100644 index 3c9d400f090303c48c811e1f032814ddadd1508f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 712 zcmZuuy^qr{6t|PK3Dtc7(ure1kznaS!(1Vx-nEqBT28d+q$rZ*#=c&zO&n|oRHhF6 z0c?lF4npkw6%34(S0=WiGTnro_K*-f+t2Uo_nzPL$L;MJ(Ddc~*HaGy@ZBg^RNV-x z2U@rQ1Q0j{DGVV57U%+Ey#d6g7KI-i06y!prqCwN0Msi#j9Q1v>10J3Z=B_&3zf9G zqpu46DH+P8*DmgAtP=z#p(;%5X{%QZZEaGvkbIr^x``;mZffb$d$^v$ qBfh6q^X;Oi+0up(F2LTmzxT3w4el?&zwGVc-Myd2{_8)^vfOXYR diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/message_entity_type.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/message_entity_type.cpython-311.pyc deleted file mode 100644 index fc266ea0416ca9e9bd89864c4aee841b9b570dfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1203 zcmZux&5zqe6d%Vh|OV|3fQr2O;iU`3E@kXw8)qx1imUEV#fEpdf$(xCFTH9l#uj6)0k90?vwmWagQ` zB-M{SdpDUsgq?Bwn1h#q04QJp3s~UP0+g@_i&%msT!b<%!7`R%1(#tJS6~fSp@M6$ zjum)->+ldCz$1JJ8~6ww;|4sz$M6)Nz$QM0cW{%JafdZ@5{A}-sD9)`H|EWnyojqU zF6Pn+TXg=E*ikDW>wtvBkHS{OBUoHC(tV3Uj1GK$vWMZ0a&fSgCf zC5yoF&S|h{&uJ94t+jK1N8hot^_c8s7WJ9Dw8CX%EtqWYK#lW|O+C-@F%#p!Wkupy zj?0wwlKKSkPdFz5ljhXLtmH(N>)5Ok`$B3(>}bOtt4v3Ib*v3XDyvV-@$gDD2V-M; zIbibS+8An_Q0;0)@9OKRVXCaDKDy@VJ6%mhZ@HzO(N~#xJyu!8R3Dj$C%j@x4)+Bs zz3Id>bfoIW!{JZhHf!8B)BeTm8yc);J&GNFF$mguO;F^ybCsQ>@C8@NKVwsniscQ+lmZUlNiNfa zyL)x~L2{K=50hT1oFr;`@?oN-wMNoU>&@h=^yuAWn4aEG^evg1cc^1PEYI%g&UWE~_$|_!sRUuVP@1Jm`f*F4kO6F6}h+G`X6W0A{{_nmo`rK<0`p^&_n@g<+hAnpk{bEhIxZjeUz zcY$TDB3P4LajBd0h%uhfLLlKh$aD=bN%(Tqt?N3aNf2{Nb%WAauzYFw7NxKAV7ar@ zC}ko9H8~v*U+Cu1)4^akqJ=;Xj-E_(4RACX9)ChxGpwuALEnEVY>e?5-TwCX-c%d-&IbJpm-gl4r_ulVkFhBC8?ji(*#H0l diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/paid_media_type.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/paid_media_type.cpython-311.pyc deleted file mode 100644 index 433b4a3a5bd49b0ea593cf29f00631a6ecc4b652..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 708 zcmZuuy>AmS6u0jq2~mRhNX3RuV#+{{IYKP$sZ^p(piwKGPO>g%H#w3!AGQ-zrXcYL zuoa0NgxL8j7#Jh3Ol(16>csOUMMCgwKfll4dw%}dY}OIbm-k=KT#V3nqg+vCE36-Y zaDgbIc#1L{VvH=bkErzqQJYx|e{c}`3}-{3O`T)Zc7GVPjkOcxvn<&<%L@vXw7v`1 z1!5?~6onSWkZOevwL_OWVTHN?Q_;9P^n-Sl1gXRmiUICtR?OVpBE}an|8t zKY+=oH0Ulosf*v+0@7lLSD?` z>DE&vgz^N;ZvSy_(9_lav*6?)IMwdS!Cuh&gw|#_mrwV)(J2>`XqVG8A4QXyh!qzE znu=IHkDjE%NT!P2FXChZuaZ%ma?`rcVBXRuOB{P2|+rSoo*2;3+ z+6o!gK+V=7SYE%g*k3koF9Nf~&8ys_wxb{V`bNu;x@7Z7coh-&ER@Q0B z;RzD$U1TUZ|Ak(re-e zyc7xRcV8$~$bJwcT(F*EQ#KYP>v1s-j=7QnDbiaf7ZSTG38P$jArTYGU+2&7RPKsb zXzwr_j{LRC#W*J!!?^M=&NwZnhHqm0vLw?svxYI{i4Jds_n++#o*a#EBi1^?)ir+t z3)6!0;h-NMaWRP>aH`9RC#4{Y3#{)Mv;0*&OpjxkDz;mYWJ1PF#w6vYnt(W%L8xuP)$i%5ateiMZ2&r0AR4Col6p*4ID~sJOERBQhP8z2k z_CE}X3nvib&R@Y{HzHp-aVr|9ov_muiI3;_=lAt{FM9TeO2q(DKEM4k_^JW$O&JR* z&XtS1QaJ+%AT0tT&DAuJ0}lbpodT4{Ijp_c0r({MOx!%u9Z)NLS7uEUx*d;4!9189 zvQZ`%_vCQ~FmN>l+#J#*HRtLm?-r2m7E!@nLPfWPmfU4jat*ZXmXYC_s4UByVq@QD zEFqNJ5gy@~+msU8KS}WGQ^S(dKMa{g4qoDbTNEc0GnvFJ-%92@3(traR!oaa>b8+l z9Wtf?-mwljPuNbq9uSJRxlA8Yf3!{Luzo-|tNTfKYf)@oD=U@N5IXX?FN^^tF^4Qf zSeO(aW6JQ%Dl!}mLM-$_7-3OR$ixb#e#|1Dha`qsp!&CmiSjsR2@XQZM%`LPlpu`# z5r$A05RM2MM@ly#d^Pr?d1MJfL;~s7n~i=$7_Hu3w-23m(-vmWerER^duA0KyVGjh zLT|M@wkRlc#7e){=sKN7zrELmS)ls2#}VbHU1#6kZA*6ZBe+mkeEFie<2@(z$lE0- zjECOQnEIShDCg(l_}J@&2ObMKzLWUDkw3)D^FyMhT*va&u=--Wa6Vs{4H#y3m7LIm z?2&2=E|F)P&Kh4=8Clv5sa=-t&u0ICZb?%;a`r^RG_Pq| d3f9m6{HDb#nl%Og!W;Ik`9t}C{wJ8V`vsvN8I}M5 diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/poll_type.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/poll_type.cpython-311.pyc deleted file mode 100644 index e23f58ee235624b9c40519e2ce78ec38d1f9b7f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 638 zcmZuuy>HYo6n{>9chS*OK7@prBEfP47v@uigt+R2C>8WWNKqs!7n?L(5~sF<)J``r zFtT-E2O)O;1_lPk$}1CF&@pww&RvlZJljA2-lzTS59{lFF!K4`*B4*R{@p4U(p{0o zJwr}`0!29#C`1Sxm;iNN19h3h(0dH<$*iS>F2#E===`wi0BO8c)%wi{Y0i(7`A z0)r4y2px({suN=BhMi>z?LFmrzJFY?6VmsM>>p;*=hK%gQNCc6V3L(e`jv_Dl?m&& zQG2`=2^;x`N>y?c1PK>xs94TY5f?))(qPJ!4B{%gZ8O^(-4iUW^H^wnRA(nUgRb@n zDdU0>qWgptoYuMJYlIxtalZ2O2%$VN=HBks3uEx&}9)%xaVS7A(JRU{QxtK){ zInBy6n$;p!To7}9#L8FEb~cSR5D4#TM*S z%R2_ qdtY2Ps{Jha#6aUBgwEi`x4&o8_0Y8j{)IR4?f9p)|N4)!J?=L`X{R{= diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/reaction_type_type.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/reaction_type_type.cpython-311.pyc deleted file mode 100644 index 3511a4ddc7318f957b336e3dbf004adb0e28ed0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 680 zcmZuuy^qr{6o1Y~sj3!EI#`&($I^j@xk4;=)d_UHlV}lA6v;~CM=#eV4z_dBF?HY% zU^^ss5Mt-AU|>9DWnv2|(@oe(i-h3W{`vPl{cL~i^*W&C%loe{f9U&3e7;cv_|>iS+pF6l3KH%mqr!l+?6|_LL4C zbn4IvFGP$(??kCw4t+o70tX70I2Tbm;9~C2xRQR9C-=7LCcDlpT}=6DQg-7)DxT6> zJLHaW$!Nnrn<1ESM;i3?c;)3d)Ld?#>!(HV%6u+|_=R<8(Km`d9vS7+U%p4&kl(;oju@vWbkdhp!v1LrZ{OD( zCHtdDILY7$Lg{cwIS7cQaHw($q;qlwb%e$`Qh{p)wx47?gr+l+G8IkN4HFIx2@@D{ zI&CC;=nfJoT$)CY)@;{g1y{k6+lMro0L#lM#4L)3c~xX#2*7~#>gBvbNKB_dNM0jk zny_r5?F~ZSWOTC5lnG%;sKWN{^X{J4&dV>oUc1}td9S@b~89g z_&8`Kx>_*KIF$(}>RSVdkAuBv5Qs>^6JKZHjG1tqhIW zk|(s?JdtuC+F_V5PFs@B>6GKF#rQNlW>SQBk={)>#ggXqtRfIpmK4ep5^GN7<2=v_D18*c+gdTXE-?OjQc(1 zJ{$DpZtq#}MZm%A#>o-?@Gx&|m zv%|nqj;X+H?NYXod`o=YWRz*U8eRAY+Xg(~``R@BDvq=&YzW~R?0@}x7Ty)OSAc)j Qo9^4apT_^|Kf$uxZ&AEc?Epdu!8&?y5s<_IBGZ4?1XDmAH)PA6H;*-5T<7az8-s7x6c z7`t^~2O)NT1p{N`m5D7VOr5YVDH4Lm_UrfavG4VL+}^GMjW6%Nj_*PMz8m8j<&Cm> ztd&bZ0D%cep${RjKnD=(Eg&|vDE#06@L8`le497}&?x;dW&SmZrmyKPi^)U{q z%V~mTbVgmt+}G16oED)Ji`W%YmM6p=>8eDhl4h--8L*s(wB=5v%tXucLdI!R(u7Vp zPMeHRyb+Va!&$UvXfh@u8L?SWt16sM@&t3`n3$@ExsWVHG-anzzfndm=eBk!TS&ep zzGX6swA)&{syL)&dBtSuzb;<7MIb|&eN-JQ4}f*vFX z@u-4_7Q8Fs&4b|Ipok|a>(P@JiPTd)=*%V+ioV(X&F_8ed$aG&%bA%15c2lQSO{yiBsD>YV z&cvB+qEISFm&LXZD6k*_R)#?FX~t5CVr7YHOqQB;^|KYSA9mA{n7E5u!0)Yi_P;T^@KiDi_k&7LNmmHnhDc8iWm9@3Ckv z?vx$w=@E5lFTft5VP9m?qZ86`c}K6;m%6l4UvjFLE?=oFR!Oaf@k*DFN(I;I4(={r ztvi*f-kzk<$E7xyOGBOD2&aI=X<`qhrz|^z!9}yWv|v`3)5EdRI}X@`&%Xit^5{Ka z2j3q9_U4&T5&s3YONAtlkdHlzP*On1<0N(^FCug&#_q&3g%IJ6FsrNPO(V(OHcWG8 zH_6@F+A)oGlHF_?#&)7McUnfGG>!FF;7E?+xVhf2cX`ma*EnH*&+f+oj(C7NJhG{O z*EU(l4p~GO2H5H29t~~GxNMkC#e_pW{U;%qKG<)sU62pB04!b33s>GU(o72(_n{0mQ82bX?G`_KP4({g_R4bkig diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/transaction_partner_type.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/transaction_partner_type.cpython-311.pyc deleted file mode 100644 index 4067baa9cf03e6af8c56ea3aaeecd960676a872a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 764 zcmZuvJ&)5c7`D@-jY>}f%7?@h4weqI$66tziiY0M7SskIMUgBwcH7W44z`1IOcmlk z91;r?2(j}k7#ORpOl(DEx(PdN;Sjt|9>1T@8^6wngM%_q^7-wT@m&bOH*M^txKlPq zN;w4t5I6@5=tBq$&;i7F4M>3+6uvhB_@v&g_yuAPLCyNE%^J*1H%=GfE|_nsQ7)T9 zwVeVAd`N(A5U5HG-y{X!BBoy?mR}-8MODhKc^t5^ov_ zhmD@mP&%9@oC+FC;b2Fq9EXh^`KQ`Rw&nG5UOHqc4{6hxN|}geqY*Mr>ypmtgyTh> z@kwLEq-fwIx^<3Z$B{E+_L$?zLUqh6Ca08VW-1g`_ACe!(XZK=jZlmi6rrq)(1MY4 zuJsB+&r>|#MM?+}7Am*>aM0@X+`gAtkGx}dkeN@03M-!5bvuJr54GCEk6@$6c;>g8 z!BfU(!2?F3coNJ~jwRzreR)9R7eO}~1tOC4PJ+W3o=_3si0Sh+sJa=^ICn6#I~mfG zt0yPiQVnv@*DLA@mcQ59FfDrxG*rOF8_VNWrMh%i7cMQ^tLn{VS1(@O6ZC6lX6lB# zpj=r&NWNvitTXboD@r@F?`>yupI=v|{#8Uz!MXq;T!E`!|9;lRGCW*^f8ovW-R&RR K|MNe=yxlJ+f7ZYN diff --git a/env/Lib/site-packages/aiogram/enums/__pycache__/update_type.cpython-311.pyc b/env/Lib/site-packages/aiogram/enums/__pycache__/update_type.cpython-311.pyc deleted file mode 100644 index 53f49c2cfbac807122479fbaa950eaa0317a8983..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1599 zcmZuxOK;mo5GEzcb|hKW!?tXvZdepO7)7l1(57&T0J2QjiY3Ywr3P6DSWw)JMVsQX zB$dEDsX%`~E=3N#wa zggYXa6nio@5@YlyCgAD}ls5tukVpiSA|iyQkVMibLnO37GH8)3pe3@1?vW*wCHGK{ zWKo{v&@#!R0$D~Yq=1TK1(iq47l29&hPvwer? zKJ8sN^!p#OGOXUn^kg^M9{IlG?bT`qbLp;6Eqdze<6Y*S)`raYYPw^790x~Hd~r-YPd}x+ zK#A#7g6BAIjC9+k7Iv8D^Gag9Ne(BTX+u0V7`Pg~$!uP{Cg+)|N$efNCV}$8J#Sk) zUQB|qOZ7PK`fUa_o!CClo3;f-;O{2Xz2K|Hh(Y^sLP9Smmd^_Y^lhjc=ZROr8<~z{ z+NTLFL({P_qQ*I!_z5RD%(8eclvuaDSJdT&@dbG4KJ;ij1e|*xlp=7(OdD#3VxVc+ zh#Io6fn}GD*-JRnfXgyv@tT)O1zSdMB9ydDR+UPYqDlcA>^Gwww_KsomKxrxA zp0_O;FDAjbtJLGX>$e%$w6FGfzNxmL2>eZ7=|1PHjiZjHs5l|Jiq>!Sc%e~mwf5_c z$z2b_B! zlp^r7(^R2mCBjuPiN9vP}-h84I(G-gU5X|uT$NTxD+16 zO#{W#p6|wo_%if}+`a73^2THy*7x;v?z*!ur|B-TrPYd?p_La#p}vz O@=wVB`#;8LyZ- None: - self.message = message - - def __str__(self) -> str: - message = self.message - if self.url: - message += f"\n(background on this error at: {self.url})" - return message - - def __repr__(self) -> str: - return f"{type(self).__name__}('{self}')" - - -class CallbackAnswerException(AiogramError): - """ - Exception for callback answer. - """ - - -class SceneException(AiogramError): - """ - Exception for scenes. - """ - - -class UnsupportedKeywordArgument(DetailedAiogramError): - """ - Exception raised when a keyword argument is passed as filter. - """ - - url = docs_url("migration_2_to_3.html", fragment_="filtering-events") - - -class TelegramAPIError(DetailedAiogramError): - """ - Base exception for all Telegram API errors. - """ - - label: str = "Telegram server says" - - def __init__( - self, - method: TelegramMethod[TelegramType], - message: str, - ) -> None: - super().__init__(message=message) - self.method = method - - def __str__(self) -> str: - original_message = super().__str__() - return f"{self.label} - {original_message}" - - -class TelegramNetworkError(TelegramAPIError): - """ - Base exception for all Telegram network errors. - """ - - label = "HTTP Client says" - - -class TelegramRetryAfter(TelegramAPIError): - """ - Exception raised when flood control exceeds. - """ - - url = "https://core.telegram.org/bots/faq#my-bot-is-hitting-limits-how-do-i-avoid-this" - - def __init__( - self, - method: TelegramMethod[TelegramType], - message: str, - retry_after: int, - ) -> None: - description = f"Flood control exceeded on method {type(method).__name__!r}" - if chat_id := getattr(method, "chat_id", None): - description += f" in chat {chat_id}" - description += f". Retry in {retry_after} seconds." - description += f"\nOriginal description: {message}" - - super().__init__(method=method, message=description) - self.retry_after = retry_after - - -class TelegramMigrateToChat(TelegramAPIError): - """ - Exception raised when chat has been migrated to a supergroup. - """ - - url = "https://core.telegram.org/bots/api#responseparameters" - - def __init__( - self, - method: TelegramMethod[TelegramType], - message: str, - migrate_to_chat_id: int, - ) -> None: - description = f"The group has been migrated to a supergroup with id {migrate_to_chat_id}" - if chat_id := getattr(method, "chat_id", None): - description += f" from {chat_id}" - description += f"\nOriginal description: {message}" - super().__init__(method=method, message=message) - self.migrate_to_chat_id = migrate_to_chat_id - - -class TelegramBadRequest(TelegramAPIError): - """ - Exception raised when request is malformed. - """ - - -class TelegramNotFound(TelegramAPIError): - """ - Exception raised when chat, message, user, etc. not found. - """ - - -class TelegramConflictError(TelegramAPIError): - """ - Exception raised when bot token is already used by another application in polling mode. - """ - - -class TelegramUnauthorizedError(TelegramAPIError): - """ - Exception raised when bot token is invalid. - """ - - -class TelegramForbiddenError(TelegramAPIError): - """ - Exception raised when bot is kicked from chat or etc. - """ - - -class TelegramServerError(TelegramAPIError): - """ - Exception raised when Telegram server returns 5xx error. - """ - - -class RestartingTelegram(TelegramServerError): - """ - Exception raised when Telegram server is restarting. - - It seems like this error is not used by Telegram anymore, - but it's still here for backward compatibility. - - Currently, you should expect that Telegram can raise RetryAfter (with timeout 5 seconds) - error instead of this one. - """ - - -class TelegramEntityTooLarge(TelegramNetworkError): - """ - Exception raised when you are trying to send a file that is too large. - """ - - url = "https://core.telegram.org/bots/api#sending-files" - - -class ClientDecodeError(AiogramError): - """ - Exception raised when client can't decode response. (Malformed response, etc.) - """ - - def __init__(self, message: str, original: Exception, data: Any) -> None: - self.message = message - self.original = original - self.data = data - - def __str__(self) -> str: - original_type = type(self.original) - return ( - f"{self.message}\n" - f"Caused from error: " - f"{original_type.__module__}.{original_type.__name__}: {self.original}\n" - f"Content: {self.data}" - ) diff --git a/env/Lib/site-packages/aiogram/filters/__init__.py b/env/Lib/site-packages/aiogram/filters/__init__.py deleted file mode 100644 index bcadc17..0000000 --- a/env/Lib/site-packages/aiogram/filters/__init__.py +++ /dev/null @@ -1,51 +0,0 @@ -from .base import Filter -from .chat_member_updated import ( - ADMINISTRATOR, - CREATOR, - IS_ADMIN, - IS_MEMBER, - IS_NOT_MEMBER, - JOIN_TRANSITION, - KICKED, - LEAVE_TRANSITION, - LEFT, - MEMBER, - PROMOTED_TRANSITION, - RESTRICTED, - ChatMemberUpdatedFilter, -) -from .command import Command, CommandObject, CommandStart -from .exception import ExceptionMessageFilter, ExceptionTypeFilter -from .logic import and_f, invert_f, or_f -from .magic_data import MagicData -from .state import StateFilter - -BaseFilter = Filter - -__all__ = ( - "Filter", - "BaseFilter", - "Command", - "CommandObject", - "CommandStart", - "ExceptionMessageFilter", - "ExceptionTypeFilter", - "StateFilter", - "MagicData", - "ChatMemberUpdatedFilter", - "CREATOR", - "ADMINISTRATOR", - "MEMBER", - "RESTRICTED", - "LEFT", - "KICKED", - "IS_MEMBER", - "IS_ADMIN", - "PROMOTED_TRANSITION", - "IS_NOT_MEMBER", - "JOIN_TRANSITION", - "LEAVE_TRANSITION", - "and_f", - "or_f", - "invert_f", -) diff --git a/env/Lib/site-packages/aiogram/filters/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/filters/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index ae5acd030d82281390dbc0d8b2f620716bb8b366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1311 zcmd6m&uInB9O2o@jT*2Ac~_PV;N#N25}q*1uKxi2}t53s91#*PC*){LBkrX z;1$T=j943WS78mW!8%@tEY6Ca>~6p&-h>>^i8|(PK_2I!fD2H>MbV49+pvRoM6S4Z zpoB{jvL$@iO5l4|vW?2>Pl<^wOEiAuxS{QrHL4v{>qf(9cUlLXW{WD7mM)Tn(I(;+ zO|q=6*AMj;)mYkSc9v!4Mbl^ywzAPSI!3cW$JU(CtA zY&Gl6j$Xa_7qz7`6-I@%=~m^f8P;v++5W4sWrnu35FBL+JpglLQEibld++RiNYjh5 z9h!bvj?kR`zHg61#~an{ATWpad;-n>?sv||i)J}WV{9ZD(1bHOv;B}|vgeZlvnp9P zhfcq0h9)agY%Ln*yJd36gXBnVjS#^LcYe4;Yf4v z_sv&0;v6d+363O3iX+F7=h$Lsly|AzV+!VCvVCS80pT1uom)5GNNg#Fit*P&#g<~S zP#^?}eT6D6mn!|a=YKpOP1;M3uOF4hT#p$xm&p|htyBeWBVlK03Lj`J;8xC!*%q4+ zV!AFNU(h8h(N(Rw-+klxC*6u?Iiq3s2<18vk(iG(qn yzoCSr{Rw*dub864$=_m%9!~xpQ?xs|9aB`A+>Y;B_ClS>#Z=@%;XnUAGw>H%zEl7J diff --git a/env/Lib/site-packages/aiogram/filters/__pycache__/base.cpython-311.pyc b/env/Lib/site-packages/aiogram/filters/__pycache__/base.cpython-311.pyc deleted file mode 100644 index b4feacc3dbcb938b9e1453984ebbdcd80800fbf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3457 zcmb7GO>7&-6`uVexuisq)K41Mk+F&G*0deUty92YR2QyfJ4Omdg>5up6|9%sA+^?W zmziBkmOvRg=%5w`Vgo5GzzCpTTqO<~9fCl;sXg_O0}Zf+uqOjWi}uDqJ?YfOd@*X_$5yUQsn$bPSrkqiID5pQhd6+k%*@ zx^1Ys!C3=MRNeEKS*Ur`&2YwyuXJ|$vd+q`AD*2LdPcn(vx`F4gM{GtWBBhP=--7Y zpjrTzh>L&b($F2)ZlTI;9o!kGW*KUMb`&?Lor(3ZUnv%8)pJ$TE;<#oi_TGSCTic_ z9q6JK9LJ)%tvXCK0HO!PWCN}&xCH%|y@Tv`kh!yfxc)U{#d#I5|6$;&Kx0+SeMZuf zFT2z#u>_dMl0aO{G2qyHXEHneD~HWaPdMn#>De07J%?!p$D5}1-1INZ!n6y~d$Xz+ zXZ135r*+dQGrcm_hQL@scWI`&zy?6#Vj@6LrsMlp@T@qHf5UH?v<68$wK};A3xr{g z^+W-6!vF3mAQ%CtBT!eC1gsHtp-!GcoSt>#2Jw+{OaxxYWyR#Ftd*cljI>qEv{lSl zPT4H7SCLa>!_e`ui(6HdjX>weG_5T`TTFG0=q$YsEbbdXmdTFt<3{iEBJsV|du#G< z?mxKSP(~S=?1xI0UUqXuJfhQ3ac*8123>&tsf(B^mg}fyZ_?3w9tE__0AwskJuWrK zmYN$R3IH-NvnvPFuMID=QnhFWF~^fFK<-P7W~(|xGLV{8={?AA6v|IIuNDE2fbLq= z&^^dw!(_DRSqt5Ba%>0;>3H-wjC(vf9BkCux@%nO;__^QmE z*@F?hdl1FDe+Pn2TmfWElHQWIB-N#Lcz?JVBJhjrT@3B#=#_C$W-s;x;&pC85OENh zcQMSoJ%M}9kk{qTe1Bh;dSwD{=u;U`9nKvx89lvw9>`--hT}d=EeYN}BkDr0s7K<1 z!J8zAkKoIURvF}ln7QCfSOfO~e=jy}LD-=_RWC1&b%5`hWm|_TNj1;WpsoNaGUJv5 zmDs%ugU*Hvppbh4$TDdp&jrt#`@7+X#Ye|JIo4e|I*QyR40+q6foV`{Nmvr=;vXY* z0lXp9#V6vY5*U-fTAbSxej1o0F-%BbnDvFZP9@`M%ud4kcQ)fku*v-)5HMrpz2N!1 zxBk(_>)WaA(Y4e=>!G#wOQhSQ_~Z8M31=3?^Xi_EPKW$(kf(kKDrLp>WpAMh-yND} z>lLbLzI@j)?X(<}o^B0h=kQ#F1{C6U85-7(aD6vvj(RzULhf?qcX$le4RHMPYszJJoFx&{p4(O@N^^b zHar{hm(kCoo2Q?jxzs#!DOf|QynQ&H-O`44%VPj2Dikz`oRCWk{Ca>6tFMdfZG)ql zrsJ2IrY$Br=NfFikikSVVQyiK4=L;!M==FDZ`rMOMr70#!&)vvTeuHJ@`&^VJF6j8^FGg zqfsR2cZSH}kmPy=5X9S#A;F{E*TB~0eZQ6{hm;mU(od9;7DkS2;=bW~}B=%}cRHCU3sYRgMba}T`+rIVJ zw;EG78@JzYOuhfj<;K+ynm^0)cQ47e66}6(g70q)OQ91j(o15IP<-RmhPyejaqo*v zi@1F=Y6O&9T6}ejprs%6Nc_%Pb3gh&=ZRkd`C}!VWpvIO^FU*BjsE jc_AfRL=fKEkuNrSpH_HG0J{&9)tleq>VJ=T#a;40Fxy>W diff --git a/env/Lib/site-packages/aiogram/filters/__pycache__/callback_data.cpython-311.pyc b/env/Lib/site-packages/aiogram/filters/__pycache__/callback_data.cpython-311.pyc deleted file mode 100644 index eb0cdb3a33149726d971de7062a7a02389c3d4c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10040 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 diff --git a/env/Lib/site-packages/aiogram/filters/__pycache__/exception.cpython-311.pyc b/env/Lib/site-packages/aiogram/filters/__pycache__/exception.cpython-311.pyc deleted file mode 100644 index d3b9229c1c9f245f2357aef4ccc3084ce3095f84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3324 zcmb7GOKj9e7#@4q-bWt0c@UBSiD^Q}f(S@FOKB^_BhZ9^%A=AM;cnKGu)(_yGY%zD zkfOpNs(RoMiAWVvDzy{@NSrDTJ#gruhaNU)C03S@ka}rvi$X7)`v2oyXEz~89ozpr z{@?ch{APZstBVq7zy9#&Xig#IFPxMc%tc%N4!XOhwB^$fTc`>TP0%Xykr?kVo)%O|KWc zFz_O4crjBtPZH68P;@Avx`CtFDK~gLopRjJxuoMzmUV*{rY5MXT+F6zn52^2Nl31G zGHn4DM)en{MaNh&b9Q8$rjQps!I;fXT&GzlRZ>E9;nHOJG7Rn#N_5F2x@<~%z?Ai% z8K4SP+x$01Wixm?sE162hE0`5Xq48_T3R&-Bj6mgqQ+(^+02b4zr zJ$0vdMm1O&Qb-Odk;cLah!@B*BX-%J9RQZ-UUOmnVGT>Fq}y z&7u$t&Cb%5mxQ2}<{G2dCew_XLkZc9UP@Y%R76FX0ZTzntx+-IGN`X<@6H@QJp7f- zt_~lw&2)Bb`06A}IyN&#Y-gBeuMZEVM}~RYp}QuMsjJB`%7>F_8{@uvRHOpm?K`V) zV#*C0Mmn2z3}bq;Z^cR=`pVom{G4wGGE0hK5^paODRN4B)wnsg<>XRhf4;FlSKD7` z@16^OADe?~8AOR2ut&ySl~HGsWmBksxv4O?1<&%=Kn92eajA@n<5vYCP7p*&ZAQ8e zUwPzzY225aA>+PWwG2d08cHZ`G|kgl?j*A*$}q!O4G=ftJEP=r)_}YXKuQj0jVK3h zN+m68eK&dBR(x+8kiX%YC9h&__qy**KiIp}zB`Zi$Itft_W4q5ARimZg$GzONDd`p z`1NcuLk+`?8b-!8CoLS;8pgHBq*daC48ycjupBWAZrKhu42EuWBYxai6U-Un8pDKl zgCn+WG4zWY;0|NxE!Ga?ArZe8rm;F)MG}FB&jOkCuc9m~;UYm2CJox`>0(e-wk;li z(Du{WB7xy*5|@-gX|WH|1Nx^IpY40z{5G;FJoOr2+;;0EVM5R|I0IAH=M%z^n+uu-oFh{0!wBimU`% zyF}d!*jfj*GM>DUdnmb~2@kv(mR41TVAL>P%cH{B%IcVr9KQkxsm^xR?38yec(0;9 zR-xQY59RPLqKW-Qp5EgFR|(}x`W@E3q+|5PgjSmSVo+HOlb(G9#FZI!Ln%8mk+!HX zDIt6HgyvP&lgQNR&iA{~2c0f_YY&iF@^6^bw%i%J$Cqll@-w|KnADgYe5ktOs5KaBenu zdMuj+bfbo28&F~Z$e!Jju$$v|G!H?ben9{Lq+?yH1%D^J!n=XYl0vNMWvur_thdnI zIzLzpka*$^k>k;~NT4bsQO{6BtE%L|O1TBk@;nd^Uco3Bdu`D-ue^eNW#Tx9AEoA$ z>kj5?0N78q>P@tIc2k~_Ih-HP!vShWPUBG~Fm%$5iCx{G#+2e;0P#>7pslfGe)G$Qt``kmKOcJ%e4;;V zTI&5Yk9Yr4_o;mMsilU~`G(VTY9Y1(bFZz?)Ou%sA-;9-KrXf;7v3QP0Z`61!DrcK zBwLVlAn8Pc9`$TOpLtNd3r7O4x8ew^aRsCqroR_p+=AG)GQqF&AAzig(_1{8?p#zB zQx6V4-TU}RuIFH0JA`1}xthcSN_3&ANT6Fyq9JAH>$*)v1^S{&qOm#W&V_}p1-{Tb ze>oTH%1643A>@&Dh^IX&o`|yqbgl}=HY^ehnrE-@25w}YhcMaP=F*X+uXJST8%c7? zaDQ^^$}Bwpap63-t!k~0;<47Cc&-(jytl&%_f@;}UHFK%*?z|GY=~9CT_DAPBuNDl znH5)o9LoKl`!(5~tG)}QH&=ZZ$evvFT~y=Jpj0I9rwcuA1m|rfzh{#Ku3t+QF1^9k Kx9?$zfcyt;+4B1U diff --git a/env/Lib/site-packages/aiogram/filters/__pycache__/logic.cpython-311.pyc b/env/Lib/site-packages/aiogram/filters/__pycache__/logic.cpython-311.pyc deleted file mode 100644 index 381aa49e484c3dc4c0c7f187c62688d9e684aa04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4841 zcmcgvO>7&-6`tY#h!jbY79~-NWm$C!yNqNyjhm!M6h#tg*{%(ytsNI7lrAXlN?D6P z>g>v`RVolrqg4twWq}kH5Fd0%)d&U(oeCdw=plz5sDeO=1p*i-3ba5EGUP+xQ{S7R zC@w|Y4bWzG_RY_GyYuF~_s!2Ag27G#=}#a1W$ryMA%Dllep2g|y?;aH4$+BDb0kmG zlw#eJ^W>$pl$XOF66uH0{SrnVjHkkv;t9 znez;QyhyIPs{7!ZPF(@x_?@73v2ep+wy@3?Sl`aDdBbLX@F~Nw z9hDjO5-X&#p8D^wz&gg%UJsBvq(nxk9#RiuFPh93WdpZjS%Z!q0|>SvM5u z2D4z=nzr2MQX;KY17e|hhMOjfQtc)y`q7ToIFNtBvr0aXL@Pt_b^Y!_btt|q zSBBoauL8l`-B{Wg-PH^kQsj_ zP6Y|tjvYsWE0!Z!He+AIW*7;NPjnqaWjVqBSqw;1EQgP-Ufh+ba%`8liAt48x{<){ zNxFSjl=ol$wC7X%vqa^4S3kS(=l3d;Z&zQxCRk6WLLJoPD}+m@Hd)XcSm_X0vDi1z z9taj;ZC5;EgrQxZh!h@C>=cM>c|;81@0y{)J+vG-7`p)xblqMZBGDm$NMH>fVVXuH zy3|3(a(Mg^DgquRS&;w~&=x64-bt>=02KKEDDB~~qLdU%g3St6S{oy%o=S?nzvV&C zCYaz}18A(bByGt1lFemFal?(0+viFW^OU43ut~ylC8egX#uQ=gVffPNG%d4W*_lGt zaAX~K5p`)%&)7yxZ9$_Gm@^BRoW=}mDJNDpT-dN-p{f8>NPJ=95#M5Mfzcrlw0;dl zV6+w;SPMMpd+x*BE>V1=oUBdPj-Fh9^iFuB8Xl>HN4|LAj{?&-T#Fp91di82 zku{rpdrNK&LUsZaZ3XU0>_gHIuVn&h2JWB$?r{WOGf@Ld58@UIge??LKrL`MyB!fh ziDQ3-c=c&-F#%T&uvQznkntse%3eV8;RpLMgFsyFZj9Cd=!?+LMv(B;^BI`D3xWcZ zEqI(wWQ*SJcVSU}3Kl^=>!Gl%**+M$o=Pp-o{$iysnm2c0NH8ygvF8I zt^q9f9w@eJys6l z1H0_H`rEM&#{f$r*FrsOOTt$#ffj8+^eto{!P)=!Ao41`2qGvDL{K~dM8M(fc0_2# z72tagdX4WnE==L-%D0@?pz=!!7Y+)S47hOoic;4)y+-G#F5U8$NRn)V>^*oz`T$}g zCZ`z2_!i}Rn+q&B1o~u~>7XzfH3RnXXo;Pj3^UiHT-a-7dC6^l4hW;V-kI&kZ|xd``LhOib_0TpYwh&Z8rl+>@Z z%!@3pE?<85xtHH=QE`5{;Hx9Y1a}2jwdE-C*gGb!-s9{7e1>-{>n_k;iBei4k%~Ll z$V-)HC-4qT)he>(xA@)8xV7<^qVbwoO%7KU2`{;mmLZatrIkii$+*lT68yb*kl9tDj blcXD_DBDnwJ5&Ap5e#e1NZxp*b!SFS z9R%?q&>R8{G~hrlz9hvYft*T@J@!zF5&|&`g+MRqO-4E8)Hk#GiImLlzW2?0^Jd@s z=FP9OvmS!++b@6B|27c%S51b)9)SM00Co^X6i29ueT)@0BBN>gX4CR5JvSq}>G+Pu zR+MSFzKfB8K0(yJh^WJy8zw?G;Y){~rJ1i$$^B1FOE@u4wzf(};+~X}FNZam%zP0v z!rI4SBpC<4GeU<>vxqf#(EM`sEUU@dU_-6k!KD8wfE~n;k16sEihYwBzC}%DQ;XVl zi#iuA-=P_np)PZ27Cwu)b(eZz&jR-92Au&sLv2Vimt=K1%Yh8ef9MrpoL&n>p{~;_ ztg&cA6l6S{vrX2Lg>#`?E7anaWIxDu5EUo{>(D)%cuiFuQ6@eExh4*0vdvqS8l1vt zD6AOkFM-%W9o#`=a#3)Tv7N3BLYS5T7BeYDH%Or(+in z(bHNE`xA^5cW{VhX6%>QG42>QV27KdT_$JOamT!lCvB56;Mu6~1=z4;r>B+SOvKS9 z;}#ebi>ijrvR1pvfMQm%_#v?C2)?M0IzOS-s?Ong0E*385Jl5$rZyEMPJws?4=|cv zynNw7{@A_zv43()R~pya-4{;Xwr+oSNA8hZ1GCOp^K1`%EX&R1zcTCL__x+Ui4|owA>Zrw!AbKXocpn|^PQDLOx%<5L gA$p@b`R=1)ck=By3mD3MR$Orol=bm*TsqPJ0edu`&Hw-a diff --git a/env/Lib/site-packages/aiogram/filters/__pycache__/state.cpython-311.pyc b/env/Lib/site-packages/aiogram/filters/__pycache__/state.cpython-311.pyc deleted file mode 100644 index 00fc235642ba55fa43605202bd8c1ca7547979d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2624 zcmb6a-)j^{c=p%b?d5*tve6nf=~hFNR1+&$p|vqF(TKH1Fww#`?Q*%Dq-S<-C2V0P<-k)vzI$BN};o}-+c4U zeBaFXbH0toqX^oMU;R9DM?vUUHrZ_98nUqh$Sq_cOR$k67=plX(H0%akQ~{N9mP|j0B%6cG77zS_On7IAw)!94BxXCptDy zM>9$TH`+vW5?SHv$co^W+Y&5Dkyjc01t;6qDovT+%ZTL>dVu#h2If+1O=AzKnwEZI_KWGi%C zHbRz+!!shNB^wbHSuLQPYNX*Fm4*s&N9-lrsG&Nx@zH5W!xa`J+p2Jw_$d# zPWePA2nA%;=N5wNh~rngj(NI`!MwVg!#Y1z&r+R$AF>2nVCv|Fw4KK%2yqF&4v=Ju z?HN9yBAl-4Pfs0xYwA6h%uS8DRyH>~HJ2x8&n4!x>rLU@<*9eG(^E9-;r{t_W-dL8 z=~O!FGEW@{^ri>+(F5}fe#A7hxvXcJSKGN|0$UAiQrqA_+6`b4Rg&APNKl6!x9u)< z4z9HwEw>#l#g49T-@PQ?Xjy`91NNck%*IT&p#!*uL{vZ*0Sg-7bpw3{2D&SZgSPD^ z&Ccf1-~w!Vu1P%t8V05i$Tr}lj7cZk0s3K+ZGg*b&6nrI9c(iT6L$CBC9j<9t;AC| z-mgkxYqW|)HA>hPUvj4}`YK6Z0a*|RnR-6KVhH|E;otZePCbnTP~us?d(0uV=E<8F zLXF@ACF}BT!|r=^j%!juI*va0;+pKK4bFn>@j4VxnmMRgkQZAEvL(!MDKu07N`Mmy zYKb_3ZuD)D7Hi1%5)FJtY?e(@;2asER=h85S=p3)!DIPRYX!ME;z_@!ZLT4Z^z2z% zRWdH*?1sAzkZ2bTvwAG$eoM|-H2w2?J!q^ylRE9sv~ zvVAGfvy1EmrTbc0oynygY?^-5G#%H<+YFDH=B0evuB|{eTW$u(Dx|gTdek(@9$+Ug zG0@GxZU$Hw6PB5TC5|soyRJ=`KL|@f(hJ}&3QlKLg0yY|_9)Ts04&zOswgTEPz*o> zrFJi#s>-s`xuRAP40kL(Yy~k%i59ggf?+F&p`lTsDkT)Cl>jQ*D|}KJIJ`>lI~-qE z6HDImWN~ki7JF}gSW50KtKC&)lZEqb0f8<|jlOnx)pK+n-rFFAL*BwXE0A1sZUb%@ zmJTGs05cI!5x>3m2n^I7fr05X#e~_!Pt}*GGr+50BUK>qgU4e4j)F&$Tfdu0<-Xy@ zJ;0`{nDS(J8hJbL@KN#x&{(~uzW}I8f*@4Tu2OTapwZI*@9U_i)Z8oR_0o%a1@)Gi w`+6+3ym#3vo?kh=+P*qhJ~&cp8!5*|7u9M=7r=GTgXLHMWYoW2u*4Pr7wt}S8~^|S diff --git a/env/Lib/site-packages/aiogram/filters/base.py b/env/Lib/site-packages/aiogram/filters/base.py deleted file mode 100644 index 94f9b6d..0000000 --- a/env/Lib/site-packages/aiogram/filters/base.py +++ /dev/null @@ -1,55 +0,0 @@ -from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Any, Awaitable, Callable, Dict, Union - -if TYPE_CHECKING: - from aiogram.filters.logic import _InvertFilter - - -class Filter(ABC): - """ - If you want to register own filters like builtin filters you will need to write subclass - of this class with overriding the :code:`__call__` - method and adding filter attributes. - """ - - if TYPE_CHECKING: - # This checking type-hint is needed because mypy checks validity of overrides and raises: - # error: Signature of "__call__" incompatible with supertype "BaseFilter" [override] - # https://mypy.readthedocs.io/en/latest/error_code_list.html#check-validity-of-overrides-override - __call__: Callable[..., Awaitable[Union[bool, Dict[str, Any]]]] - else: # pragma: no cover - - @abstractmethod - async def __call__(self, *args: Any, **kwargs: Any) -> Union[bool, Dict[str, Any]]: - """ - This method should be overridden. - - Accepts incoming event and should return boolean or dict. - - :return: :class:`bool` or :class:`Dict[str, Any]` - """ - pass - - def __invert__(self) -> "_InvertFilter": - from aiogram.filters.logic import invert_f - - return invert_f(self) - - def update_handler_flags(self, flags: Dict[str, Any]) -> None: - """ - Also if you want to extend handler flags with using this filter - you should implement this method - - :param flags: existing flags, can be updated directly - """ - pass - - def _signature_to_string(self, *args: Any, **kwargs: Any) -> str: - items = [repr(arg) for arg in args] - items.extend([f"{k}={v!r}" for k, v in kwargs.items() if v is not None]) - - return f"{type(self).__name__}({', '.join(items)})" - - def __await__(self): # type: ignore # pragma: no cover - # Is needed only for inspection and this method is never be called - return self.__call__ diff --git a/env/Lib/site-packages/aiogram/filters/callback_data.py b/env/Lib/site-packages/aiogram/filters/callback_data.py deleted file mode 100644 index 17ccffb..0000000 --- a/env/Lib/site-packages/aiogram/filters/callback_data.py +++ /dev/null @@ -1,207 +0,0 @@ -from __future__ import annotations - -import sys -import types -import typing -from decimal import Decimal -from enum import Enum -from fractions import Fraction -from typing import ( - TYPE_CHECKING, - Any, - ClassVar, - Dict, - Literal, - Optional, - Type, - TypeVar, - Union, -) -from uuid import UUID - -from magic_filter import MagicFilter -from pydantic import BaseModel -from pydantic.fields import FieldInfo - -from aiogram.filters.base import Filter -from aiogram.types import CallbackQuery - -T = TypeVar("T", bound="CallbackData") - -MAX_CALLBACK_LENGTH: int = 64 - - -_UNION_TYPES = {typing.Union} -if sys.version_info >= (3, 10): # pragma: no cover - _UNION_TYPES.add(types.UnionType) - - -class CallbackDataException(Exception): - pass - - -class CallbackData(BaseModel): - """ - Base class for callback data wrapper - - This class should be used as super-class of user-defined callbacks. - - The class-keyword :code:`prefix` is required to define prefix - and also the argument :code:`sep` can be passed to define separator (default is :code:`:`). - """ - - if TYPE_CHECKING: - __separator__: ClassVar[str] - """Data separator (default is :code:`:`)""" - __prefix__: ClassVar[str] - """Callback prefix""" - - def __init_subclass__(cls, **kwargs: Any) -> None: - if "prefix" not in kwargs: - raise ValueError( - f"prefix required, usage example: " - f"`class {cls.__name__}(CallbackData, prefix='my_callback'): ...`" - ) - cls.__separator__ = kwargs.pop("sep", ":") - cls.__prefix__ = kwargs.pop("prefix") - if cls.__separator__ in cls.__prefix__: - raise ValueError( - f"Separator symbol {cls.__separator__!r} can not be used " - f"inside prefix {cls.__prefix__!r}" - ) - super().__init_subclass__(**kwargs) - - def _encode_value(self, key: str, value: Any) -> str: - if value is None: - return "" - if isinstance(value, Enum): - return str(value.value) - if isinstance(value, UUID): - return value.hex - if isinstance(value, bool): - return str(int(value)) - if isinstance(value, (int, str, float, Decimal, Fraction)): - return str(value) - raise ValueError( - f"Attribute {key}={value!r} of type {type(value).__name__!r}" - f" can not be packed to callback data" - ) - - def pack(self) -> str: - """ - Generate callback data string - - :return: valid callback data for Telegram Bot API - """ - result = [self.__prefix__] - for key, value in self.model_dump(mode="json").items(): - encoded = self._encode_value(key, value) - if self.__separator__ in encoded: - raise ValueError( - f"Separator symbol {self.__separator__!r} can not be used " - f"in value {key}={encoded!r}" - ) - result.append(encoded) - callback_data = self.__separator__.join(result) - if len(callback_data.encode()) > MAX_CALLBACK_LENGTH: - raise ValueError( - f"Resulted callback data is too long! " - f"len({callback_data!r}.encode()) > {MAX_CALLBACK_LENGTH}" - ) - return callback_data - - @classmethod - def unpack(cls: Type[T], value: str) -> T: - """ - Parse callback data string - - :param value: value from Telegram - :return: instance of CallbackData - """ - prefix, *parts = value.split(cls.__separator__) - names = cls.model_fields.keys() - if len(parts) != len(names): - raise TypeError( - f"Callback data {cls.__name__!r} takes {len(names)} arguments " - f"but {len(parts)} were given" - ) - if prefix != cls.__prefix__: - raise ValueError(f"Bad prefix ({prefix!r} != {cls.__prefix__!r})") - payload = {} - for k, v in zip(names, parts): # type: str, Optional[str] - if field := cls.model_fields.get(k): - if v == "" and _check_field_is_nullable(field): - v = None - payload[k] = v - return cls(**payload) - - @classmethod - def filter(cls, rule: Optional[MagicFilter] = None) -> CallbackQueryFilter: - """ - Generates a filter for callback query with rule - - :param rule: magic rule - :return: instance of filter - """ - return CallbackQueryFilter(callback_data=cls, rule=rule) - - -class CallbackQueryFilter(Filter): - """ - This filter helps to handle callback query. - - Should not be used directly, you should create the instance of this filter - via callback data instance - """ - - __slots__ = ( - "callback_data", - "rule", - ) - - def __init__( - self, - *, - callback_data: Type[CallbackData], - rule: Optional[MagicFilter] = None, - ): - """ - :param callback_data: Expected type of callback data - :param rule: Magic rule - """ - self.callback_data = callback_data - self.rule = rule - - def __str__(self) -> str: - return self._signature_to_string( - callback_data=self.callback_data, - rule=self.rule, - ) - - async def __call__(self, query: CallbackQuery) -> Union[Literal[False], Dict[str, Any]]: - if not isinstance(query, CallbackQuery) or not query.data: - return False - try: - callback_data = self.callback_data.unpack(query.data) - except (TypeError, ValueError): - return False - - if self.rule is None or self.rule.resolve(callback_data): - return {"callback_data": callback_data} - return False - - -def _check_field_is_nullable(field: FieldInfo) -> bool: - """ - Check if the given field is nullable. - - :param field: The FieldInfo object representing the field to check. - :return: True if the field is nullable, False otherwise. - - """ - if not field.is_required(): - return True - - return typing.get_origin(field.annotation) in _UNION_TYPES and type(None) in typing.get_args( - field.annotation - ) diff --git a/env/Lib/site-packages/aiogram/filters/chat_member_updated.py b/env/Lib/site-packages/aiogram/filters/chat_member_updated.py deleted file mode 100644 index 23cf0e9..0000000 --- a/env/Lib/site-packages/aiogram/filters/chat_member_updated.py +++ /dev/null @@ -1,204 +0,0 @@ -from typing import Any, Dict, Optional, TypeVar, Union - -from aiogram.filters.base import Filter -from aiogram.types import ChatMember, ChatMemberUpdated - -MarkerT = TypeVar("MarkerT", bound="_MemberStatusMarker") -MarkerGroupT = TypeVar("MarkerGroupT", bound="_MemberStatusGroupMarker") -TransitionT = TypeVar("TransitionT", bound="_MemberStatusTransition") - - -class _MemberStatusMarker: - __slots__ = ( - "name", - "is_member", - ) - - def __init__(self, name: str, *, is_member: Optional[bool] = None) -> None: - self.name = name - self.is_member = is_member - - def __str__(self) -> str: - result = self.name.upper() - if self.is_member is not None: - result = ("+" if self.is_member else "-") + result - return result # noqa: RET504 - - def __pos__(self: MarkerT) -> MarkerT: - return type(self)(name=self.name, is_member=True) - - def __neg__(self: MarkerT) -> MarkerT: - return type(self)(name=self.name, is_member=False) - - def __or__( - self, other: Union["_MemberStatusMarker", "_MemberStatusGroupMarker"] - ) -> "_MemberStatusGroupMarker": - if isinstance(other, _MemberStatusMarker): - return _MemberStatusGroupMarker(self, other) - if isinstance(other, _MemberStatusGroupMarker): - return other | self - raise TypeError( - f"unsupported operand type(s) for |: " - f"{type(self).__name__!r} and {type(other).__name__!r}" - ) - - __ror__ = __or__ - - def __rshift__( - self, other: Union["_MemberStatusMarker", "_MemberStatusGroupMarker"] - ) -> "_MemberStatusTransition": - old = _MemberStatusGroupMarker(self) - if isinstance(other, _MemberStatusMarker): - return _MemberStatusTransition(old=old, new=_MemberStatusGroupMarker(other)) - if isinstance(other, _MemberStatusGroupMarker): - return _MemberStatusTransition(old=old, new=other) - raise TypeError( - f"unsupported operand type(s) for >>: " - f"{type(self).__name__!r} and {type(other).__name__!r}" - ) - - def __lshift__( - self, other: Union["_MemberStatusMarker", "_MemberStatusGroupMarker"] - ) -> "_MemberStatusTransition": - new = _MemberStatusGroupMarker(self) - if isinstance(other, _MemberStatusMarker): - return _MemberStatusTransition(old=_MemberStatusGroupMarker(other), new=new) - if isinstance(other, _MemberStatusGroupMarker): - return _MemberStatusTransition(old=other, new=new) - raise TypeError( - f"unsupported operand type(s) for <<: " - f"{type(self).__name__!r} and {type(other).__name__!r}" - ) - - def __hash__(self) -> int: - return hash((self.name, self.is_member)) - - def check(self, *, member: ChatMember) -> bool: - # Not all member types have `is_member` attribute - is_member = getattr(member, "is_member", None) - status = getattr(member, "status", None) - if self.is_member is not None and is_member != self.is_member: - return False - return self.name == status - - -class _MemberStatusGroupMarker: - __slots__ = ("statuses",) - - def __init__(self, *statuses: _MemberStatusMarker) -> None: - if not statuses: - raise ValueError("Member status group should have at least one status included") - self.statuses = frozenset(statuses) - - def __or__( - self: MarkerGroupT, other: Union["_MemberStatusMarker", "_MemberStatusGroupMarker"] - ) -> MarkerGroupT: - if isinstance(other, _MemberStatusMarker): - return type(self)(*self.statuses, other) - if isinstance(other, _MemberStatusGroupMarker): - return type(self)(*self.statuses, *other.statuses) - raise TypeError( - f"unsupported operand type(s) for |: " - f"{type(self).__name__!r} and {type(other).__name__!r}" - ) - - def __rshift__( - self, other: Union["_MemberStatusMarker", "_MemberStatusGroupMarker"] - ) -> "_MemberStatusTransition": - if isinstance(other, _MemberStatusMarker): - return _MemberStatusTransition(old=self, new=_MemberStatusGroupMarker(other)) - if isinstance(other, _MemberStatusGroupMarker): - return _MemberStatusTransition(old=self, new=other) - raise TypeError( - f"unsupported operand type(s) for >>: " - f"{type(self).__name__!r} and {type(other).__name__!r}" - ) - - def __lshift__( - self, other: Union["_MemberStatusMarker", "_MemberStatusGroupMarker"] - ) -> "_MemberStatusTransition": - if isinstance(other, _MemberStatusMarker): - return _MemberStatusTransition(old=_MemberStatusGroupMarker(other), new=self) - if isinstance(other, _MemberStatusGroupMarker): - return _MemberStatusTransition(old=other, new=self) - raise TypeError( - f"unsupported operand type(s) for <<: " - f"{type(self).__name__!r} and {type(other).__name__!r}" - ) - - def __str__(self) -> str: - result = " | ".join(map(str, sorted(self.statuses, key=str))) - if len(self.statuses) != 1: - return f"({result})" - return result - - def check(self, *, member: ChatMember) -> bool: - return any(status.check(member=member) for status in self.statuses) - - -class _MemberStatusTransition: - __slots__ = ( - "old", - "new", - ) - - def __init__(self, *, old: _MemberStatusGroupMarker, new: _MemberStatusGroupMarker) -> None: - self.old = old - self.new = new - - def __str__(self) -> str: - return f"{self.old} >> {self.new}" - - def __invert__(self: TransitionT) -> TransitionT: - return type(self)(old=self.new, new=self.old) - - def check(self, *, old: ChatMember, new: ChatMember) -> bool: - return self.old.check(member=old) and self.new.check(member=new) - - -CREATOR = _MemberStatusMarker("creator") -ADMINISTRATOR = _MemberStatusMarker("administrator") -MEMBER = _MemberStatusMarker("member") -RESTRICTED = _MemberStatusMarker("restricted") -LEFT = _MemberStatusMarker("left") -KICKED = _MemberStatusMarker("kicked") - -IS_MEMBER = CREATOR | ADMINISTRATOR | MEMBER | +RESTRICTED -IS_ADMIN = CREATOR | ADMINISTRATOR -IS_NOT_MEMBER = LEFT | KICKED | -RESTRICTED - -JOIN_TRANSITION = IS_NOT_MEMBER >> IS_MEMBER -LEAVE_TRANSITION = ~JOIN_TRANSITION -PROMOTED_TRANSITION = (MEMBER | RESTRICTED | LEFT | KICKED) >> ADMINISTRATOR - - -class ChatMemberUpdatedFilter(Filter): - __slots__ = ("member_status_changed",) - - def __init__( - self, - member_status_changed: Union[ - _MemberStatusMarker, - _MemberStatusGroupMarker, - _MemberStatusTransition, - ], - ): - self.member_status_changed = member_status_changed - - def __str__(self) -> str: - return self._signature_to_string( - member_status_changed=self.member_status_changed, - ) - - async def __call__(self, member_updated: ChatMemberUpdated) -> Union[bool, Dict[str, Any]]: - old = member_updated.old_chat_member - new = member_updated.new_chat_member - rule = self.member_status_changed - - if isinstance(rule, (_MemberStatusMarker, _MemberStatusGroupMarker)): - return rule.check(member=new) - if isinstance(rule, _MemberStatusTransition): - return rule.check(old=old, new=new) - - # Impossible variant in due to pydantic validation - return False # pragma: no cover diff --git a/env/Lib/site-packages/aiogram/filters/command.py b/env/Lib/site-packages/aiogram/filters/command.py deleted file mode 100644 index f52ac26..0000000 --- a/env/Lib/site-packages/aiogram/filters/command.py +++ /dev/null @@ -1,298 +0,0 @@ -from __future__ import annotations - -import re -from dataclasses import dataclass, field, replace -from typing import ( - TYPE_CHECKING, - Any, - Dict, - Iterable, - Match, - Optional, - Pattern, - Sequence, - Union, - cast, -) - -from magic_filter import MagicFilter - -from aiogram.filters.base import Filter -from aiogram.types import BotCommand, Message -from aiogram.utils.deep_linking import decode_payload - -if TYPE_CHECKING: - from aiogram import Bot - -# TODO: rm type ignore after py3.8 support expiration or mypy bug fix -CommandPatternType = Union[str, re.Pattern, BotCommand] # type: ignore[type-arg] - - -class CommandException(Exception): - pass - - -class Command(Filter): - """ - This filter can be helpful for handling commands from the text messages. - - Works only with :class:`aiogram.types.message.Message` events which have the :code:`text`. - """ - - __slots__ = ( - "commands", - "prefix", - "ignore_case", - "ignore_mention", - "magic", - ) - - def __init__( - self, - *values: CommandPatternType, - commands: Optional[Union[Sequence[CommandPatternType], CommandPatternType]] = None, - prefix: str = "/", - ignore_case: bool = False, - ignore_mention: bool = False, - magic: Optional[MagicFilter] = None, - ): - """ - List of commands (string or compiled regexp patterns) - - :param prefix: Prefix for command. - Prefix is always a single char but here you can pass all of allowed prefixes, - for example: :code:`"/!"` will work with commands prefixed - by :code:`"/"` or :code:`"!"`. - :param ignore_case: Ignore case (Does not work with regexp, use flags instead) - :param ignore_mention: Ignore bot mention. By default, - bot can not handle commands intended for other bots - :param magic: Validate command object via Magic filter after all checks done - """ - if commands is None: - commands = [] - if isinstance(commands, (str, re.Pattern, BotCommand)): - commands = [commands] - - if not isinstance(commands, Iterable): - raise ValueError( - "Command filter only supports str, re.Pattern, BotCommand object" - " or their Iterable" - ) - - items = [] - for command in (*values, *commands): - if isinstance(command, BotCommand): - command = command.command - if not isinstance(command, (str, re.Pattern)): - raise ValueError( - "Command filter only supports str, re.Pattern, BotCommand object" - " or their Iterable" - ) - if ignore_case and isinstance(command, str): - command = command.casefold() - items.append(command) - - if not items: - raise ValueError("At least one command should be specified") - - self.commands = tuple(items) - self.prefix = prefix - self.ignore_case = ignore_case - self.ignore_mention = ignore_mention - self.magic = magic - - def __str__(self) -> str: - return self._signature_to_string( - *self.commands, - prefix=self.prefix, - ignore_case=self.ignore_case, - ignore_mention=self.ignore_mention, - magic=self.magic, - ) - - def update_handler_flags(self, flags: Dict[str, Any]) -> None: - commands = flags.setdefault("commands", []) - commands.append(self) - - async def __call__(self, message: Message, bot: Bot) -> Union[bool, Dict[str, Any]]: - if not isinstance(message, Message): - return False - - text = message.text or message.caption - if not text: - return False - - try: - command = await self.parse_command(text=text, bot=bot) - except CommandException: - return False - result = {"command": command} - if command.magic_result and isinstance(command.magic_result, dict): - result.update(command.magic_result) - return result - - def extract_command(self, text: str) -> CommandObject: - # First step: separate command with arguments - # "/command@mention arg1 arg2" -> "/command@mention", ["arg1 arg2"] - try: - full_command, *args = text.split(maxsplit=1) - except ValueError: - raise CommandException("not enough values to unpack") - - # Separate command into valuable parts - # "/command@mention" -> "/", ("command", "@", "mention") - prefix, (command, _, mention) = full_command[0], full_command[1:].partition("@") - return CommandObject( - prefix=prefix, - command=command, - mention=mention or None, - args=args[0] if args else None, - ) - - def validate_prefix(self, command: CommandObject) -> None: - if command.prefix not in self.prefix: - raise CommandException("Invalid command prefix") - - async def validate_mention(self, bot: Bot, command: CommandObject) -> None: - if command.mention and not self.ignore_mention: - me = await bot.me() - if me.username and command.mention.lower() != me.username.lower(): - raise CommandException("Mention did not match") - - def validate_command(self, command: CommandObject) -> CommandObject: - for allowed_command in cast(Sequence[CommandPatternType], self.commands): - # Command can be presented as regexp pattern or raw string - # then need to validate that in different ways - if isinstance(allowed_command, Pattern): # Regexp - result = allowed_command.match(command.command) - if result: - return replace(command, regexp_match=result) - - command_name = command.command - if self.ignore_case: - command_name = command_name.casefold() - - if command_name == allowed_command: # String - return command - raise CommandException("Command did not match pattern") - - async def parse_command(self, text: str, bot: Bot) -> CommandObject: - """ - Extract command from the text and validate - - :param text: - :param bot: - :return: - """ - command = self.extract_command(text) - self.validate_prefix(command=command) - await self.validate_mention(bot=bot, command=command) - command = self.validate_command(command) - command = self.do_magic(command=command) - return command # noqa: RET504 - - def do_magic(self, command: CommandObject) -> Any: - if self.magic is None: - return command - result = self.magic.resolve(command) - if not result: - raise CommandException("Rejected via magic filter") - return replace(command, magic_result=result) - - -@dataclass(frozen=True) -class CommandObject: - """ - Instance of this object is always has command and it prefix. - Can be passed as keyword argument **command** to the handler - """ - - prefix: str = "/" - """Command prefix""" - command: str = "" - """Command without prefix and mention""" - mention: Optional[str] = None - """Mention (if available)""" - args: Optional[str] = field(repr=False, default=None) - """Command argument""" - regexp_match: Optional[Match[str]] = field(repr=False, default=None) - """Will be presented match result if the command is presented as regexp in filter""" - magic_result: Optional[Any] = field(repr=False, default=None) - - @property - def mentioned(self) -> bool: - """ - This command has mention? - """ - return bool(self.mention) - - @property - def text(self) -> str: - """ - Generate original text from object - """ - line = self.prefix + self.command - if self.mention: - line += "@" + self.mention - if self.args: - line += " " + self.args - return line - - -class CommandStart(Command): - def __init__( - self, - deep_link: bool = False, - deep_link_encoded: bool = False, - ignore_case: bool = False, - ignore_mention: bool = False, - magic: Optional[MagicFilter] = None, - ): - super().__init__( - "start", - prefix="/", - ignore_case=ignore_case, - ignore_mention=ignore_mention, - magic=magic, - ) - self.deep_link = deep_link - self.deep_link_encoded = deep_link_encoded - - def __str__(self) -> str: - return self._signature_to_string( - ignore_case=self.ignore_case, - ignore_mention=self.ignore_mention, - magic=self.magic, - deep_link=self.deep_link, - deep_link_encoded=self.deep_link_encoded, - ) - - async def parse_command(self, text: str, bot: Bot) -> CommandObject: - """ - Extract command from the text and validate - - :param text: - :param bot: - :return: - """ - command = self.extract_command(text) - self.validate_prefix(command=command) - await self.validate_mention(bot=bot, command=command) - command = self.validate_command(command) - command = self.validate_deeplink(command=command) - command = self.do_magic(command=command) - return command # noqa: RET504 - - def validate_deeplink(self, command: CommandObject) -> CommandObject: - if not self.deep_link: - return command - if not command.args: - raise CommandException("Deep-link was missing") - args = command.args - if self.deep_link_encoded: - try: - args = decode_payload(args) - except UnicodeDecodeError as e: - raise CommandException(f"Failed to decode Base64: {e}") - return replace(command, args=args) - return command diff --git a/env/Lib/site-packages/aiogram/filters/exception.py b/env/Lib/site-packages/aiogram/filters/exception.py deleted file mode 100644 index 2530d75..0000000 --- a/env/Lib/site-packages/aiogram/filters/exception.py +++ /dev/null @@ -1,55 +0,0 @@ -import re -from typing import Any, Dict, Pattern, Type, Union, cast - -from aiogram.filters.base import Filter -from aiogram.types import TelegramObject -from aiogram.types.error_event import ErrorEvent - - -class ExceptionTypeFilter(Filter): - """ - Allows to match exception by type - """ - - __slots__ = ("exceptions",) - - def __init__(self, *exceptions: Type[Exception]): - """ - :param exceptions: Exception type(s) - """ - if not exceptions: - raise ValueError("At least one exception type is required") - self.exceptions = exceptions - - async def __call__(self, obj: TelegramObject) -> Union[bool, Dict[str, Any]]: - return isinstance(cast(ErrorEvent, obj).exception, self.exceptions) - - -class ExceptionMessageFilter(Filter): - """ - Allow to match exception by message - """ - - __slots__ = ("pattern",) - - def __init__(self, pattern: Union[str, Pattern[str]]): - """ - :param pattern: Regexp pattern - """ - if isinstance(pattern, str): - pattern = re.compile(pattern) - self.pattern = pattern - - def __str__(self) -> str: - return self._signature_to_string( - pattern=self.pattern, - ) - - async def __call__( - self, - obj: TelegramObject, - ) -> Union[bool, Dict[str, Any]]: - result = self.pattern.match(str(cast(ErrorEvent, obj).exception)) - if not result: - return False - return {"match_exception": result} diff --git a/env/Lib/site-packages/aiogram/filters/logic.py b/env/Lib/site-packages/aiogram/filters/logic.py deleted file mode 100644 index 7cd2503..0000000 --- a/env/Lib/site-packages/aiogram/filters/logic.py +++ /dev/null @@ -1,77 +0,0 @@ -from abc import ABC -from typing import TYPE_CHECKING, Any, Dict, Union - -from aiogram.filters import Filter - -if TYPE_CHECKING: - from aiogram.dispatcher.event.handler import CallbackType, FilterObject - - -class _LogicFilter(Filter, ABC): - pass - - -class _InvertFilter(_LogicFilter): - __slots__ = ("target",) - - def __init__(self, target: "FilterObject") -> None: - self.target = target - - async def __call__(self, *args: Any, **kwargs: Any) -> Union[bool, Dict[str, Any]]: - return not bool(await self.target.call(*args, **kwargs)) - - -class _AndFilter(_LogicFilter): - __slots__ = ("targets",) - - def __init__(self, *targets: "FilterObject") -> None: - self.targets = targets - - async def __call__(self, *args: Any, **kwargs: Any) -> Union[bool, Dict[str, Any]]: - final_result = {} - - for target in self.targets: - result = await target.call(*args, **kwargs) - if not result: - return False - if isinstance(result, dict): - final_result.update(result) - - if final_result: - return final_result - return True - - -class _OrFilter(_LogicFilter): - __slots__ = ("targets",) - - def __init__(self, *targets: "FilterObject") -> None: - self.targets = targets - - async def __call__(self, *args: Any, **kwargs: Any) -> Union[bool, Dict[str, Any]]: - for target in self.targets: - result = await target.call(*args, **kwargs) - if not result: - continue - if isinstance(result, dict): - return result - return bool(result) - return False - - -def and_f(*targets: "CallbackType") -> _AndFilter: - from aiogram.dispatcher.event.handler import FilterObject - - return _AndFilter(*(FilterObject(target) for target in targets)) - - -def or_f(*targets: "CallbackType") -> _OrFilter: - from aiogram.dispatcher.event.handler import FilterObject - - return _OrFilter(*(FilterObject(target) for target in targets)) - - -def invert_f(target: "CallbackType") -> _InvertFilter: - from aiogram.dispatcher.event.handler import FilterObject - - return _InvertFilter(FilterObject(target)) diff --git a/env/Lib/site-packages/aiogram/filters/magic_data.py b/env/Lib/site-packages/aiogram/filters/magic_data.py deleted file mode 100644 index 5c0d474..0000000 --- a/env/Lib/site-packages/aiogram/filters/magic_data.py +++ /dev/null @@ -1,27 +0,0 @@ -from typing import Any - -from magic_filter import AttrDict, MagicFilter - -from aiogram.filters.base import Filter -from aiogram.types import TelegramObject - - -class MagicData(Filter): - """ - This filter helps to filter event with contextual data - """ - - __slots__ = ("magic_data",) - - def __init__(self, magic_data: MagicFilter) -> None: - self.magic_data = magic_data - - async def __call__(self, event: TelegramObject, *args: Any, **kwargs: Any) -> Any: - return self.magic_data.resolve( - AttrDict({"event": event, **dict(enumerate(args)), **kwargs}) - ) - - def __str__(self) -> str: - return self._signature_to_string( - magic_data=self.magic_data, - ) diff --git a/env/Lib/site-packages/aiogram/filters/state.py b/env/Lib/site-packages/aiogram/filters/state.py deleted file mode 100644 index 82a141c..0000000 --- a/env/Lib/site-packages/aiogram/filters/state.py +++ /dev/null @@ -1,43 +0,0 @@ -from inspect import isclass -from typing import Any, Dict, Optional, Sequence, Type, Union, cast - -from aiogram.filters.base import Filter -from aiogram.fsm.state import State, StatesGroup -from aiogram.types import TelegramObject - -StateType = Union[str, None, State, StatesGroup, Type[StatesGroup]] - - -class StateFilter(Filter): - """ - State filter - """ - - __slots__ = ("states",) - - def __init__(self, *states: StateType) -> None: - if not states: - raise ValueError("At least one state is required") - - self.states = states - - def __str__(self) -> str: - return self._signature_to_string( - *self.states, - ) - - async def __call__( - self, obj: TelegramObject, raw_state: Optional[str] = None - ) -> Union[bool, Dict[str, Any]]: - allowed_states = cast(Sequence[StateType], self.states) - for allowed_state in allowed_states: - if isinstance(allowed_state, str) or allowed_state is None: - if allowed_state == "*" or raw_state == allowed_state: - return True - elif isinstance(allowed_state, (State, StatesGroup)): - if allowed_state(event=obj, raw_state=raw_state): - return True - elif isclass(allowed_state) and issubclass(allowed_state, StatesGroup): - if allowed_state()(event=obj, raw_state=raw_state): - return True - return False diff --git a/env/Lib/site-packages/aiogram/fsm/__init__.py b/env/Lib/site-packages/aiogram/fsm/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/Lib/site-packages/aiogram/fsm/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/fsm/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 6550804e7edae4a24e86bf7f8cd87324a04d6962..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmZ3^%ge<81lwkxNdwW3K?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCUmh-2G2!_| z*)h)fDVcfcG1;X>i6!|(@k#k5F{ycFF+Q0|F~ylBsk#M;$=QkNsl_pgnfd8OiMje| z#ku#Lo diff --git a/env/Lib/site-packages/aiogram/fsm/__pycache__/context.cpython-311.pyc b/env/Lib/site-packages/aiogram/fsm/__pycache__/context.cpython-311.pyc deleted file mode 100644 index 109c39e63660e8b559e314d6e4210806d668d604..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3128 zcmcgu&2JM&6rcUfI&n4uvLVny+{QxrXaW)(2<4*%R8mn=wMLX$R;|UeN!|D(o!zt~ z^#K)BMHGo1Dg~)M>>;8?x~^J9C~0pelzoC z=Iy-S`_0?^t-HIEK>7WbKW2`Jg#3wvMuD+cHm9IjA(T)qNAg^f%kxP-FC+yHb$m|D zOGzm&C*^!cvV$W$xkRXNhfwh$Psn5V`z5JRDM3c$zi~JsxWfB|MOVC-%~-DT@w}BS z7W5pbyUy#Tk+6zPpEcY_!qP3{>f*fNb_Tl3#$qP0=rxgGuvvx93Nc8Mqa?{w&JZYX zh*Y5Bj7+6FVp5_#R5oN!BhrpLQnG^zhGIkxg!X25s=&%l8Zo+zh!LIPx8{OSafA(SPQH$oe@GG2tCB_2jxV@OGYJmRKDc-93f76kz@ z5KSXDv!yZ7SS%KMdFkS*)MrIDm%31-*}`mUZh`4=n)HpLl`;z7q&~{tNSRs77@yZO za}Yl>rDuz?OwS*kG4n?=z6TTYi>{JRXA4;?onG3v<=R9;*#VC;`#{_xwf%>e#e31( zzJ6$wW%zA^p16{U#K?r?0v*!zHvBiQgSbpM^qhPJeZSbD&kYT>up+ck;?}rU%H9To zefU>~=W2XIjhFk@2A*n;8n3A5s_HpM*|oBLus_r6CkD>LYMrO*%boRhjf$cSWjO`s*hJ!Vr++4LE*-6bc3xPt?K*T+zab!=Pxn290gV zn087GZKy+KaZOpb9CfIop028=9c9=0+9|;Xni0U*h6u2O=ui_CVlZy;ys;dwRyz|$ zH?+~RwRY3dMl0IMs&>-pX{*Xfp9%8Zw>q0O+qm!}Sl;{|L~t26rj>Xb#_grFjrtrW zi|``YVcKZk2`li*d8Nd^DxD+gor!D@8Si4NBMyEeX|jjzX_ z3_t64wDF2IRn?}Pp0=t?y@FLY;dzZjV?)2aQ1Yszf++8ts=Z$pQ?M$chMY@o~el(r_dO^?mGfalHOhK_11->19 z?+_oJLgA$MI3N^A`*Xj28u!~Bq|8aD?1A#o>LHvwwOzpU8T&+8C@0Fw>RFsU zvrfHcyMUFGwrD5HL-zGm6=x^63xymzQ5PiXLpUDFTHl)wuG&MkX%GMUMYZo8f39}! zyx(~d>0ZwKbbR^Cdxz`N)-HcZ~g5m{gAov!V zfN!CR;3ID027K)L0rtY`McIqa7={Sn=iWVkshsx7ah6Sh4zrMHf~X4|$JNLYXZQMo YTyl1=b@?C%F13q)Q1|Z+6W*cz14ewA`~Uy| diff --git a/env/Lib/site-packages/aiogram/fsm/__pycache__/middleware.cpython-311.pyc b/env/Lib/site-packages/aiogram/fsm/__pycache__/middleware.cpython-311.pyc deleted file mode 100644 index a4bc62b4c99539a72a2addf5882f0d7929af3bb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5408 zcmbUlTWk~A_0EjP@3$wh2?+$u!a6*|(gl{sDlb?THmFTPiZ`umJd@zyM>;bBk{XE> zXq68>P(?+gQYjx*3JsO`sH)X!rEc5bemIe4Y{z%b zoOAEF=iIsHanJa7KA)Sw^`~F|eR9Q5$Ul*&U3?YU_&p#GiAY2yNAgUP$+Jl|&n3CM zEosa1Nj`5++8G>YbB??->7+Q9bLHJhH^pr^Pu`pK=6y*YrTLscA4mo$ZqEhtp=2l@ zPKNW5WF#*n1={b(wdLEB?fGajN@-^v%BWh7jPf5DFikz3`K%obuji_>3 zm8Rx&e|lynHCeR%4rF zL`LF8RSK?(gwNo6f} zaMld0+hs|el?%fe%VJ;%7H;(QjY9w)k`hxQDZtFD!~q5Nu2L*e$WJekjF2bHaDtPg zK+CuxatuJirrQ)LH)(cb4;@obX*XQoemwZW#CTD@HZf2XvxTXNYqQ{xMLBh)s7^?Q z>k}8US0?|Fw*u(E%$)8_rLu*rno7-gwc3{hwc#)* zSGob*CWe>9wlCQ3d9_$KJbYUBp#@vT*;S@(19*t;xSB3Nn94d&w^O%?X*J!nZFXS0 z1NX*Pus!Dq16!wB8%2m}Z4)6SPGsutvJ4|D*61x;i7Z(Z>aJZSTZ!Am%a_Qsm6kv% zdlHySynGM(Et4+Q5^PNneU|uXTrs_#a?7yN6>GIe$Q=mfUvQVmL+*1M1M6LK)OZ`8 zCBDQjIU9Rw_%a|XH3GJ!E={yOVw<&Lss$%wH@{uutPBfjAAZg6e+PQ&s~jP5(n}iq z6x$8I^4Eb=y*Af)(Vodeg?J>XrC3~AcLq$Y4mb4}iZy!P1{@FEa3C8-K^(z5 z0CY!HmV#!(u<7oWx8VSId1rfV zi6j;{E!@5y-nSOs_ju&luGR3-O8Dr4L)*6VQEtJu@RL>NR?QPO2=6*<*h#Fj65Y2R z?OluZKAZaEwQ{s~HQHZ^_8Wxt9exX-1%-#6UwW3NzTUImKeE<8vf4jZ=^rbfe64j} zDtBI54USiWk0P&@A#XO0a!J@C@E^TFxQlE z(CcWT{t}QkWE-}1K2fdsC!{$do1=_oBrBVMD(ix%wM|>u1#n9u;8w-}+{zIp?kTej zTq_nQ#2Y*O#9s69t7$cr6?Mm~BFTuj)T^?T77=Z~GOJ_@lA>T#6`&e{(gylvJf>h7`1?y&`*7Kp3|;%kAp7K~`Z zj*5_|!uEKjeZLkzREeL}gsp~;1b4k4j-dM`0)seQZn+!e%Prn8W0?XNET_2(1f1^d zZAiSg*b@8M@e=ph(Z(YSQ!*SnWZF6yz)W}=wB+G!c zE^eSyBGXp!_WfsLJji%XS8HgU&*X}b327D0P={A=N#@Bf_W?TJ(Q*^%ydsP%mjRe3 zzUB|#%dPvn*Zke9{+$*7&a$&b1FniczV1(~`4g-Dy%qo7vhzC|_0R+>cYu=NL=0<@ zLOL&{Qo1{p$`{4i9OB+o>gTiRoH-(6<*j?iMuvWrIyame_^5AG#!pE(fM7cU^j=v& zfX9T+!S{-cUN2+fkq;t(KM~A|OU4j4{SK3|&SeWKjdB@XjBe2rLYGOaCAl4Y5uk%A z9x&Ez>u0#hj(wHxV}{Gg_ZkGi^H8V3BVi|7_ZtqxoFuZ%WN;I=-|*B}DZdGX0N?XG zv}N)1<0H?wXCu#?PfwRSKKSC?*O{+|%N-wALgx)0SU_lSo8dsrNdl4k?=5ookKHR6 zF6;r}KEs0;X$Czcw#RV!d2nd}&wW9IN5bAH!GS$a5^ggYL00&FPsP<`cxvNSRs@1FeD)LJS2q zfF73L2US{YVEPGq$8ch+Zdd1K;B&OW^{8W_PnuqbXQ}R}ev6v*f4oW^5VOimTFqRQ zP$78+hO z&}eEFnz_w?fM{&e16TLe#$gjA#f(N8J0Iavx)I>l$G6UtW|*Ire+VQdCnW*U;24I{ zNMHH;wC5yRZf+VmU2bj~885eL8tExFH-qIF7Cu(~FW@E2sWLhFdeg|e<>qGCf5tH2 SQ?23R=@)e5<#&wJt^6;}s^FXe diff --git a/env/Lib/site-packages/aiogram/fsm/__pycache__/scene.cpython-311.pyc b/env/Lib/site-packages/aiogram/fsm/__pycache__/scene.cpython-311.pyc deleted file mode 100644 index a55a4fba0e3ac4e64dbdde0c1bc5e66db3cd180f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47876 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 m#G1OT%Z0CD76^ diff --git a/env/Lib/site-packages/aiogram/fsm/__pycache__/state.cpython-311.pyc b/env/Lib/site-packages/aiogram/fsm/__pycache__/state.cpython-311.pyc deleted file mode 100644 index a3f4cacffb72d0aad3da47d4f91d3a1b3e7b6e17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10518 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 XEo+knzZvN+MY^p>_iBj#_@@0ICpz|l diff --git a/env/Lib/site-packages/aiogram/fsm/__pycache__/strategy.cpython-311.pyc b/env/Lib/site-packages/aiogram/fsm/__pycache__/strategy.cpython-311.pyc deleted file mode 100644 index 0df1f7f0ae1a5984368c4e70c4bd457e4780c2d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1548 zcmZux&2Jk;6rb4-@7j*-Bu!1Ca&VKhlC986P;vkSDoK+T(gfA6idIIWt!L~Sd%b47 zMl!g_haQTQgCiLw5*JQIRj-J@g2NK^u-a24PTUrSQ%}6Hy{3g7@BH?C{O0++nK%1$ zDwRMme*N*c>bD9)e+VTUnW=Dg2*NR;l^-Fh zF#JSD=o!q(Fk*2;=V*+@sKzv^!;CY9X)7TC(F9W&_+GbG<$oE~1Wi6t4V|h*lu!LB zR^}yNxzXxczG8MA8#Mi(?bPj-+4R*?x7}owS$q(rsdDxm2*-#a15;#36dSUHnDPXy z&!!ZF3^fi5{%3_cBCJ}ZRgbjBsRa4UesZUHyXbJ!VYS{jZzpmvz>@1sO}VPgL9w}6 zW4Q+FtL z-nc_+~`7DHYfLOr_5Skm-p)T%bmKz-fEkb24vqUn{~U!P3vm4V_gmFyVCA)9m0)4 z1))O#2D4uvNva+o0XkY*9$q`z9BmHvJmp<4nR$He`_046!M3N|@fNeg^`pz9%Y#on z|4ccB-wp+M1Wio@hTUxtU9@e#z4^ z!c{oc3a(a&a&4Sy8?Lr7ajm$Sf~yy%tMaE>-qrH2xn3j}hr1^wH+j)jE=~^l0;G|T z`wD~40~gyj>HnD1YeUm=(Q!N`Ks2E**IUlG1imP2<2DgxzSKXMT&oXx4pecpo!w7T`81ND7_^69wav{{h&(W)=Vd diff --git a/env/Lib/site-packages/aiogram/fsm/context.py b/env/Lib/site-packages/aiogram/fsm/context.py deleted file mode 100644 index 53a8ea4..0000000 --- a/env/Lib/site-packages/aiogram/fsm/context.py +++ /dev/null @@ -1,32 +0,0 @@ -from typing import Any, Dict, Optional - -from aiogram.fsm.storage.base import BaseStorage, StateType, StorageKey - - -class FSMContext: - def __init__(self, storage: BaseStorage, key: StorageKey) -> None: - self.storage = storage - self.key = key - - async def set_state(self, state: StateType = None) -> None: - await self.storage.set_state(key=self.key, state=state) - - async def get_state(self) -> Optional[str]: - return await self.storage.get_state(key=self.key) - - async def set_data(self, data: Dict[str, Any]) -> None: - await self.storage.set_data(key=self.key, data=data) - - async def get_data(self) -> Dict[str, Any]: - return await self.storage.get_data(key=self.key) - - async def update_data( - self, data: Optional[Dict[str, Any]] = None, **kwargs: Any - ) -> Dict[str, Any]: - if data: - kwargs.update(data) - return await self.storage.update_data(key=self.key, data=kwargs) - - async def clear(self) -> None: - await self.set_state(state=None) - await self.set_data({}) diff --git a/env/Lib/site-packages/aiogram/fsm/middleware.py b/env/Lib/site-packages/aiogram/fsm/middleware.py deleted file mode 100644 index de93457..0000000 --- a/env/Lib/site-packages/aiogram/fsm/middleware.py +++ /dev/null @@ -1,113 +0,0 @@ -from typing import Any, Awaitable, Callable, Dict, Optional, cast - -from aiogram import Bot -from aiogram.dispatcher.middlewares.base import BaseMiddleware -from aiogram.dispatcher.middlewares.user_context import EVENT_CONTEXT_KEY, EventContext -from aiogram.fsm.context import FSMContext -from aiogram.fsm.storage.base import ( - DEFAULT_DESTINY, - BaseEventIsolation, - BaseStorage, - StorageKey, -) -from aiogram.fsm.strategy import FSMStrategy, apply_strategy -from aiogram.types import TelegramObject - - -class FSMContextMiddleware(BaseMiddleware): - def __init__( - self, - storage: BaseStorage, - events_isolation: BaseEventIsolation, - strategy: FSMStrategy = FSMStrategy.USER_IN_CHAT, - ) -> None: - self.storage = storage - self.strategy = strategy - self.events_isolation = events_isolation - - async def __call__( - self, - handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]], - event: TelegramObject, - data: Dict[str, Any], - ) -> Any: - bot: Bot = cast(Bot, data["bot"]) - context = self.resolve_event_context(bot, data) - data["fsm_storage"] = self.storage - if context: - # Bugfix: https://github.com/aiogram/aiogram/issues/1317 - # State should be loaded after lock is acquired - async with self.events_isolation.lock(key=context.key): - data.update({"state": context, "raw_state": await context.get_state()}) - return await handler(event, data) - return await handler(event, data) - - def resolve_event_context( - self, - bot: Bot, - data: Dict[str, Any], - destiny: str = DEFAULT_DESTINY, - ) -> Optional[FSMContext]: - event_context: EventContext = cast(EventContext, data.get(EVENT_CONTEXT_KEY)) - return self.resolve_context( - bot=bot, - chat_id=event_context.chat_id, - user_id=event_context.user_id, - thread_id=event_context.thread_id, - business_connection_id=event_context.business_connection_id, - destiny=destiny, - ) - - def resolve_context( - self, - bot: Bot, - chat_id: Optional[int], - user_id: Optional[int], - thread_id: Optional[int] = None, - business_connection_id: Optional[str] = None, - destiny: str = DEFAULT_DESTINY, - ) -> Optional[FSMContext]: - if chat_id is None: - chat_id = user_id - - if chat_id is not None and user_id is not None: - chat_id, user_id, thread_id = apply_strategy( - chat_id=chat_id, - user_id=user_id, - thread_id=thread_id, - strategy=self.strategy, - ) - return self.get_context( - bot=bot, - chat_id=chat_id, - user_id=user_id, - thread_id=thread_id, - business_connection_id=business_connection_id, - destiny=destiny, - ) - return None - - def get_context( - self, - bot: Bot, - chat_id: int, - user_id: int, - thread_id: Optional[int] = None, - business_connection_id: Optional[str] = None, - destiny: str = DEFAULT_DESTINY, - ) -> FSMContext: - return FSMContext( - storage=self.storage, - key=StorageKey( - user_id=user_id, - chat_id=chat_id, - bot_id=bot.id, - thread_id=thread_id, - business_connection_id=business_connection_id, - destiny=destiny, - ), - ) - - async def close(self) -> None: - await self.storage.close() - await self.events_isolation.close() diff --git a/env/Lib/site-packages/aiogram/fsm/scene.py b/env/Lib/site-packages/aiogram/fsm/scene.py deleted file mode 100644 index fe4de5c..0000000 --- a/env/Lib/site-packages/aiogram/fsm/scene.py +++ /dev/null @@ -1,912 +0,0 @@ -from __future__ import annotations - -import inspect -from collections import defaultdict -from dataclasses import dataclass, replace -from enum import Enum, auto -from typing import Any, ClassVar, Dict, List, Optional, Tuple, Type, Union - -from typing_extensions import Self - -from aiogram import loggers -from aiogram.dispatcher.dispatcher import Dispatcher -from aiogram.dispatcher.event.bases import NextMiddlewareType -from aiogram.dispatcher.event.handler import CallableObject, CallbackType -from aiogram.dispatcher.flags import extract_flags_from_object -from aiogram.dispatcher.router import Router -from aiogram.exceptions import SceneException -from aiogram.filters import StateFilter -from aiogram.fsm.context import FSMContext -from aiogram.fsm.state import State -from aiogram.fsm.storage.memory import MemoryStorageRecord -from aiogram.types import TelegramObject, Update - - -class HistoryManager: - def __init__(self, state: FSMContext, destiny: str = "scenes_history", size: int = 10): - self._size = size - self._state = state - self._history_state = FSMContext( - storage=state.storage, key=replace(state.key, destiny=destiny) - ) - - async def push(self, state: Optional[str], data: Dict[str, Any]) -> None: - history_data = await self._history_state.get_data() - history = history_data.setdefault("history", []) - history.append({"state": state, "data": data}) - if len(history) > self._size: - history = history[-self._size :] - loggers.scene.debug("Push state=%s data=%s to history", state, data) - - await self._history_state.update_data(history=history) - - async def pop(self) -> Optional[MemoryStorageRecord]: - history_data = await self._history_state.get_data() - history = history_data.setdefault("history", []) - if not history: - return None - record = history.pop() - state = record["state"] - data = record["data"] - if not history: - await self._history_state.set_data({}) - else: - await self._history_state.update_data(history=history) - loggers.scene.debug("Pop state=%s data=%s from history", state, data) - return MemoryStorageRecord(state=state, data=data) - - async def get(self) -> Optional[MemoryStorageRecord]: - history_data = await self._history_state.get_data() - history = history_data.setdefault("history", []) - if not history: - return None - return MemoryStorageRecord(**history[-1]) - - async def all(self) -> List[MemoryStorageRecord]: - history_data = await self._history_state.get_data() - history = history_data.setdefault("history", []) - return [MemoryStorageRecord(**item) for item in history] - - async def clear(self) -> None: - loggers.scene.debug("Clear history") - await self._history_state.set_data({}) - - async def snapshot(self) -> None: - state = await self._state.get_state() - data = await self._state.get_data() - await self.push(state, data) - - async def _set_state(self, state: Optional[str], data: Dict[str, Any]) -> None: - await self._state.set_state(state) - await self._state.set_data(data) - - async def rollback(self) -> Optional[str]: - previous_state = await self.pop() - if not previous_state: - await self._set_state(None, {}) - return None - - loggers.scene.debug( - "Rollback to state=%s data=%s", - previous_state.state, - previous_state.data, - ) - await self._set_state(previous_state.state, previous_state.data) - return previous_state.state - - -class ObserverDecorator: - def __init__( - self, - name: str, - filters: tuple[CallbackType, ...], - action: SceneAction | None = None, - after: Optional[After] = None, - ) -> None: - self.name = name - self.filters = filters - self.action = action - self.after = after - - def _wrap_filter(self, target: Type[Scene] | CallbackType) -> None: - handlers = getattr(target, "__aiogram_handler__", None) - if not handlers: - handlers = [] - setattr(target, "__aiogram_handler__", handlers) - - handlers.append( - HandlerContainer( - name=self.name, - handler=target, - filters=self.filters, - after=self.after, - ) - ) - - def _wrap_action(self, target: CallbackType) -> None: - assert self.action is not None, "Scene action is not specified" - - action = getattr(target, "__aiogram_action__", None) - if action is None: - action = defaultdict(dict) - setattr(target, "__aiogram_action__", action) - action[self.action][self.name] = CallableObject(target) - - def __call__(self, target: CallbackType) -> CallbackType: - if inspect.isfunction(target): - if self.action is None: - self._wrap_filter(target) - else: - self._wrap_action(target) - else: - raise TypeError("Only function or method is allowed") - return target - - def leave(self) -> ActionContainer: - return ActionContainer(self.name, self.filters, SceneAction.leave) - - def enter(self, target: Type[Scene]) -> ActionContainer: - return ActionContainer(self.name, self.filters, SceneAction.enter, target) - - def exit(self) -> ActionContainer: - return ActionContainer(self.name, self.filters, SceneAction.exit) - - def back(self) -> ActionContainer: - return ActionContainer(self.name, self.filters, SceneAction.back) - - -class SceneAction(Enum): - enter = auto() - leave = auto() - exit = auto() - back = auto() - - -class ActionContainer: - def __init__( - self, - name: str, - filters: Tuple[CallbackType, ...], - action: SceneAction, - target: Optional[Union[Type[Scene], str]] = None, - ) -> None: - self.name = name - self.filters = filters - self.action = action - self.target = target - - async def execute(self, wizard: SceneWizard) -> None: - if self.action == SceneAction.enter and self.target is not None: - await wizard.goto(self.target) - elif self.action == SceneAction.leave: - await wizard.leave() - elif self.action == SceneAction.exit: - await wizard.exit() - elif self.action == SceneAction.back: - await wizard.back() - - -class HandlerContainer: - def __init__( - self, - name: str, - handler: CallbackType, - filters: Tuple[CallbackType, ...], - after: Optional[After] = None, - ) -> None: - self.name = name - self.handler = handler - self.filters = filters - self.after = after - - -@dataclass() -class SceneConfig: - state: Optional[str] - """Scene state""" - handlers: List[HandlerContainer] - """Scene handlers""" - actions: Dict[SceneAction, Dict[str, CallableObject]] - """Scene actions""" - reset_data_on_enter: Optional[bool] = None - """Reset scene data on enter""" - reset_history_on_enter: Optional[bool] = None - """Reset scene history on enter""" - callback_query_without_state: Optional[bool] = None - """Allow callback query without state""" - - -async def _empty_handler(*args: Any, **kwargs: Any) -> None: - pass - - -class SceneHandlerWrapper: - def __init__( - self, - scene: Type[Scene], - handler: CallbackType, - after: Optional[After] = None, - ) -> None: - self.scene = scene - self.handler = CallableObject(handler) - self.after = after - - async def __call__( - self, - event: TelegramObject, - **kwargs: Any, - ) -> Any: - state: FSMContext = kwargs["state"] - scenes: ScenesManager = kwargs["scenes"] - event_update: Update = kwargs["event_update"] - scene = self.scene( - wizard=SceneWizard( - scene_config=self.scene.__scene_config__, - manager=scenes, - state=state, - update_type=event_update.event_type, - event=event, - data=kwargs, - ) - ) - - result = await self.handler.call(scene, event, **kwargs) - - if self.after: - action_container = ActionContainer( - "after", - (), - self.after.action, - self.after.scene, - ) - await action_container.execute(scene.wizard) - return result - - def __await__(self) -> Self: - return self - - def __str__(self) -> str: - result = f"SceneHandlerWrapper({self.scene}, {self.handler.callback}" - if self.after: - result += f", after={self.after}" - result += ")" - return result - - -class Scene: - """ - Represents a scene in a conversation flow. - - A scene is a specific state in a conversation where certain actions can take place. - - Each scene has a set of filters that determine when it should be triggered, - and a set of handlers that define the actions to be executed when the scene is active. - - .. note:: - This class is not meant to be used directly. Instead, it should be subclassed - to define custom scenes. - """ - - __scene_config__: ClassVar[SceneConfig] - """Scene configuration.""" - - def __init__( - self, - wizard: SceneWizard, - ) -> None: - self.wizard = wizard - self.wizard.scene = self - - def __init_subclass__(cls, **kwargs: Any) -> None: - state_name = kwargs.pop("state", None) - reset_data_on_enter = kwargs.pop("reset_data_on_enter", None) - reset_history_on_enter = kwargs.pop("reset_history_on_enter", None) - callback_query_without_state = kwargs.pop("callback_query_without_state", None) - - super().__init_subclass__(**kwargs) - - handlers: list[HandlerContainer] = [] - actions: defaultdict[SceneAction, Dict[str, CallableObject]] = defaultdict(dict) - - for base in cls.__bases__: - if not issubclass(base, Scene): - continue - - parent_scene_config = getattr(base, "__scene_config__", None) - if not parent_scene_config: - continue - - handlers.extend(parent_scene_config.handlers) - for action, action_handlers in parent_scene_config.actions.items(): - actions[action].update(action_handlers) - - if reset_data_on_enter is None: - reset_data_on_enter = parent_scene_config.reset_data_on_enter - if reset_history_on_enter is None: - reset_history_on_enter = parent_scene_config.reset_history_on_enter - if callback_query_without_state is None: - callback_query_without_state = parent_scene_config.callback_query_without_state - - for name in vars(cls): - value = getattr(cls, name) - - if scene_handlers := getattr(value, "__aiogram_handler__", None): - handlers.extend(scene_handlers) - if isinstance(value, ObserverDecorator): - handlers.append( - HandlerContainer( - value.name, - _empty_handler, - value.filters, - after=value.after, - ) - ) - if hasattr(value, "__aiogram_action__"): - for action, action_handlers in value.__aiogram_action__.items(): - actions[action].update(action_handlers) - - cls.__scene_config__ = SceneConfig( - state=state_name, - handlers=handlers, - actions=dict(actions), - reset_data_on_enter=reset_data_on_enter, - reset_history_on_enter=reset_history_on_enter, - callback_query_without_state=callback_query_without_state, - ) - - @classmethod - def add_to_router(cls, router: Router) -> None: - """ - Adds the scene to the given router. - - :param router: - :return: - """ - scene_config = cls.__scene_config__ - used_observers = set() - - for handler in scene_config.handlers: - router.observers[handler.name].register( - SceneHandlerWrapper( - cls, - handler.handler, - after=handler.after, - ), - *handler.filters, - flags=extract_flags_from_object(handler.handler), - ) - used_observers.add(handler.name) - - for observer_name in used_observers: - if scene_config.callback_query_without_state and observer_name == "callback_query": - continue - router.observers[observer_name].filter(StateFilter(scene_config.state)) - - @classmethod - def as_router(cls, name: Optional[str] = None) -> Router: - """ - Returns the scene as a router. - - :return: new router - """ - if name is None: - name = ( - f"Scene '{cls.__module__}.{cls.__qualname__}' " - f"for state {cls.__scene_config__.state!r}" - ) - router = Router(name=name) - cls.add_to_router(router) - return router - - @classmethod - def as_handler(cls, **kwargs: Any) -> CallbackType: - """ - Create an entry point handler for the scene, can be used to simplify the handler - that starts the scene. - - >>> router.message.register(MyScene.as_handler(), Command("start")) - """ - - async def enter_to_scene_handler(event: TelegramObject, scenes: ScenesManager) -> None: - await scenes.enter(cls, **kwargs) - - return enter_to_scene_handler - - -class SceneWizard: - """ - A class that represents a wizard for managing scenes in a Telegram bot. - - Instance of this class is passed to each scene as a parameter. - So, you can use it to transition between scenes, get and set data, etc. - - .. note:: - - This class is not meant to be used directly. Instead, it should be used - as a parameter in the scene constructor. - - """ - - def __init__( - self, - scene_config: SceneConfig, - manager: ScenesManager, - state: FSMContext, - update_type: str, - event: TelegramObject, - data: Dict[str, Any], - ): - """ - A class that represents a wizard for managing scenes in a Telegram bot. - - :param scene_config: The configuration of the scene. - :param manager: The scene manager. - :param state: The FSMContext object for storing the state of the scene. - :param update_type: The type of the update event. - :param event: The TelegramObject represents the event. - :param data: Additional data for the scene. - """ - self.scene_config = scene_config - self.manager = manager - self.state = state - self.update_type = update_type - self.event = event - self.data = data - - self.scene: Optional[Scene] = None - - async def enter(self, **kwargs: Any) -> None: - """ - Enter method is used to transition into a scene in the SceneWizard class. - It sets the state, clears data and history if specified, - and triggers entering event of the scene. - - :param kwargs: Additional keyword arguments. - :return: None - """ - loggers.scene.debug("Entering scene %r", self.scene_config.state) - if self.scene_config.reset_data_on_enter: - await self.state.set_data({}) - if self.scene_config.reset_history_on_enter: - await self.manager.history.clear() - await self.state.set_state(self.scene_config.state) - await self._on_action(SceneAction.enter, **kwargs) - - async def leave(self, _with_history: bool = True, **kwargs: Any) -> None: - """ - Leaves the current scene. - This method is used to exit a scene and transition to the next scene. - - :param _with_history: Whether to include history in the snapshot. Defaults to True. - :param kwargs: Additional keyword arguments. - :return: None - - """ - loggers.scene.debug("Leaving scene %r", self.scene_config.state) - if _with_history: - await self.manager.history.snapshot() - await self._on_action(SceneAction.leave, **kwargs) - - async def exit(self, **kwargs: Any) -> None: - """ - Exit the current scene and enter the default scene/state. - - :param kwargs: Additional keyword arguments. - :return: None - """ - loggers.scene.debug("Exiting scene %r", self.scene_config.state) - await self.manager.history.clear() - await self._on_action(SceneAction.exit, **kwargs) - await self.manager.enter(None, _check_active=False, **kwargs) - - async def back(self, **kwargs: Any) -> None: - """ - This method is used to go back to the previous scene. - - :param kwargs: Keyword arguments that can be passed to the method. - :return: None - """ - loggers.scene.debug("Back to previous scene from scene %s", self.scene_config.state) - await self.leave(_with_history=False, **kwargs) - new_scene = await self.manager.history.rollback() - await self.manager.enter(new_scene, _check_active=False, **kwargs) - - async def retake(self, **kwargs: Any) -> None: - """ - This method allows to re-enter the current scene. - - :param kwargs: Additional keyword arguments to pass to the scene. - :return: None - """ - assert self.scene_config.state is not None, "Scene state is not specified" - await self.goto(self.scene_config.state, **kwargs) - - async def goto(self, scene: Union[Type[Scene], str], **kwargs: Any) -> None: - """ - The `goto` method transitions to a new scene. - It first calls the `leave` method to perform any necessary cleanup - in the current scene, then calls the `enter` event to enter the specified scene. - - :param scene: The scene to transition to. Can be either a `Scene` instance - or a string representing the scene. - :param kwargs: Additional keyword arguments to pass to the `enter` - method of the scene manager. - :return: None - """ - await self.leave(**kwargs) - await self.manager.enter(scene, _check_active=False, **kwargs) - - async def _on_action(self, action: SceneAction, **kwargs: Any) -> bool: - if not self.scene: - raise SceneException("Scene is not initialized") - - loggers.scene.debug("Call action %r in scene %r", action.name, self.scene_config.state) - action_config = self.scene_config.actions.get(action, {}) - if not action_config: - loggers.scene.debug( - "Action %r not found in scene %r", action.name, self.scene_config.state - ) - return False - - event_type = self.update_type - if event_type not in action_config: - loggers.scene.debug( - "Action %r for event %r not found in scene %r", - action.name, - event_type, - self.scene_config.state, - ) - return False - - await action_config[event_type].call(self.scene, self.event, **{**self.data, **kwargs}) - return True - - async def set_data(self, data: Dict[str, Any]) -> None: - """ - Sets custom data in the current state. - - :param data: A dictionary containing the custom data to be set in the current state. - :return: None - """ - await self.state.set_data(data=data) - - async def get_data(self) -> Dict[str, Any]: - """ - This method returns the data stored in the current state. - - :return: A dictionary containing the data stored in the scene state. - """ - return await self.state.get_data() - - async def update_data( - self, data: Optional[Dict[str, Any]] = None, **kwargs: Any - ) -> Dict[str, Any]: - """ - This method updates the data stored in the current state - - :param data: Optional dictionary of data to update. - :param kwargs: Additional key-value pairs of data to update. - :return: Dictionary of updated data - """ - if data: - kwargs.update(data) - return await self.state.update_data(data=kwargs) - - async def clear_data(self) -> None: - """ - Clears the data. - - :return: None - """ - await self.set_data({}) - - -class ScenesManager: - """ - The ScenesManager class is responsible for managing scenes in an application. - It provides methods for entering and exiting scenes, as well as retrieving the active scene. - """ - - def __init__( - self, - registry: SceneRegistry, - update_type: str, - event: TelegramObject, - state: FSMContext, - data: Dict[str, Any], - ) -> None: - self.registry = registry - self.update_type = update_type - self.event = event - self.state = state - self.data = data - - self.history = HistoryManager(self.state) - - async def _get_scene(self, scene_type: Optional[Union[Type[Scene], str]]) -> Scene: - scene_type = self.registry.get(scene_type) - return scene_type( - wizard=SceneWizard( - scene_config=scene_type.__scene_config__, - manager=self, - state=self.state, - update_type=self.update_type, - event=self.event, - data=self.data, - ), - ) - - async def _get_active_scene(self) -> Optional[Scene]: - state = await self.state.get_state() - try: - return await self._get_scene(state) - except SceneException: - return None - - async def enter( - self, - scene_type: Optional[Union[Type[Scene], str]], - _check_active: bool = True, - **kwargs: Any, - ) -> None: - """ - Enters the specified scene. - - :param scene_type: Optional Type[Scene] or str representing the scene type to enter. - :param _check_active: Optional bool indicating whether to check if - there is an active scene to exit before entering the new scene. Defaults to True. - :param kwargs: Additional keyword arguments to pass to the scene's wizard.enter() method. - :return: None - """ - if _check_active: - active_scene = await self._get_active_scene() - if active_scene is not None: - await active_scene.wizard.exit(**kwargs) - - try: - scene = await self._get_scene(scene_type) - except SceneException: - if scene_type is not None: - raise - await self.state.set_state(None) - else: - await scene.wizard.enter(**kwargs) - - async def close(self, **kwargs: Any) -> None: - """ - Close method is used to exit the currently active scene in the ScenesManager. - - :param kwargs: Additional keyword arguments passed to the scene's exit method. - :return: None - """ - scene = await self._get_active_scene() - if not scene: - return - await scene.wizard.exit(**kwargs) - - -class SceneRegistry: - """ - A class that represents a registry for scenes in a Telegram bot. - """ - - def __init__(self, router: Router, register_on_add: bool = True) -> None: - """ - Initialize a new instance of the SceneRegistry class. - - :param router: The router instance used for scene registration. - :param register_on_add: Whether to register the scenes to the router when they are added. - """ - self.router = router - self.register_on_add = register_on_add - - self._scenes: Dict[Optional[str], Type[Scene]] = {} - self._setup_middleware(router) - - def _setup_middleware(self, router: Router) -> None: - if isinstance(router, Dispatcher): - # Small optimization for Dispatcher - # - we don't need to set up middleware for all observers - router.update.outer_middleware(self._update_middleware) - return - - for observer in router.observers.values(): - if observer.event_name in {"update", "error"}: - continue - observer.outer_middleware(self._middleware) - - async def _update_middleware( - self, - handler: NextMiddlewareType[TelegramObject], - event: TelegramObject, - data: Dict[str, Any], - ) -> Any: - assert isinstance(event, Update), "Event must be an Update instance" - - data["scenes"] = ScenesManager( - registry=self, - update_type=event.event_type, - event=event.event, - state=data["state"], - data=data, - ) - return await handler(event, data) - - async def _middleware( - self, - handler: NextMiddlewareType[TelegramObject], - event: TelegramObject, - data: Dict[str, Any], - ) -> Any: - update: Update = data["event_update"] - data["scenes"] = ScenesManager( - registry=self, - update_type=update.event_type, - event=event, - state=data["state"], - data=data, - ) - return await handler(event, data) - - def add(self, *scenes: Type[Scene], router: Optional[Router] = None) -> None: - """ - This method adds the specified scenes to the registry - and optionally registers it to the router. - - If a scene with the same state already exists in the registry, a SceneException is raised. - - .. warning:: - - If the router is not specified, the scenes will not be registered to the router. - You will need to include the scenes manually to the router or use the register method. - - :param scenes: A variable length parameter that accepts one or more types of scenes. - These scenes are instances of the Scene class. - :param router: An optional parameter that specifies the router - to which the scenes should be added. - :return: None - """ - if not scenes: - raise ValueError("At least one scene must be specified") - - for scene in scenes: - if scene.__scene_config__.state in self._scenes: - raise SceneException( - f"Scene with state {scene.__scene_config__.state!r} already exists" - ) - - self._scenes[scene.__scene_config__.state] = scene - - if router: - router.include_router(scene.as_router()) - elif self.register_on_add: - self.router.include_router(scene.as_router()) - - def register(self, *scenes: Type[Scene]) -> None: - """ - Registers one or more scenes to the SceneRegistry. - - :param scenes: One or more scene classes to register. - :return: None - """ - self.add(*scenes, router=self.router) - - def get(self, scene: Optional[Union[Type[Scene], str]]) -> Type[Scene]: - """ - This method returns the registered Scene object for the specified scene. - The scene parameter can be either a Scene object or a string representing - the name of the scene. If a Scene object is provided, the state attribute - of the SceneConfig object associated with the Scene object will be used as the scene name. - If None or an invalid type is provided, a SceneException will be raised. - - If the specified scene is not registered in the SceneRegistry object, - a SceneException will be raised. - - :param scene: A Scene object or a string representing the name of the scene. - :return: The registered Scene object corresponding to the given scene parameter. - - """ - if inspect.isclass(scene) and issubclass(scene, Scene): - scene = scene.__scene_config__.state - if isinstance(scene, State): - scene = scene.state - if scene is not None and not isinstance(scene, str): - raise SceneException("Scene must be a subclass of Scene or a string") - - try: - return self._scenes[scene] - except KeyError: - raise SceneException(f"Scene {scene!r} is not registered") - - -@dataclass -class After: - action: SceneAction - scene: Optional[Union[Type[Scene], str]] = None - - @classmethod - def exit(cls) -> After: - return cls(action=SceneAction.exit) - - @classmethod - def back(cls) -> After: - return cls(action=SceneAction.back) - - @classmethod - def goto(cls, scene: Optional[Union[Type[Scene], str]]) -> After: - return cls(action=SceneAction.enter, scene=scene) - - -class ObserverMarker: - def __init__(self, name: str) -> None: - self.name = name - - def __call__( - self, - *filters: CallbackType, - after: Optional[After] = None, - ) -> ObserverDecorator: - return ObserverDecorator( - self.name, - filters, - after=after, - ) - - def enter(self, *filters: CallbackType) -> ObserverDecorator: - return ObserverDecorator(self.name, filters, action=SceneAction.enter) - - def leave(self) -> ObserverDecorator: - return ObserverDecorator(self.name, (), action=SceneAction.leave) - - def exit(self) -> ObserverDecorator: - return ObserverDecorator(self.name, (), action=SceneAction.exit) - - def back(self) -> ObserverDecorator: - return ObserverDecorator(self.name, (), action=SceneAction.back) - - -class OnMarker: - """ - The `OnMarker` class is used as a marker class to define different - types of events in the Scenes. - - Attributes: - - - :code:`message`: Event marker for handling `Message` events. - - :code:`edited_message`: Event marker for handling edited `Message` events. - - :code:`channel_post`: Event marker for handling channel `Post` events. - - :code:`edited_channel_post`: Event marker for handling edited channel `Post` events. - - :code:`inline_query`: Event marker for handling `InlineQuery` events. - - :code:`chosen_inline_result`: Event marker for handling chosen `InlineResult` events. - - :code:`callback_query`: Event marker for handling `CallbackQuery` events. - - :code:`shipping_query`: Event marker for handling `ShippingQuery` events. - - :code:`pre_checkout_query`: Event marker for handling `PreCheckoutQuery` events. - - :code:`poll`: Event marker for handling `Poll` events. - - :code:`poll_answer`: Event marker for handling `PollAnswer` events. - - :code:`my_chat_member`: Event marker for handling my chat `Member` events. - - :code:`chat_member`: Event marker for handling chat `Member` events. - - :code:`chat_join_request`: Event marker for handling chat `JoinRequest` events. - - :code:`error`: Event marker for handling `Error` events. - - .. note:: - - This is a marker class and does not contain any methods or implementation logic. - """ - - message = ObserverMarker("message") - edited_message = ObserverMarker("edited_message") - channel_post = ObserverMarker("channel_post") - edited_channel_post = ObserverMarker("edited_channel_post") - inline_query = ObserverMarker("inline_query") - chosen_inline_result = ObserverMarker("chosen_inline_result") - callback_query = ObserverMarker("callback_query") - shipping_query = ObserverMarker("shipping_query") - pre_checkout_query = ObserverMarker("pre_checkout_query") - poll = ObserverMarker("poll") - poll_answer = ObserverMarker("poll_answer") - my_chat_member = ObserverMarker("my_chat_member") - chat_member = ObserverMarker("chat_member") - chat_join_request = ObserverMarker("chat_join_request") - - -on = OnMarker() diff --git a/env/Lib/site-packages/aiogram/fsm/state.py b/env/Lib/site-packages/aiogram/fsm/state.py deleted file mode 100644 index 6b8c737..0000000 --- a/env/Lib/site-packages/aiogram/fsm/state.py +++ /dev/null @@ -1,172 +0,0 @@ -import inspect -from typing import Any, Iterator, Optional, Tuple, Type, no_type_check - -from aiogram.types import TelegramObject - - -class State: - """ - State object - """ - - def __init__(self, state: Optional[str] = None, group_name: Optional[str] = None) -> None: - self._state = state - self._group_name = group_name - self._group: Optional[Type[StatesGroup]] = None - - @property - def group(self) -> "Type[StatesGroup]": - if not self._group: - raise RuntimeError("This state is not in any group.") - return self._group - - @property - def state(self) -> Optional[str]: - if self._state is None or self._state == "*": - return self._state - - if self._group_name is None and self._group: - group = self._group.__full_group_name__ - elif self._group_name: - group = self._group_name - else: - group = "@" - - return f"{group}:{self._state}" - - def set_parent(self, group: "Type[StatesGroup]") -> None: - if not issubclass(group, StatesGroup): - raise ValueError("Group must be subclass of StatesGroup") - self._group = group - - def __set_name__(self, owner: "Type[StatesGroup]", name: str) -> None: - if self._state is None: - self._state = name - self.set_parent(owner) - - def __str__(self) -> str: - return f"" - - __repr__ = __str__ - - def __call__(self, event: TelegramObject, raw_state: Optional[str] = None) -> bool: - if self.state == "*": - return True - return raw_state == self.state - - def __eq__(self, other: Any) -> bool: - if isinstance(other, self.__class__): - return self.state == other.state - if isinstance(other, str): - return self.state == other - return NotImplemented - - def __hash__(self) -> int: - return hash(self.state) - - -class StatesGroupMeta(type): - __parent__: "Optional[Type[StatesGroup]]" - __childs__: "Tuple[Type[StatesGroup], ...]" - __states__: Tuple[State, ...] - __state_names__: Tuple[str, ...] - __all_childs__: Tuple[Type["StatesGroup"], ...] - __all_states__: Tuple[State, ...] - __all_states_names__: Tuple[str, ...] - - @no_type_check - def __new__(mcs, name, bases, namespace, **kwargs): - cls = super().__new__(mcs, name, bases, namespace) - - states = [] - childs = [] - - for name, arg in namespace.items(): - if isinstance(arg, State): - states.append(arg) - elif inspect.isclass(arg) and issubclass(arg, StatesGroup): - child = cls._prepare_child(arg) - childs.append(child) - - cls.__parent__ = None - cls.__childs__ = tuple(childs) - cls.__states__ = tuple(states) - cls.__state_names__ = tuple(state.state for state in states) - - cls.__all_childs__ = cls._get_all_childs() - cls.__all_states__ = cls._get_all_states() - - # In order to ensure performance, we calculate this parameter - # in advance already during the production of the class. - # Depending on the relationship, it should be recalculated - cls.__all_states_names__ = cls._get_all_states_names() - - return cls - - @property - def __full_group_name__(cls) -> str: - if cls.__parent__: - return ".".join((cls.__parent__.__full_group_name__, cls.__name__)) - return cls.__name__ - - def _prepare_child(cls, child: Type["StatesGroup"]) -> Type["StatesGroup"]: - """Prepare child. - - While adding `cls` for its children, we also need to recalculate - the parameter `__all_states_names__` for each child - `StatesGroup`. Since the child class appears before the - parent, at the time of adding the parent, the child's - `__all_states_names__` is already recorded without taking into - account the name of current parent. - """ - child.__parent__ = cls # type: ignore[assignment] - child.__all_states_names__ = child._get_all_states_names() - return child - - def _get_all_childs(cls) -> Tuple[Type["StatesGroup"], ...]: - result = cls.__childs__ - for child in cls.__childs__: - result += child.__childs__ - return result - - def _get_all_states(cls) -> Tuple[State, ...]: - result = cls.__states__ - for group in cls.__childs__: - result += group.__all_states__ - return result - - def _get_all_states_names(cls) -> Tuple[str, ...]: - return tuple(state.state for state in cls.__all_states__ if state.state) - - def __contains__(cls, item: Any) -> bool: - if isinstance(item, str): - return item in cls.__all_states_names__ - if isinstance(item, State): - return item in cls.__all_states__ - if isinstance(item, StatesGroupMeta): - return item in cls.__all_childs__ - return False - - def __str__(self) -> str: - return f"" - - def __iter__(self) -> Iterator[State]: - return iter(self.__all_states__) - - -class StatesGroup(metaclass=StatesGroupMeta): - @classmethod - def get_root(cls) -> Type["StatesGroup"]: - if cls.__parent__ is None: - return cls - return cls.__parent__.get_root() - - def __call__(self, event: TelegramObject, raw_state: Optional[str] = None) -> bool: - return raw_state in type(self).__all_states_names__ - - def __str__(self) -> str: - return f"StatesGroup {type(self).__full_group_name__}" - - -default_state = State() -any_state = State(state="*") diff --git a/env/Lib/site-packages/aiogram/fsm/storage/__init__.py b/env/Lib/site-packages/aiogram/fsm/storage/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/Lib/site-packages/aiogram/fsm/storage/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/fsm/storage/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index accd5184f4ff788b6f29dfe3e40e986c8c88f4de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 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 NXcMcS?!e%gz`U_Q$z1 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 F_z!EN5pDng diff --git a/env/Lib/site-packages/aiogram/fsm/storage/__pycache__/redis.cpython-311.pyc b/env/Lib/site-packages/aiogram/fsm/storage/__pycache__/redis.cpython-311.pyc deleted file mode 100644 index 0b86cfe153311d91f509c9df94bb57159eeac5c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9175 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 str: - """ - Build key to be used in storage's db queries - - :param key: contextual key - :param part: part of the record - :return: key to be used in storage's db queries - """ - pass - - -class DefaultKeyBuilder(KeyBuilder): - """ - Simple key builder with default prefix. - - Generates a colon-joined string with prefix, chat_id, user_id, - optional bot_id, business_connection_id, destiny and field. - - Format: - :code:`::::::` - """ - - def __init__( - self, - *, - prefix: str = "fsm", - separator: str = ":", - with_bot_id: bool = False, - with_business_connection_id: bool = False, - with_destiny: bool = False, - ) -> None: - """ - :param prefix: prefix for all records - :param separator: separator - :param with_bot_id: include Bot id in the key - :param with_business_connection_id: include business connection id - :param with_destiny: include destiny key - """ - self.prefix = prefix - self.separator = separator - self.with_bot_id = with_bot_id - self.with_business_connection_id = with_business_connection_id - self.with_destiny = with_destiny - - def build( - self, - key: StorageKey, - part: Optional[Literal["data", "state", "lock"]] = None, - ) -> str: - parts = [self.prefix] - if self.with_bot_id: - parts.append(str(key.bot_id)) - if self.with_business_connection_id and key.business_connection_id: - parts.append(str(key.business_connection_id)) - parts.append(str(key.chat_id)) - if key.thread_id: - parts.append(str(key.thread_id)) - parts.append(str(key.user_id)) - if self.with_destiny: - parts.append(key.destiny) - elif key.destiny != DEFAULT_DESTINY: - error_message = ( - "Default key builder is not configured to use key destiny other than the default." - "\n\nProbably, you should set `with_destiny=True` in for DefaultKeyBuilder." - ) - raise ValueError(error_message) - if part: - parts.append(part) - return self.separator.join(parts) - - -class BaseStorage(ABC): - """ - Base class for all FSM storages - """ - - @abstractmethod - async def set_state(self, key: StorageKey, state: StateType = None) -> None: - """ - Set state for specified key - - :param key: storage key - :param state: new state - """ - pass - - @abstractmethod - async def get_state(self, key: StorageKey) -> Optional[str]: - """ - Get key state - - :param key: storage key - :return: current state - """ - pass - - @abstractmethod - async def set_data(self, key: StorageKey, data: Dict[str, Any]) -> None: - """ - Write data (replace) - - :param key: storage key - :param data: new data - """ - pass - - @abstractmethod - async def get_data(self, key: StorageKey) -> Dict[str, Any]: - """ - Get current data for key - - :param key: storage key - :return: current data - """ - pass - - async def update_data(self, key: StorageKey, data: Dict[str, Any]) -> Dict[str, Any]: - """ - Update date in the storage for key (like dict.update) - - :param key: storage key - :param data: partial data - :return: new data - """ - current_data = await self.get_data(key=key) - current_data.update(data) - await self.set_data(key=key, data=current_data) - return current_data.copy() - - @abstractmethod - async def close(self) -> None: # pragma: no cover - """ - Close storage (database connection, file or etc.) - """ - pass - - -class BaseEventIsolation(ABC): - @abstractmethod - @asynccontextmanager - async def lock(self, key: StorageKey) -> AsyncGenerator[None, None]: - """ - Isolate events with lock. - Will be used as context manager - - :param key: storage key - :return: An async generator - """ - yield None - - @abstractmethod - async def close(self) -> None: - pass diff --git a/env/Lib/site-packages/aiogram/fsm/storage/memory.py b/env/Lib/site-packages/aiogram/fsm/storage/memory.py deleted file mode 100644 index d80a9ff..0000000 --- a/env/Lib/site-packages/aiogram/fsm/storage/memory.py +++ /dev/null @@ -1,74 +0,0 @@ -from asyncio import Lock -from collections import defaultdict -from contextlib import asynccontextmanager -from dataclasses import dataclass, field -from typing import Any, AsyncGenerator, DefaultDict, Dict, Hashable, Optional - -from aiogram.fsm.state import State -from aiogram.fsm.storage.base import ( - BaseEventIsolation, - BaseStorage, - StateType, - StorageKey, -) - - -@dataclass -class MemoryStorageRecord: - data: Dict[str, Any] = field(default_factory=dict) - state: Optional[str] = None - - -class MemoryStorage(BaseStorage): - """ - Default FSM storage, stores all data in :class:`dict` and loss everything on shutdown - - .. warning:: - - Is not recommended using in production in due to you will lose all data - when your bot restarts - """ - - def __init__(self) -> None: - self.storage: DefaultDict[StorageKey, MemoryStorageRecord] = defaultdict( - MemoryStorageRecord - ) - - async def close(self) -> None: - pass - - async def set_state(self, key: StorageKey, state: StateType = None) -> None: - self.storage[key].state = state.state if isinstance(state, State) else state - - async def get_state(self, key: StorageKey) -> Optional[str]: - return self.storage[key].state - - async def set_data(self, key: StorageKey, data: Dict[str, Any]) -> None: - self.storage[key].data = data.copy() - - async def get_data(self, key: StorageKey) -> Dict[str, Any]: - return self.storage[key].data.copy() - - -class DisabledEventIsolation(BaseEventIsolation): - @asynccontextmanager - async def lock(self, key: StorageKey) -> AsyncGenerator[None, None]: - yield - - async def close(self) -> None: - pass - - -class SimpleEventIsolation(BaseEventIsolation): - def __init__(self) -> None: - # TODO: Unused locks cleaner is needed - self._locks: DefaultDict[Hashable, Lock] = defaultdict(Lock) - - @asynccontextmanager - async def lock(self, key: StorageKey) -> AsyncGenerator[None, None]: - lock = self._locks[key] - async with lock: - yield - - async def close(self) -> None: - self._locks.clear() diff --git a/env/Lib/site-packages/aiogram/fsm/storage/mongo.py b/env/Lib/site-packages/aiogram/fsm/storage/mongo.py deleted file mode 100644 index b4b1eea..0000000 --- a/env/Lib/site-packages/aiogram/fsm/storage/mongo.py +++ /dev/null @@ -1,130 +0,0 @@ -from typing import Any, Dict, Optional, cast - -from motor.motor_asyncio import AsyncIOMotorClient - -from aiogram.fsm.state import State -from aiogram.fsm.storage.base import ( - BaseStorage, - DefaultKeyBuilder, - KeyBuilder, - StateType, - StorageKey, -) - - -class MongoStorage(BaseStorage): - """ - MongoDB storage required :code:`motor` package installed (:code:`pip install motor`) - """ - - def __init__( - self, - client: AsyncIOMotorClient, - key_builder: Optional[KeyBuilder] = None, - db_name: str = "aiogram_fsm", - collection_name: str = "states_and_data", - ) -> None: - """ - :param client: Instance of AsyncIOMotorClient - :param key_builder: builder that helps to convert contextual key to string - :param db_name: name of the MongoDB database for FSM - :param collection_name: name of the collection for storing FSM states and data - """ - if key_builder is None: - key_builder = DefaultKeyBuilder() - self._client = client - self._database = self._client[db_name] - self._collection = self._database[collection_name] - self._key_builder = key_builder - - @classmethod - def from_url( - cls, url: str, connection_kwargs: Optional[Dict[str, Any]] = None, **kwargs: Any - ) -> "MongoStorage": - """ - Create an instance of :class:`MongoStorage` with specifying the connection string - - :param url: for example :code:`mongodb://user:password@host:port` - :param connection_kwargs: see :code:`motor` docs - :param kwargs: arguments to be passed to :class:`MongoStorage` - :return: an instance of :class:`MongoStorage` - """ - if connection_kwargs is None: - connection_kwargs = {} - client = AsyncIOMotorClient(url, **connection_kwargs) - return cls(client=client, **kwargs) - - async def close(self) -> None: - """Cleanup client resources and disconnect from MongoDB.""" - self._client.close() - - def resolve_state(self, value: StateType) -> Optional[str]: - if value is None: - return None - if isinstance(value, State): - return value.state - return str(value) - - async def set_state(self, key: StorageKey, state: StateType = None) -> None: - document_id = self._key_builder.build(key) - if state is None: - updated = await self._collection.find_one_and_update( - filter={"_id": document_id}, - update={"$unset": {"state": 1}}, - projection={"_id": 0}, - return_document=True, - ) - if updated == {}: - await self._collection.delete_one({"_id": document_id}) - else: - await self._collection.update_one( - filter={"_id": document_id}, - update={"$set": {"state": self.resolve_state(state)}}, - upsert=True, - ) - - async def get_state(self, key: StorageKey) -> Optional[str]: - document_id = self._key_builder.build(key) - document = await self._collection.find_one({"_id": document_id}) - if document is None: - return None - return document.get("state") - - async def set_data(self, key: StorageKey, data: Dict[str, Any]) -> None: - document_id = self._key_builder.build(key) - if not data: - updated = await self._collection.find_one_and_update( - filter={"_id": document_id}, - update={"$unset": {"data": 1}}, - projection={"_id": 0}, - return_document=True, - ) - if updated == {}: - await self._collection.delete_one({"_id": document_id}) - else: - await self._collection.update_one( - filter={"_id": document_id}, - update={"$set": {"data": data}}, - upsert=True, - ) - - async def get_data(self, key: StorageKey) -> Dict[str, Any]: - document_id = self._key_builder.build(key) - document = await self._collection.find_one({"_id": document_id}) - if document is None or not document.get("data"): - return {} - return cast(Dict[str, Any], document["data"]) - - async def update_data(self, key: StorageKey, data: Dict[str, Any]) -> Dict[str, Any]: - document_id = self._key_builder.build(key) - update_with = {f"data.{key}": value for key, value in data.items()} - update_result = await self._collection.find_one_and_update( - filter={"_id": document_id}, - update={"$set": update_with}, - upsert=True, - return_document=True, - projection={"_id": 0}, - ) - if not update_result: - await self._collection.delete_one({"_id": document_id}) - return update_result.get("data", {}) diff --git a/env/Lib/site-packages/aiogram/fsm/storage/redis.py b/env/Lib/site-packages/aiogram/fsm/storage/redis.py deleted file mode 100644 index edcf9d6..0000000 --- a/env/Lib/site-packages/aiogram/fsm/storage/redis.py +++ /dev/null @@ -1,169 +0,0 @@ -import json -from contextlib import asynccontextmanager -from typing import Any, AsyncGenerator, Callable, Dict, Optional, cast - -from redis.asyncio.client import Redis -from redis.asyncio.connection import ConnectionPool -from redis.asyncio.lock import Lock -from redis.typing import ExpiryT - -from aiogram.fsm.state import State -from aiogram.fsm.storage.base import ( - BaseEventIsolation, - BaseStorage, - DefaultKeyBuilder, - KeyBuilder, - StateType, - StorageKey, -) - -DEFAULT_REDIS_LOCK_KWARGS = {"timeout": 60} -_JsonLoads = Callable[..., Any] -_JsonDumps = Callable[..., str] - - -class RedisStorage(BaseStorage): - """ - Redis storage required :code:`redis` package installed (:code:`pip install redis`) - """ - - def __init__( - self, - redis: Redis, - key_builder: Optional[KeyBuilder] = None, - state_ttl: Optional[ExpiryT] = None, - data_ttl: Optional[ExpiryT] = None, - json_loads: _JsonLoads = json.loads, - json_dumps: _JsonDumps = json.dumps, - ) -> None: - """ - :param redis: Instance of Redis connection - :param key_builder: builder that helps to convert contextual key to string - :param state_ttl: TTL for state records - :param data_ttl: TTL for data records - """ - if key_builder is None: - key_builder = DefaultKeyBuilder() - self.redis = redis - self.key_builder = key_builder - self.state_ttl = state_ttl - self.data_ttl = data_ttl - self.json_loads = json_loads - self.json_dumps = json_dumps - - @classmethod - def from_url( - cls, url: str, connection_kwargs: Optional[Dict[str, Any]] = None, **kwargs: Any - ) -> "RedisStorage": - """ - Create an instance of :class:`RedisStorage` with specifying the connection string - - :param url: for example :code:`redis://user:password@host:port/db` - :param connection_kwargs: see :code:`redis` docs - :param kwargs: arguments to be passed to :class:`RedisStorage` - :return: an instance of :class:`RedisStorage` - """ - if connection_kwargs is None: - connection_kwargs = {} - pool = ConnectionPool.from_url(url, **connection_kwargs) - redis = Redis(connection_pool=pool) - return cls(redis=redis, **kwargs) - - def create_isolation(self, **kwargs: Any) -> "RedisEventIsolation": - return RedisEventIsolation(redis=self.redis, key_builder=self.key_builder, **kwargs) - - async def close(self) -> None: - await self.redis.aclose(close_connection_pool=True) - - async def set_state( - self, - key: StorageKey, - state: StateType = None, - ) -> None: - redis_key = self.key_builder.build(key, "state") - if state is None: - await self.redis.delete(redis_key) - else: - await self.redis.set( - redis_key, - cast(str, state.state if isinstance(state, State) else state), - ex=self.state_ttl, - ) - - async def get_state( - self, - key: StorageKey, - ) -> Optional[str]: - redis_key = self.key_builder.build(key, "state") - value = await self.redis.get(redis_key) - if isinstance(value, bytes): - return value.decode("utf-8") - return cast(Optional[str], value) - - async def set_data( - self, - key: StorageKey, - data: Dict[str, Any], - ) -> None: - redis_key = self.key_builder.build(key, "data") - if not data: - await self.redis.delete(redis_key) - return - await self.redis.set( - redis_key, - self.json_dumps(data), - ex=self.data_ttl, - ) - - async def get_data( - self, - key: StorageKey, - ) -> Dict[str, Any]: - redis_key = self.key_builder.build(key, "data") - value = await self.redis.get(redis_key) - if value is None: - return {} - if isinstance(value, bytes): - value = value.decode("utf-8") - return cast(Dict[str, Any], self.json_loads(value)) - - -class RedisEventIsolation(BaseEventIsolation): - def __init__( - self, - redis: Redis, - key_builder: Optional[KeyBuilder] = None, - lock_kwargs: Optional[Dict[str, Any]] = None, - ) -> None: - if key_builder is None: - key_builder = DefaultKeyBuilder() - if lock_kwargs is None: - lock_kwargs = DEFAULT_REDIS_LOCK_KWARGS - self.redis = redis - self.key_builder = key_builder - self.lock_kwargs = lock_kwargs - - @classmethod - def from_url( - cls, - url: str, - connection_kwargs: Optional[Dict[str, Any]] = None, - **kwargs: Any, - ) -> "RedisEventIsolation": - if connection_kwargs is None: - connection_kwargs = {} - pool = ConnectionPool.from_url(url, **connection_kwargs) - redis = Redis(connection_pool=pool) - return cls(redis=redis, **kwargs) - - @asynccontextmanager - async def lock( - self, - key: StorageKey, - ) -> AsyncGenerator[None, None]: - redis_key = self.key_builder.build(key, "lock") - async with self.redis.lock(name=redis_key, **self.lock_kwargs, lock_class=Lock): - yield None - - async def close(self) -> None: - pass diff --git a/env/Lib/site-packages/aiogram/fsm/strategy.py b/env/Lib/site-packages/aiogram/fsm/strategy.py deleted file mode 100644 index da2d94e..0000000 --- a/env/Lib/site-packages/aiogram/fsm/strategy.py +++ /dev/null @@ -1,37 +0,0 @@ -from enum import Enum, auto -from typing import Optional, Tuple - - -class FSMStrategy(Enum): - """ - FSM strategy for storage key generation. - """ - - USER_IN_CHAT = auto() - """State will be stored for each user in chat.""" - CHAT = auto() - """State will be stored for each chat globally without separating by users.""" - GLOBAL_USER = auto() - """State will be stored globally for each user globally.""" - USER_IN_TOPIC = auto() - """State will be stored for each user in chat and topic.""" - CHAT_TOPIC = auto() - """State will be stored for each chat and topic, but not separated by users.""" - - -def apply_strategy( - strategy: FSMStrategy, - chat_id: int, - user_id: int, - thread_id: Optional[int] = None, -) -> Tuple[int, int, Optional[int]]: - if strategy == FSMStrategy.CHAT: - return chat_id, chat_id, None - if strategy == FSMStrategy.GLOBAL_USER: - return user_id, user_id, None - if strategy == FSMStrategy.USER_IN_TOPIC: - return chat_id, user_id, thread_id - if strategy == FSMStrategy.CHAT_TOPIC: - return chat_id, chat_id, thread_id - - return chat_id, user_id, None diff --git a/env/Lib/site-packages/aiogram/handlers/__init__.py b/env/Lib/site-packages/aiogram/handlers/__init__.py deleted file mode 100644 index 5483788..0000000 --- a/env/Lib/site-packages/aiogram/handlers/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from .base import BaseHandler, BaseHandlerMixin -from .callback_query import CallbackQueryHandler -from .chat_member import ChatMemberHandler -from .chosen_inline_result import ChosenInlineResultHandler -from .error import ErrorHandler -from .inline_query import InlineQueryHandler -from .message import MessageHandler, MessageHandlerCommandMixin -from .poll import PollHandler -from .pre_checkout_query import PreCheckoutQueryHandler -from .shipping_query import ShippingQueryHandler - -__all__ = ( - "BaseHandler", - "BaseHandlerMixin", - "CallbackQueryHandler", - "ChatMemberHandler", - "ChosenInlineResultHandler", - "ErrorHandler", - "InlineQueryHandler", - "MessageHandler", - "MessageHandlerCommandMixin", - "PollHandler", - "PreCheckoutQueryHandler", - "ShippingQueryHandler", -) diff --git a/env/Lib/site-packages/aiogram/handlers/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/handlers/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 829da162a2147f825b78161c297f81ee2e70a53c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1030 zcmZuvPjAyO9CgyPX`4S=yN(Ia1lJ;<+$I46iGTzWMS~rXtVmXxm^P}NWKN3MjWb_> z10MkK1^5&ka*TZC#BI`UJ7K#SUBr^7r}wk1pP!%o-EsOrd_TYa`f$4iz;9Vxe0nX; zz6kLZL?F@#pc>Su4s}h|I%!b@8cMfFn|5GFX@i)w3%g3UNssnnU+E69s10qUP2x}& zx^xR}sk%$H=>QIt?vWwgfjdg~$%yX4U7;;_EwYcm*!iOgLt~v=&w?Dk43dao#F3C^d_ANuc8w)DL;5=r^X6$^@#p;=n^IQi(mj%R)z7x-Q# z-h;TK+z;Y(&H_4FtY1(*LE=bpfzbWz79yb2X~ zP&QG4J7p6UcvLn~fm>x06}VeAQGuuBRj9yz*+c~n$|nAIb!s@4{@Ij2yD1L!7l)-X Ai2wiq diff --git a/env/Lib/site-packages/aiogram/handlers/__pycache__/base.cpython-311.pyc b/env/Lib/site-packages/aiogram/handlers/__pycache__/base.cpython-311.pyc deleted file mode 100644 index f4e3835b75aa8964d33f9ed15c8adf05ddbfe3b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2918 zcmb7GU1%It6ux)t?m zlco?g52+OGLnT2A<|!HiA|m?glTSWuBw!dQ1VqrcE$LIAJm=14e@uMv&Yd&oo^y8Q z-0%F{{W=l}5*R;z`Rl}xLdYMu*d3bB(4Aj^St1s(Xr2^khEn9Eyi|}gazV)`VlC&@ zf|k(=flQ#FXY@i#rlka98cxgk1~R1zB689g|mKKkIN;E!(Zo2uXzh#$|$f zA=9>tuIc8Awv&)N`St#k7d6Knmz!C)z}zcEE1`Lj(aUe0HBxV$O`RJ`4}z6F<0%8V ztm_2^nay}E>jg$j$yf6?{mXtwHtcvM}dJ11bdL>S3X zi)5rrgvmT?QKneZ8PHfVaEjp65daHZ*Syw#(_wF#wv}gmICnE=^B9FvIYIhEXV5r9ARs!?;#5^S*{-ti70FG@xP_Yh(w+ za>0Mae;x3LZOR5N4ZU*L&$UFYHf4Z2|w)O?yCd0R@Yi`LqCAutk-@w zLfn?!-#`&5&0Xaqno!dmjd=u!Cqn|y9)lu{=WNF{?JSE!Pk>03Yzstj_X-5BXuIsD z3uP3jCN;-xaYT><_{0leEZJ_Zz|L}BW2BSuHLX(iDx zy|CzGhQCTE0$q-q5ny}rBy-oOfY-qt_-V=$z|OWe0_(p30e4;kGEe@Db$tHD^1y?k zuZF)E{-*c4fggr`8vcIx=j6ue3!A4eY;;}R?7FxS8`+GFl=Tq-ViSJ&wU04v@vJ;Y zD5fsd6Mqht{2&r+<_%7HnqS$?e)%%=*TKa33oeX%cv0E=Neqh!SsEB9ZL$K-y`#B< ztuzF-Zrf~AbsO?D2_{|(wEP<;R{6j8z!AII1C7AeZ2LgvbOC|dk9B-@>yuk|Zr{EA zd+hjcvEv)D-pyEVS??8_N++~>U*nkXqN(v`kvjqe91%Pg%r1{H-{r9hBtje;4L^Y7 zDIi|JFsx!0oIZ*xeVP}i8Fyzym5Get*lNTU#XkHfi30TE~zgf*GP1tMJtl34$umz(?>Fh7v8NZqQZu%qhM2~H5(z)h}Kz=s2V{NpP)hK z!Uw)oqiOjozwnNu7DFS>CI9pm*omyK;rT>A?~@8{EeMSE9cI!56(XEh^P1@P;5m(zvPz!)mBqq^|e5^_0-q=a$wj- zVA^I-u`5B^cF9w0m1|y!>z$IP?rBdT`mC5|m(!TR%_$wgX=iYi z99Nye>1S{YUKywx$;BB)Ia9W&5K^VkzS!Y{)2^g#(1E%>lah8KLET&j`V9&}cQS>f zRZVAo@PGw9pEuJEE@N5LjXb{5_9J(<*`&Qeyc2~P7~|MFA_^$$M%#h~)?`824SJD? z>AWgur(0H@JX?*@_e9i>xv(asI%%ovjiM+7W{kE5Iq~&*c^Xq5leL)~gf8`XCuhDc zx!-BfjT`i4IA{W0E6tLW1&{k8bV1Idp|8Sw{2G{j@-4YngzgnM*c)Z|R#ED0Ntxee znf7=2eICXZ>gDv|blojrjZ&hg!K6||pDKxl)k$2NzPR&#v-MRZc3Yc~*A2H@yM4jp zNI2~%Zt?Jb>*H>_CA%@-=)oz6lPp{LmRy@`$+cNQt=>SKhoy%r^R$~*xeOSIz(-_U zB}*3{4-e0;jm))U7$PqzP^L0&$~=LB>@J>^N1TIXiIGRd67(`%#4F&6SHTQlpUWek zvWhcKvA8lauZRl}cu5v-7W+4kg~wucmV$=Er|VB@#nxbWSf9&e2J;5;K~aibdHnsz zTuJGC(pXGP#|c@$9Ve+eP7ry0AN@rKE)(FB`qZ2N*9-9K!Gqt_pB^G=b!tvPPmE@jW4$Pm%G$2L3!RkX zK@aX!$~jp&{Zl4%#MCCkfaOx)f4xi|q@L-Ps(}Y>s?ZDb-Aw!&;wl92D$5_hj8#QZ zj>v`4>~lmek7l30$ogpZIU=8p{_h!=*A(D=)*M{_<>BGwcYc@8G5GHsL|XfQWYzY! diff --git a/env/Lib/site-packages/aiogram/handlers/__pycache__/chat_member.cpython-311.pyc b/env/Lib/site-packages/aiogram/handlers/__pycache__/chat_member.cpython-311.pyc deleted file mode 100644 index 809e5134b14e3e51b5919c15b9955bcb76d9f5ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 985 zcmZuvy=xRf6o0c{w%=KEDOWj&fMja-P?0!FOZ;+ zBBgx-_7O=h{t*^eqzGFDtn4nFRVv@??p+M#?d+T1y!UwT_ukCcYIOoozJK}ITqFR$ z^kF1U35Kf(_J9K?5yZqNL}Mc|V$(NsY(`dW`*!U34gmvR0=IU7+rkv~%~3WG=~!ku?etNhl-8p+IOi%YmoE;1!vu?~-ftQpz0r8Snm5phGvl`dzg;F-0egbd3p z`DT`fVI9F92=EC9-{8bIg~bhFHw|v?S_kMoEJFc&hg(?R{4R4{^gO9L2cCC-&kOf)BUhO5aqvEo8^Kb-+nrXh(UUAqByA*VAUd1D>vkhh?Nr?D zvT%d7gbG+YX-O6@tQGTA3%Und^ic0^$tldcefxaGW&iat10A5MsCM9FX7=;;(ac=m zog1P7mTQ&FrL@ChL1{KYX`Jw0r12D`A9^e*JrzoM5~A7d%A_k~x+V3?%4>fEIivBk zR_;hu5U3ZZcE;bpFl=`KTDjm%4-8_@?>`s-Zs+RMMAzcO_Ax zpk!A8*vB_-X35nSp;r1MrZtktPv+)vD9<^ZK6e7wqpT(+*XLJ5PJ(hGrk7P2pg-p9G)#mG)AMC1$C_Vpb1}y=-oiG z1MgvN0Id!37GaMpU`|7j*~?*M(O}bh)m*lCGop7}PJP{3q1~KBp5Ji)1gcSA<`O@N#Np1VXoS=b zU649-KnfB|r$W`8zk(q{2jr;|VqkL>rcS)G9j8&@Y=8HjzjuD$dw2daK0X3CzJ2~) zeoX*=N~brp*yygH(FPlA;y{fQ36ZwqC^faH5>Vhd*y+=@fPNsXQEDjIEIP$V`K6`K?>jjgbBS;4fa zBV_$k4h zvXIO37pu<}jF&FoG?rYuTCW(JO>TNFrzO`jSbfWQQ7svw>ap2|X>FPnCJeLcR=8Q4 z>xrKWizzg={R#HYVhykA*27$_+m{OYcW zUM`DO|H@uJc=&PQ!_NLrCo{z-ky+C-d`y0LgwmR8Hyv!ZKSt@>rs+h@_lGF8T}$pq zgS!pJy=|Vu6kQs!Fxwft18tO`!mDub=+pLTPX9W8F3CUt IhzM2u1;rf{Z4gl4B~Wb(sLoWTPxe;> zMs_uTeY~?~7pSoa<-%V%Et5ojK0Aj)an=*;l^0T<@v@Q>Ux$7@WD8BkTZ#5gFka1{ zPX{%h^xj~y4Ge5T!B!}-Ri;se={1F_TiPz7`#BZBHd3sBn05g(sgA0QucXrTZE>-t#V%UZaSRFvC1KuL+ zk$H5lvvn56$xw|)f!jp$dnC~W^J_vd^}Kf|(Z!-WwXJf2IFyy%j2K!Mxu(CrxNxcT{P2V zN?e8l-onSQIk>utqMKci!31Nps}TL}&f_lNa2k$PgtnGauxsQr>#L9q>olC9ovCI* z0lW}Rrep4bsp3J diff --git a/env/Lib/site-packages/aiogram/handlers/__pycache__/message.cpython-311.pyc b/env/Lib/site-packages/aiogram/handlers/__pycache__/message.cpython-311.pyc deleted file mode 100644 index cea51412d43cf4b50b02f2cb5aac6a075335c285..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2004 zcmbVN&2Jk;6rb5IufO7e8!td)=|IB|27o_gZF-St<7D-$lhbofUe8k^kgtfP>=7%)RF+#D>_`|rk_b70CvN&o#8iQq zX6bR}kqA6^5?;Z|Y!EH`FAg;tieKJb(}YmH+wvQ3)3igWW_mt2@@uZ+m`&?$b&J(} zpk!~F9{U<*Y{tXcvB90j4~?cKhSJ&t(+^X3nCF?BER??S7_TMUMn40wXWznbpD?0R zi|B$yb&*Myz+|S30;~&`xF;O}^JKV&o{D%X_@pUc+L9qKC7ekFBvLzCrUVW3mTI=? zd8N9`OHM4Z^dOGMi#VaencwEk8XfLP2-E?x>0BQOy`Cs9w|4p4ux4jrGTicT>lyHRd4PxHMWOhp(=A*L)T?JO zLH&%Y>?7 zG);#YMwl@S$F43*h1KuP+F)+9wDqQD*uAl|MN6?C{o;)jk1p1g9dn_wGf6zLHQcKemu@c?4s$ zvDsJ*N;tn3J_XOH7MN&JCNX)U4uq*(S1b{7T?#Kw9(Gc)Q9*M2{u3WshKVSX??qc$ zbUc@L2rv2QO`4C#o3wGBMMu((;2u1ICvF>X*MTTuJxtZ&s{`)@%k)i-J9E4wr&8t$ zOm?okIf`O9+^daoUv7LYRlgTLl=UO;67E1yR0muyDBCUHqs| zz#hRc2_|OarE$S^Z8j9mYK`Mrhl;=3f_orVgQpZ0l7cVS8@A857ikRV2D5`}pj?If zjHloYuHtL?0Ra|dUR(_L|0*t!s0vCroQ(68x)RshD%Ze^ca--xKwqSk_DC_9>^-s+ zoY!9vEtu>*@%FGq~`WC~|L4Z+gK&#rZs OZk(d;iNikt diff --git a/env/Lib/site-packages/aiogram/handlers/__pycache__/poll.cpython-311.pyc b/env/Lib/site-packages/aiogram/handlers/__pycache__/poll.cpython-311.pyc deleted file mode 100644 index dc9831261d69762bd3402874adfa6cf0c13cc79d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1235 zcmbVL&r2IY6n?Y6ji$CL6x&OTP@0zNy_7<=&=$lNgtjb!Wz9@%bT=DkHiDrC4<4oT zW}ugzEaJU?MGrZ6kUa@K^%hA_p8DSAhY5P>?94ZB-uw3L_hx2)WV0E-_Ve4X@&N<* zO^bfBdPaw%aR?kZ3m{}JV`OWA7V55^+InDwrfa6Q5m=$^+M(k*3^aHJ+}sCl2~*g! z{mdZPkpXamqubmuZm&VX`9sSBOY|2@%QzV;6&2$=zT_+M+OP6J$byy_@1h_`GK6ny zaV4sjdTG+BpS1HHmxmz0WgJ|MGglV|*MwQtxV~>3Vf1A1o@=EsTR2xDk!M`vjd2r& zTFE$ly(g*hAd|yJB6Fp{S1MPIWUhvU+^4Q+l@bz5inuPTCEV#jBU{JOxrcBFpJ8(l z+8prK;Fzsq<)+vX)i`ms>q1fC$GAsI1Z73c+~u2>Pm3QSxm8?_c%`~g+^S1Ij-eZfCpEvcH?tT~1bc8k zIepMLoy@nKd2Hp1TEX=|G4w1L0@>sDK1=6rL$4LDuFg^r>9k7=-N^=SF#Omp*e zwm`J}6%28Qyj?YKu9~dwaKu8=y6xRYR)EzzLdSHa6V}_Pv5zyczFyjE2$#rht$#(-zjtqcf z{Kw`Ln6(bo!Y{R~l0;u#S;gt*iYNIiugwB3s#-GhM)1{b?zf_D{I<(QFEQRpF8pkh zbkeiMsD`8u92~;H(HL=bZZM6Tb&cr<#t}x3vs3`bVg{BsliPn+$cpdPiWM{^r{V{m zl$ClUDjmV+{Y+0~dn{9?iHRk6+!bvf`#3ShmAuhigg$(Lok?hCl7}+L8lKhUySyDI zH|in^X%|n4?Jy({>QbdvE;gPoxf_vaxvLRtwi|A%E4(-obSsKo-rjXzH@95bjQM=W z^IKknOV?{g4dI0gxzGiaPjmV7z3OMJ(-Tv;{oeim^r1G9qtavvVIR)Qv!C`(%5wvI zZiEh4s}>TQ(zX|JN|Pd`VZ^$D;!_msctI8^P|6}7-F8Pr9WLUYP|qw?@D)T^@o5Ei z4h1Cg1;YO18)}+q4?%$q*7Q&#=7Yn>L%``0&UFkOY^K3W@3?~6e64CHy0_&Ebv?;U z)~Q`gh;ITN}$?mhE-n+bXyM$+aRF8YoOW@P@SnvzguJjMou(< zQ~bwbm#EQzTIr8G)<~+pSX;;K=9(wi8!x0j<25C%G~snOHkxiXsb54bGA-51Tl{iAXHjjqai9!vXA0T)UGvWI;BtPo3?tFiCH; zcoeu@Y!XMI3Ffzi47IKrFISxp5$`zb5yfdZoi6v1h`U=+;;?YfdE4G{L_1+ivDfT) z+e|oKJKE-6uv`#bE*fyN2I_H-&tdBQ2eU>{pYV_|qJruWE~*Qk_s^<}19NeN2H2>T zQqy%qFJP{lmR&c9XxEo`&c!00pL None: - self.event: T = event - self.data: Dict[str, Any] = kwargs - - @property - def bot(self) -> Bot: - from aiogram import Bot - - if "bot" in self.data: - return cast(Bot, self.data["bot"]) - raise RuntimeError("Bot instance not found in the context") - - @property - def update(self) -> Update: - return cast(Update, self.data.get("update", self.data.get("event_update"))) - - @abstractmethod - async def handle(self) -> Any: # pragma: no cover - pass - - def __await__(self) -> Any: - return self.handle().__await__() diff --git a/env/Lib/site-packages/aiogram/handlers/callback_query.py b/env/Lib/site-packages/aiogram/handlers/callback_query.py deleted file mode 100644 index 342b11b..0000000 --- a/env/Lib/site-packages/aiogram/handlers/callback_query.py +++ /dev/null @@ -1,43 +0,0 @@ -from abc import ABC -from typing import Optional - -from aiogram.handlers import BaseHandler -from aiogram.types import CallbackQuery, MaybeInaccessibleMessage, Message, User - - -class CallbackQueryHandler(BaseHandler[CallbackQuery], ABC): - """ - There is base class for callback query handlers. - - Example: - .. code-block:: python - - from aiogram.handlers import CallbackQueryHandler - - ... - - @router.callback_query() - class MyHandler(CallbackQueryHandler): - async def handle(self) -> Any: ... - """ - - @property - def from_user(self) -> User: - """ - Is alias for `event.from_user` - """ - return self.event.from_user - - @property - def message(self) -> Optional[MaybeInaccessibleMessage]: - """ - Is alias for `event.message` - """ - return self.event.message - - @property - def callback_data(self) -> Optional[str]: - """ - Is alias for `event.data` - """ - return self.event.data diff --git a/env/Lib/site-packages/aiogram/handlers/chat_member.py b/env/Lib/site-packages/aiogram/handlers/chat_member.py deleted file mode 100644 index bf668ac..0000000 --- a/env/Lib/site-packages/aiogram/handlers/chat_member.py +++ /dev/null @@ -1,14 +0,0 @@ -from abc import ABC - -from aiogram.handlers import BaseHandler -from aiogram.types import ChatMemberUpdated, User - - -class ChatMemberHandler(BaseHandler[ChatMemberUpdated], ABC): - """ - Base class for chat member updated events - """ - - @property - def from_user(self) -> User: - return self.event.from_user diff --git a/env/Lib/site-packages/aiogram/handlers/chosen_inline_result.py b/env/Lib/site-packages/aiogram/handlers/chosen_inline_result.py deleted file mode 100644 index d6b66c5..0000000 --- a/env/Lib/site-packages/aiogram/handlers/chosen_inline_result.py +++ /dev/null @@ -1,18 +0,0 @@ -from abc import ABC - -from aiogram.handlers import BaseHandler -from aiogram.types import ChosenInlineResult, User - - -class ChosenInlineResultHandler(BaseHandler[ChosenInlineResult], ABC): - """ - Base class for chosen inline result handlers - """ - - @property - def from_user(self) -> User: - return self.event.from_user - - @property - def query(self) -> str: - return self.event.query diff --git a/env/Lib/site-packages/aiogram/handlers/error.py b/env/Lib/site-packages/aiogram/handlers/error.py deleted file mode 100644 index 51ccf07..0000000 --- a/env/Lib/site-packages/aiogram/handlers/error.py +++ /dev/null @@ -1,17 +0,0 @@ -from abc import ABC - -from aiogram.handlers.base import BaseHandler - - -class ErrorHandler(BaseHandler[Exception], ABC): - """ - Base class for errors handlers - """ - - @property - def exception_name(self) -> str: - return self.event.__class__.__name__ - - @property - def exception_message(self) -> str: - return str(self.event) diff --git a/env/Lib/site-packages/aiogram/handlers/inline_query.py b/env/Lib/site-packages/aiogram/handlers/inline_query.py deleted file mode 100644 index 022d8f2..0000000 --- a/env/Lib/site-packages/aiogram/handlers/inline_query.py +++ /dev/null @@ -1,18 +0,0 @@ -from abc import ABC - -from aiogram.handlers import BaseHandler -from aiogram.types import InlineQuery, User - - -class InlineQueryHandler(BaseHandler[InlineQuery], ABC): - """ - Base class for inline query handlers - """ - - @property - def from_user(self) -> User: - return self.event.from_user - - @property - def query(self) -> str: - return self.event.query diff --git a/env/Lib/site-packages/aiogram/handlers/message.py b/env/Lib/site-packages/aiogram/handlers/message.py deleted file mode 100644 index 4fbecec..0000000 --- a/env/Lib/site-packages/aiogram/handlers/message.py +++ /dev/null @@ -1,28 +0,0 @@ -from abc import ABC -from typing import Optional, cast - -from aiogram.filters import CommandObject -from aiogram.handlers.base import BaseHandler, BaseHandlerMixin -from aiogram.types import Chat, Message, User - - -class MessageHandler(BaseHandler[Message], ABC): - """ - Base class for message handlers - """ - - @property - def from_user(self) -> Optional[User]: - return self.event.from_user - - @property - def chat(self) -> Chat: - return self.event.chat - - -class MessageHandlerCommandMixin(BaseHandlerMixin[Message]): - @property - def command(self) -> Optional[CommandObject]: - if "command" in self.data: - return cast(CommandObject, self.data["command"]) - return None diff --git a/env/Lib/site-packages/aiogram/handlers/poll.py b/env/Lib/site-packages/aiogram/handlers/poll.py deleted file mode 100644 index 2183d84..0000000 --- a/env/Lib/site-packages/aiogram/handlers/poll.py +++ /dev/null @@ -1,19 +0,0 @@ -from abc import ABC -from typing import List - -from aiogram.handlers import BaseHandler -from aiogram.types import Poll, PollOption - - -class PollHandler(BaseHandler[Poll], ABC): - """ - Base class for poll handlers - """ - - @property - def question(self) -> str: - return self.event.question - - @property - def options(self) -> List[PollOption]: - return self.event.options diff --git a/env/Lib/site-packages/aiogram/handlers/pre_checkout_query.py b/env/Lib/site-packages/aiogram/handlers/pre_checkout_query.py deleted file mode 100644 index 34290f2..0000000 --- a/env/Lib/site-packages/aiogram/handlers/pre_checkout_query.py +++ /dev/null @@ -1,14 +0,0 @@ -from abc import ABC - -from aiogram.handlers import BaseHandler -from aiogram.types import PreCheckoutQuery, User - - -class PreCheckoutQueryHandler(BaseHandler[PreCheckoutQuery], ABC): - """ - Base class for pre-checkout handlers - """ - - @property - def from_user(self) -> User: - return self.event.from_user diff --git a/env/Lib/site-packages/aiogram/handlers/shipping_query.py b/env/Lib/site-packages/aiogram/handlers/shipping_query.py deleted file mode 100644 index 64a5645..0000000 --- a/env/Lib/site-packages/aiogram/handlers/shipping_query.py +++ /dev/null @@ -1,14 +0,0 @@ -from abc import ABC - -from aiogram.handlers import BaseHandler -from aiogram.types import ShippingQuery, User - - -class ShippingQueryHandler(BaseHandler[ShippingQuery], ABC): - """ - Base class for shipping query handlers - """ - - @property - def from_user(self) -> User: - return self.event.from_user diff --git a/env/Lib/site-packages/aiogram/loggers.py b/env/Lib/site-packages/aiogram/loggers.py deleted file mode 100644 index 942c124..0000000 --- a/env/Lib/site-packages/aiogram/loggers.py +++ /dev/null @@ -1,7 +0,0 @@ -import logging - -dispatcher = logging.getLogger("aiogram.dispatcher") -event = logging.getLogger("aiogram.event") -middlewares = logging.getLogger("aiogram.middlewares") -webhook = logging.getLogger("aiogram.webhook") -scene = logging.getLogger("aiogram.scene") diff --git a/env/Lib/site-packages/aiogram/methods/__init__.py b/env/Lib/site-packages/aiogram/methods/__init__.py deleted file mode 100644 index 66214ac..0000000 --- a/env/Lib/site-packages/aiogram/methods/__init__.py +++ /dev/null @@ -1,259 +0,0 @@ -from .add_sticker_to_set import AddStickerToSet -from .answer_callback_query import AnswerCallbackQuery -from .answer_inline_query import AnswerInlineQuery -from .answer_pre_checkout_query import AnswerPreCheckoutQuery -from .answer_shipping_query import AnswerShippingQuery -from .answer_web_app_query import AnswerWebAppQuery -from .approve_chat_join_request import ApproveChatJoinRequest -from .ban_chat_member import BanChatMember -from .ban_chat_sender_chat import BanChatSenderChat -from .base import Request, Response, TelegramMethod -from .close import Close -from .close_forum_topic import CloseForumTopic -from .close_general_forum_topic import CloseGeneralForumTopic -from .copy_message import CopyMessage -from .copy_messages import CopyMessages -from .create_chat_invite_link import CreateChatInviteLink -from .create_chat_subscription_invite_link import CreateChatSubscriptionInviteLink -from .create_forum_topic import CreateForumTopic -from .create_invoice_link import CreateInvoiceLink -from .create_new_sticker_set import CreateNewStickerSet -from .decline_chat_join_request import DeclineChatJoinRequest -from .delete_chat_photo import DeleteChatPhoto -from .delete_chat_sticker_set import DeleteChatStickerSet -from .delete_forum_topic import DeleteForumTopic -from .delete_message import DeleteMessage -from .delete_messages import DeleteMessages -from .delete_my_commands import DeleteMyCommands -from .delete_sticker_from_set import DeleteStickerFromSet -from .delete_sticker_set import DeleteStickerSet -from .delete_webhook import DeleteWebhook -from .edit_chat_invite_link import EditChatInviteLink -from .edit_chat_subscription_invite_link import EditChatSubscriptionInviteLink -from .edit_forum_topic import EditForumTopic -from .edit_general_forum_topic import EditGeneralForumTopic -from .edit_message_caption import EditMessageCaption -from .edit_message_live_location import EditMessageLiveLocation -from .edit_message_media import EditMessageMedia -from .edit_message_reply_markup import EditMessageReplyMarkup -from .edit_message_text import EditMessageText -from .export_chat_invite_link import ExportChatInviteLink -from .forward_message import ForwardMessage -from .forward_messages import ForwardMessages -from .get_business_connection import GetBusinessConnection -from .get_chat import GetChat -from .get_chat_administrators import GetChatAdministrators -from .get_chat_member import GetChatMember -from .get_chat_member_count import GetChatMemberCount -from .get_chat_menu_button import GetChatMenuButton -from .get_custom_emoji_stickers import GetCustomEmojiStickers -from .get_file import GetFile -from .get_forum_topic_icon_stickers import GetForumTopicIconStickers -from .get_game_high_scores import GetGameHighScores -from .get_me import GetMe -from .get_my_commands import GetMyCommands -from .get_my_default_administrator_rights import GetMyDefaultAdministratorRights -from .get_my_description import GetMyDescription -from .get_my_name import GetMyName -from .get_my_short_description import GetMyShortDescription -from .get_star_transactions import GetStarTransactions -from .get_sticker_set import GetStickerSet -from .get_updates import GetUpdates -from .get_user_chat_boosts import GetUserChatBoosts -from .get_user_profile_photos import GetUserProfilePhotos -from .get_webhook_info import GetWebhookInfo -from .hide_general_forum_topic import HideGeneralForumTopic -from .leave_chat import LeaveChat -from .log_out import LogOut -from .pin_chat_message import PinChatMessage -from .promote_chat_member import PromoteChatMember -from .refund_star_payment import RefundStarPayment -from .reopen_forum_topic import ReopenForumTopic -from .reopen_general_forum_topic import ReopenGeneralForumTopic -from .replace_sticker_in_set import ReplaceStickerInSet -from .restrict_chat_member import RestrictChatMember -from .revoke_chat_invite_link import RevokeChatInviteLink -from .send_animation import SendAnimation -from .send_audio import SendAudio -from .send_chat_action import SendChatAction -from .send_contact import SendContact -from .send_dice import SendDice -from .send_document import SendDocument -from .send_game import SendGame -from .send_invoice import SendInvoice -from .send_location import SendLocation -from .send_media_group import SendMediaGroup -from .send_message import SendMessage -from .send_paid_media import SendPaidMedia -from .send_photo import SendPhoto -from .send_poll import SendPoll -from .send_sticker import SendSticker -from .send_venue import SendVenue -from .send_video import SendVideo -from .send_video_note import SendVideoNote -from .send_voice import SendVoice -from .set_chat_administrator_custom_title import SetChatAdministratorCustomTitle -from .set_chat_description import SetChatDescription -from .set_chat_menu_button import SetChatMenuButton -from .set_chat_permissions import SetChatPermissions -from .set_chat_photo import SetChatPhoto -from .set_chat_sticker_set import SetChatStickerSet -from .set_chat_title import SetChatTitle -from .set_custom_emoji_sticker_set_thumbnail import SetCustomEmojiStickerSetThumbnail -from .set_game_score import SetGameScore -from .set_message_reaction import SetMessageReaction -from .set_my_commands import SetMyCommands -from .set_my_default_administrator_rights import SetMyDefaultAdministratorRights -from .set_my_description import SetMyDescription -from .set_my_name import SetMyName -from .set_my_short_description import SetMyShortDescription -from .set_passport_data_errors import SetPassportDataErrors -from .set_sticker_emoji_list import SetStickerEmojiList -from .set_sticker_keywords import SetStickerKeywords -from .set_sticker_mask_position import SetStickerMaskPosition -from .set_sticker_position_in_set import SetStickerPositionInSet -from .set_sticker_set_thumbnail import SetStickerSetThumbnail -from .set_sticker_set_title import SetStickerSetTitle -from .set_webhook import SetWebhook -from .stop_message_live_location import StopMessageLiveLocation -from .stop_poll import StopPoll -from .unban_chat_member import UnbanChatMember -from .unban_chat_sender_chat import UnbanChatSenderChat -from .unhide_general_forum_topic import UnhideGeneralForumTopic -from .unpin_all_chat_messages import UnpinAllChatMessages -from .unpin_all_forum_topic_messages import UnpinAllForumTopicMessages -from .unpin_all_general_forum_topic_messages import UnpinAllGeneralForumTopicMessages -from .unpin_chat_message import UnpinChatMessage -from .upload_sticker_file import UploadStickerFile - -__all__ = ( - "AddStickerToSet", - "AnswerCallbackQuery", - "AnswerInlineQuery", - "AnswerPreCheckoutQuery", - "AnswerShippingQuery", - "AnswerWebAppQuery", - "ApproveChatJoinRequest", - "BanChatMember", - "BanChatSenderChat", - "Close", - "CloseForumTopic", - "CloseGeneralForumTopic", - "CopyMessage", - "CopyMessages", - "CreateChatInviteLink", - "CreateChatSubscriptionInviteLink", - "CreateForumTopic", - "CreateInvoiceLink", - "CreateNewStickerSet", - "DeclineChatJoinRequest", - "DeleteChatPhoto", - "DeleteChatStickerSet", - "DeleteForumTopic", - "DeleteMessage", - "DeleteMessages", - "DeleteMyCommands", - "DeleteStickerFromSet", - "DeleteStickerSet", - "DeleteWebhook", - "EditChatInviteLink", - "EditChatSubscriptionInviteLink", - "EditForumTopic", - "EditGeneralForumTopic", - "EditMessageCaption", - "EditMessageLiveLocation", - "EditMessageMedia", - "EditMessageReplyMarkup", - "EditMessageText", - "ExportChatInviteLink", - "ForwardMessage", - "ForwardMessages", - "GetBusinessConnection", - "GetChat", - "GetChatAdministrators", - "GetChatMember", - "GetChatMemberCount", - "GetChatMenuButton", - "GetCustomEmojiStickers", - "GetFile", - "GetForumTopicIconStickers", - "GetGameHighScores", - "GetMe", - "GetMyCommands", - "GetMyDefaultAdministratorRights", - "GetMyDescription", - "GetMyName", - "GetMyShortDescription", - "GetStarTransactions", - "GetStickerSet", - "GetUpdates", - "GetUserChatBoosts", - "GetUserProfilePhotos", - "GetWebhookInfo", - "HideGeneralForumTopic", - "LeaveChat", - "LogOut", - "PinChatMessage", - "PromoteChatMember", - "RefundStarPayment", - "ReopenForumTopic", - "ReopenGeneralForumTopic", - "ReplaceStickerInSet", - "Request", - "Response", - "RestrictChatMember", - "RevokeChatInviteLink", - "SendAnimation", - "SendAudio", - "SendChatAction", - "SendContact", - "SendDice", - "SendDocument", - "SendGame", - "SendInvoice", - "SendLocation", - "SendMediaGroup", - "SendMessage", - "SendPaidMedia", - "SendPhoto", - "SendPoll", - "SendSticker", - "SendVenue", - "SendVideo", - "SendVideoNote", - "SendVoice", - "SetChatAdministratorCustomTitle", - "SetChatDescription", - "SetChatMenuButton", - "SetChatPermissions", - "SetChatPhoto", - "SetChatStickerSet", - "SetChatTitle", - "SetCustomEmojiStickerSetThumbnail", - "SetGameScore", - "SetMessageReaction", - "SetMyCommands", - "SetMyDefaultAdministratorRights", - "SetMyDescription", - "SetMyName", - "SetMyShortDescription", - "SetPassportDataErrors", - "SetStickerEmojiList", - "SetStickerKeywords", - "SetStickerMaskPosition", - "SetStickerPositionInSet", - "SetStickerSetThumbnail", - "SetStickerSetTitle", - "SetWebhook", - "StopMessageLiveLocation", - "StopPoll", - "TelegramMethod", - "UnbanChatMember", - "UnbanChatSenderChat", - "UnhideGeneralForumTopic", - "UnpinAllChatMessages", - "UnpinAllForumTopicMessages", - "UnpinAllGeneralForumTopicMessages", - "UnpinChatMessage", - "UploadStickerFile", -) diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 82ae6e785f131df6d813dd1076827f71d1c97638..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10593 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 Vys+rlf`$cG>z}~?!D5Vx{tp1D_RjzS diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/add_sticker_to_set.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/add_sticker_to_set.cpython-311.pyc deleted file mode 100644 index b8758a7bebde0ae20951951776c243034ae301d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1790 zcmbVM&2Jnv6t`z)KeL++r7cM*$N_=0mDrSsQ&b^Jh(bgf5J{;REpcbZPBP8xc(FY# zK{;%tN)!nY7w7>Fl|V(%3n$L}0UT1Pht-@S^_1J9a6morJhR&-pn+%hXIqk4JIh;^Kdcu^#@rvnkG zx|LK{K74PE&b~c2`_97Bd}5!Ew)U*dva%3$V!f;bf0N5SoGC|Fc*xhK*S^5@hG4$& zI$VP{@%}1kK7*_{axp`$brG_2ZSJ@^X1RH0^8$0uflUeW0X{$A3&0mMo)=}Ajow6S zm{o67+|o_-33kiNX!yTgOKRsC8w9r^mbvyS5Mr6Yx~MqO8-XJ2G)AHY@faf>iTE|5 zvV2k{QCt&Wa!+$cT3c|5la|m8GS?PYf=8xcrHJoEWW&44N!&4ar_Y`po~s6V7jDX- zY`p%<{?+M&_V05Y%Se$KUobv%c}2$jG7%9`vF~%G8s#*PWf4oC&yWqRJ8EWX$`_J1 z^Z@^ckn2+rteWyV!HbaJATcfA`Sf~H1MNYC5<7@=Qiv6oG+>FXv`n1HYjatEVkCuu zhh&l-ftJ$F7V{!Nj&5G_ybr5)t=JgP3Ky!1x|Q0-J4T!hs&f$ zX%GdP(t18Qb|6@)c(_LCk(=@uTu(}r`k|*3rOM2r=^N60_`zE<%}YXVHfIG3qV?ux zEIlnG1)!Tey4qX}T1^#b{z}L5H@$VPnqDBxI80@|2GwAU4uGUuKm@wc*^=Y%#HZs& zU~LS;ejZNMG?2f$s6URX&wV-f`TQ62_baD&Dyz3I{rcMP&j4fg;zt7}6DzCxa0{k8 zOR)-khEUCL2Bx&MX~t>IypP6m6!(jj5>WKNXesrO`8h!4>0$6ofGeQ67Q=u8n$k=|lGj@u z04zfz9i1F#xXR|vX?ZY_CTlr4bR$n1F7;}_d00G`)#r7221J9J`W8sv#u)d|3p%~0}?6{y&$0i>YcxWLn8HH?I{wc-du$P%856-w$q4INQ`Hn=e;-Y&70qQ zGrPa!a#;lJ_aFbL+!#XWPtEjOG8!1W77XqqhM3`^x?vfH9>?5RJ#NM8re)R>Rsv*k zX1d9G%1Rk1hL#XZ+(j(OQ#?J<_lO?G5qbnq)T|6kT|#k9|_FbGE;&|JN8)<8H>`XtxyLXKjil!7o+bVaOdT%u1cfWYuj5t6a~+T48gH%nR4|Fp zRF!JTg;L4(1uv=|a7ACNm)3kGOBGI4Q*b#GS)LwPo?RtHyj%+}pmoL;(k}549@Rxkk4V$^l5g5HbkcYxF?jqAp?6+HAv-ytgWCX)rNluqJ`l zcpr+;p}S>wn4?Z z6#8Nal2I)MX4&_+t*;Z^v?>D+T!zN(B^Z2f+=uH-_4Ocm2+t#UqW0-P!(yApW^6OQ zX>KN%@gT98{Mq<6ye#38i6JyFIo|q8ttqJT!x~!Q-tCpk&f1D} z6hGa7YlyCMxk4RZU#q3)?vbS^-Q-|yi;b2z0qcBz@(|pM{hiFf40#2}-)+=AiE>ll zT>NV3>!ruTC%Y(>%Xdz_-Wi|hoS5s39S7PS0$Hf&4x`c8Zf?Np$&o^jcEKSkOO0_dOS>^imBVv zqzGZY4PsMQY>BOdW#8P5l1iUYcvaw`I;necPPt#!#Xh>r70w7q`r*sBfE7T5KmfcvjDzjrz7Z ztHoc$c2Z+qG?B=|+A}YA3a7zo=au>H$an^F_Wwvmy9<2|hu07EebCtjhdL%Bm`1_l|=3|xO?d{QO?hbd0;i_vJIpgHw>eL qPHi3RJE*kv{Jw+m*1_IQzGlE){!M-;{yO$}viMZ1{yIb-M)(f^th|%} diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/answer_inline_query.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/answer_inline_query.cpython-311.pyc deleted file mode 100644 index f1152a379ad515e9466ec3d456bf64e1892cfa5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4142 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 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/ban_chat_sender_chat.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/ban_chat_sender_chat.cpython-311.pyc deleted file mode 100644 index 63700c646fc7a31c042f49ee7ea147b70842ccde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1945 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 T#y4mFJogAG9zTPO+xve27E35N diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/close.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/close.cpython-311.pyc deleted file mode 100644 index c15575aef187231801d66877d4fe5d1a05f75414..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1066 zcmZuw&ubGw6rRa%VpCMep`!3mL2@ur>BS&kDvDqO+KLzg)5*>xS+YBm&dj!W>%oKn zK?Tn$;@!W(Lk}KGPJ*Z2BK6dhZ+4SP)!E(0n>X)$?|bjo`9q6)a4TM2FyT8L9ra2f*dfkp{^?I2XvaTVZ34z!UF>zz;y zA#^Y>ItHyIL^|LRSZQ{o@ck}} zOJN70u?}wEf;d!(lXebwTE0C^*Mw&&hJ|*Zg=}wannZ442f!vlAg%Qd+ewHNKxvq8 zoE4UAY_poSdP65BkZl+_H?i$jE5LR(-F&D`ZH6uEw{7uBcr6`48Z<4YdZ$sIRv1%= z$k?>XSgb`7d3}ko?Sx13lQLsM2WT$zwT`AW#TOXtpqzO2WV@um0k7xnd(VD;@BQAh zf2`N52*%If{@VMcfY5JR7>{DkSVtZ(_Yp!{YL*1wt zm%NgNY_yJO;Vz;@R$}Gz;}g*X2cd`X<-@Dc(gtdjpJ=gRWmA5VaOJCzC$iyW_0G+A z*U0MCwbggtZm(y~LJ)2pL zxMXi}k;WZ93Im=9S33fPas1pBzB?XgUUO!Ng$ zhd3Dcs);)ThPSxFaVizwGL}A#!z7eS_=*c{tYDAct*`4#v|_;(O5U}4W?3&NW2no%2sZ5 zM9OYqo9HVyEe7H zvv-{ztS`;Afp&M=4O`SnqgCdsVg!;=~jp@08|nN6dkPPv)NivN?|Td03Ti0{L?fjpk7Og)i1VTmO9hacyyg z?E3V<{DuA3uZ$dEbNTAciC{Dnas;QqlaS|H1Kyw{rZuOtHnkG7nmYreF{M#U{Fo7v zRSAhXO(V_M2>B@Wqmz{qA(RK8cDFc>vO0iiiVX;Xa+(lmK#~Ih@(jq6mk9Q{+MR|# zTN=y*7DZ4eOU#2->XKg)`k52@IW?rL7rq7pm`r{n+bxtwNRt{mcYg2s!MRuV+K2Aq zzL}5Q#gUB)m+b?0Vc*P0?!tk4?XYxqgk}rVqjJ3h82%qp(PqZ>DG>|fAlr?qMy;2^ zT?W*Iel)Y9+8F{cdDgnKguVa(oiCZtX^9J(m`u-V&K#$+KQ3R)3-E?`6+{h-+ygRl uEXz7TFYTY6hiG~Kzvm&s`={rqh%LzFpX96L`_ALJrQh|^AOEs$BK!-Vujs@8 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/close_general_forum_topic.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/close_general_forum_topic.cpython-311.pyc deleted file mode 100644 index 1361dcf4e9e2fab5012405ff9a881fea3d55f8a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1715 zcmbVM&2Jnv6t`z*KeL;lstv7_2n&SDR_!j_P*hcfGz|zEA(E(K*y1{4XLrcVc(FY# zK|SP9iGqLw5-JiG4yb^7=U?E$AxJ$`bBfecZ;QeK<;1fm+cqM-;PJe9&+o(U{hmEP zw^|JZ`ENVPwNbB03ui z)mJhbl5oIGhpY|+S(k<+nKoqI#b7*%(nuS{j8xXyfQ_}bF^ZjG%NtT{!j8P~9I)#) zDM8MJETsucSzl1MyFNn>2UJmiV04GPFHELVP3A($#oV=3m5FOarjTM73avX0SL}++ zR4C@iz?h+)>vlt_M8_QTq$5?o3)$-~8%8fV5c&mfu3ERhi;_<}<$plkpK{IqFiOo? z0u^7)tF}-Y@%$BfbRQ@kZgG~HD5RS=nCfd)hR)^{<;uzZWtoc59v(aF*QzIg-MawH zclZvRTr<|g%3XNx!CQ=vA8WYB@l71zo8C|O8+RYz9G8|=3k-inZ7(moUgkAQp<9O1 zwx1t+Dmkh}yg{k6SCinB*C`ESrZuG+?jeGcw7q}z;#}_vbh5V~d6f2ho0;o61yFk; zz218_TJPz|h;u_0ZbDCWk44g6hi-BBbk_k(4`8Pb_oDHg;g&iM`+WAo(Li>_iQBuY zJ3#)~Mx#m8n*Dn5i>0rY?l)(4ns37V@rwPvI$ubS=^l8XcBLq=3B0S)bwf>A@j0uX zumGhj5tQZ)N)ySm*z!$EKgn2pps7;IWeCgux|DI=0^D3X0TNi8q!i8~KL!#EUi3@yQG8dTag^$qpBwX*+0M`~8_EfA>s$usi&a&3exX`&OSwl6<8 zac+Bg*Pq#O^G|>?mT<$BC>OMjw&ay#o}oC{YSrCyg&QeUrzn^GmKoW{{mfH-v$5x diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/copy_message.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/copy_message.cpython-311.pyc deleted file mode 100644 index add1a79678138b266966291ab0e64a2fe97718f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4262 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 WX84Ev*GG2x#$NK_@4knL+wH%86RoZQ diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/copy_messages.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/copy_messages.cpython-311.pyc deleted file mode 100644 index bd95073f3d96b28f7dcb768a9cf85c0a5c59d640..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3008 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 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/create_chat_subscription_invite_link.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/create_chat_subscription_invite_link.cpython-311.pyc deleted file mode 100644 index 5424dac50318316851fc4762d98c9fc90b027d1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2532 zcmbVO&2Jk;6rWwMzwLx34gGEhQmJxjY=H!oqN)O=QD|ubYFZ(-t|ptEiM`E!n3-`( zP=sz~Ty0)qDIcaN7I=Mnl{P5Ld95XLqK;y$8?8a@gP+b|Su`lfBdJLRVW%eI2FoenZ~ zCdk@Z;9E59=YqVQ2RcKuejzB@MFW{=2GQJIMDwi3@<;lb(8Cl$kKjp~U83eZsuZ58 zX~l?(P8degkzN#vxr!B+uYdHxG?{vLdg{H)b2D-3op3eIz28!N$B)xDLLi=+$=RW) zrXw$hE1qOmy>R)d(ObUGeAeJjFw0~!qOQ`^Z&pGW+Y*Q`z;cFcgCg6!0SMSBX4z?K z+8LT+S!!K?J$XdaKxcY%7U*1$&f7U!fO#>Qvpg@;JS{yi=*T^^WY7b5hwQ>V^od~? z=TZM%8IAE2XO3j*^7HLQ;c`!#w`+*=IT%>L&~6BZWz!Ql(57G+VOJl<4qgxghq0$& zz&_xBFEpiWiOE_`_JF8Hyir^9qee}%Ta3F+0G;__LP&>CfIL^jKQSm!jBDnerHcy$ zFGU=5_avydtm5lUh8H7=gSL>k>8z+bGkn%{LXupIv<2hhEOuz%g`SYyksyY9jiwaI zaeZ$%fEO8N6dX!%TXH3ZklM9X)DeqR3Wl>f8iMk0Hylr2#l3bmJEmQxB z_X1Y8VJp${e^HwpNEG+X)Vi)|K}y@MM;EI28k21v3T;rx?(A`xBLLIq&6BGwCaT)5 zLGjNC#?j(!=E`b8$IE=w<}RDW{Qz(y&Z>K(Ad;fyw7l^oj+FR8)Dlg~4lOV4g_}}3 zKM-!amhBAdl)UMM@*D=w-iouymFdpw35P(TWr%Q6$;KlCcP4`QON6}W zI6nk3;yfWbV+avhn5%k%@%m2l(q#R^h%eWtA_^H+UvBGkB#^;%7OvEF)|Cz2H?1pbWfoSBZRoyf z9aAgU%+Ar1>z6jHlS$vSPIj!6S)|DjlazJRYy_#2HH?!N#4 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/create_forum_topic.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/create_forum_topic.cpython-311.pyc deleted file mode 100644 index 58e8227494b68d371d6a9b196995ae13a3cedd3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2114 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 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/create_new_sticker_set.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/create_new_sticker_set.cpython-311.pyc deleted file mode 100644 index d13b1111e87ea20a7eb01fa05565a71f3bb77161..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2362 zcmbVO&2QX96d$kc{mSm}-GJbh)-pres z_xsIDzRTyc2-;6y|GHZ5LFhMObXzi3q}?l^+(ZNs$woCvmn5Ml>_ko0<(i@^HC0z@ zNj({j%XX@k*3+OXM71-uteyouNm6!CEvM%slt43xq;DXSp*fl#>F$PZ%Lv_tFK&8) zWEW7W=e{sYQqW^Kj_Vno6J4wfv&;?3?o07tVUgN&jTyCb)LVCnDYol2HCCkEpF#N;Qb3U| z5u_*1Ln?HcD!NJ%dXmUAMU>MpCxeIzdh#JX)zQ;1p6TdWJxzMR&h6V7k_WpG+X+Oo zBujcppC$d+e;ZDJSKJ_KdQY@+Af8EctQTgApTS!)8TkaQO62g3f}Z~bU6u600_y%Q zjRu2Lj2a%T(#=i^7N~da_pAo(Jg1tsZgH&^B|-CC&5R~%hUU;sjmJ6DIQ2Al)1gFL z*#cLCQ&!d%*QvJRdfKLC+u91%j1?QAxf&&w2T|#P)!ur8cVd&W_Ad1r%;DOk=@L45 zX^}PPCCzm--Y`wdc{v-MZozFZlTK>uo>%9Sm5S*yTJ}1ym0h-0f$e$4s9R6Qr-mbU zP7DW*LIi`c=fLFy*>b!fC2oN&63ErC}5bDCithpGZyOFDV`7YBg zz{-n3uH(VpR-Nt@_MI!PYhMid97+ktjMfd<)pFK?ETMHqO@M?f0$2MlbJxM#T&Fby z)2kjcf^DISCZLbAORZ{Vhlv^6n+Gz7}vLm0ehHuW7A-3oCzKWNfsqLP^zv& zO~HQAQt-jM7oW5{2g;YyO?aVR*AFAN;kyf8+%E5XNTMk<6HU3PG}UIZnIh7yR5Sgp z^hH!3;O)xQQi}D%GBzm0At8o^ICzWiQ7I9qyiuntNMmd{mWOdE8w@;j5zMK*it&Gl z#-4y3f(*u{ZE%h;7xhhWJZh~y{q@P^C6{e1Pq_q8Sl(zb!*dx13N2IT%JRImvdk@y zo~j$>hOtKZvSGQRK2+kj!7DM7Fpvy)@d28Z>szb{TU|Ty2uRA^YfZomz5wE{778_# zANzdz)0xj^?&XezD3dSvhmZP0BmVH?{>U+ZtmGei&Odr8>;+Hc4*SqxG3?(r#gf<| zv|R{`N&|6@`aqAFeJtz6dn^=L?}^+BUZ6!Or$X)4m&C|4MeF|;3FOg z#z7Y2noAnC&~q4n*f8vlCxtO_O&C@L^MgFV7BLU94TA-Y;i2LW0lySTJnT)J0W zYE|3HQrx$dr7$6@XQVKT(nBE{Qw!lRnyC1d=lzq)mjEEHl+!yTWZlbDy zE1Y3+mEKWKtC cOuj5ZR{klzD&IMDZ?yb}aQ*oRe{`3>0nv|v`~Uy| diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/decline_chat_join_request.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/decline_chat_join_request.cpython-311.pyc deleted file mode 100644 index e1132373467d70d4f108f4c2b0acc3140e7cd2fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1746 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 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/delete_message.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/delete_message.cpython-311.pyc deleted file mode 100644 index 4d313b856a62064cc644f904934849e7f8ef417a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2335 zcmbVO&2Jnv6!+}Req^(oKxrdd1=RwivQ?6;P!A}oP(vGq3X-5EQOU5#os7MkAv5E} z_BN!-AxM=d2oOR-J(NQaRT1hP@kek7QV-FbB5~?%Q8=KSc=pUDo2rEh@64O$ujk+U zy=QxWs#ePg$}e|+Yu+y+^oOqWN+DIOJr|Tah$3o*D6(A3(t0k;MYd~4j_X8uHxF$# zb;3eabc+_sp&3N;w-7C`A}gKjSws(PgdW117I%Oa7f`MASXXOSGU&xISDp%ZENgaB zU0nWPnp}E!`qFz>=4KLmD&9!)OEL65w$cehi!5X<;YG7dt#az8W>cB1V(ndp`WJwo zA=jeF%`Jf+uFV`bPjha8+N?;O3ovE?5QAPwbygB(TDgsy79G4*aR+Xr&n&mRfO_9r zHK|^P)fJm%QhF`seGe;^F_b0Auv!fyjtnZSIHqPK_MpiO9>YQGhaDQkEi9S15%{dv zCCBi3pjN>G!%ZHBd|eL;gDA+DnJk-C#_?2d3iiDi^ElkVD=b@z;-HBGh1Wd^3&aYC zurSz!f#=`CtGpv5_F8eCHw0kBf;zg|;15q2)^u%7o2uaF>M4Wa)tyc*7wBvs%5#<$*&F?lkS6 zIIV?o`MB1MIZeZU=|UQbx5XK#YJTKbAiB0?Sv%;}?W4~w8ry#Mvy1Td(WhHD2Y*w# Y=;`vixqIgy9e?9b)BV>o1{tjX0B+N&1poj5 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/delete_messages.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/delete_messages.cpython-311.pyc deleted file mode 100644 index ae95e3e1613f0a2a135df1df12995bf776399ea4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1713 zcmbVM&1)n@6tDi6&&*8RXtE^6rBQ+m>WsLTB`mU%gc#fe*(5CX4%T+MYLYhHU2Rph z?t~yYEV#ldIjn5ZJ>(!OvUl;1@Q{T)ggz~Zhum7?LH6XU?irJyB3NDZ`qlfWe((2Q z*Z1{$6~XxN+n>9=0z$v2&0rM!%<(l~?jwST=A%HfwLrJ^z_5+Lv`q~Wofv*0DB490 z>1ZAi^EM&{TBN1%!Aa<$fzTsZ`LN5RxQv>mBeiXsNqyym_vi4;yK^(|EiBC^#yepz zF|T?;CWY0|W8sme?6jn@LVdcih&l648o6+gdQx&X9Em-W4E61R7m0<>B7||&BTgti7jJ&*@O6Ay~&(fPAgp2caD3LGlpRBUt(P=r0Y?x3z7ZXb<#l<2&su4H_Cja~exc zo!7va*MalBzxAXQ8?Hoxw zz_%6k`15f5*7>v8wFbee#uje^`C|vAW2pYpmvdjt-<^L_n>?u9*uVbMYw%KY!R|Bp zwszwfd{FZ_m3HU^6yv0dallCIE53&D$Fbx0H6@G*b3tsbG3FeIK7gum`b!l)@5tW`gGDFj)z7G}9_$Ww)D&`eF zrmWO;mJxNj_!S5weDb8aStzGSks2Bu-&s5yo!VJ?S|8cHxM%EMx{D9YNtln#$wPDN z@Z9LGdvE-}oPhb*oJe(4xTQZWy^x~eLPtx>LlvM!H1^`&#eHM%(mkA(GEo^#T-b9T zjHi`sTSYHVr9&B8LyeKNp0VhE(MtB^{QIXUKR?KO39gu;>_ve2Dey8ZGr-L?M^LV= zOFlX9;pY^W9ic#cR=%7U_-#G~TZOLp3`lBdns$iZI{2^o6j=vnXIi|V0aoar>F$U7 Rvrk5wzh&y*|HUYa?@!no%)|fy diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/delete_my_commands.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/delete_my_commands.cpython-311.pyc deleted file mode 100644 index 9519683e201233b3e54477530a3fb13a69a862cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2491 zcmcIm-)kI29G~6Wy*oQtyrT8xX5rPr=5cWX|J{5e}5+5W_erGq=OOq1?ac=f|-}!#O zJM*2-_s89LhEYT?e)#66#u?y#lZ)QSri`-r2{88%K}7M8uULvAdDT<>jFs^Mv6s9o(h5NE>#?3!f?}Amyvn zqfKu6b2Mx*;z*o&LrWQDa~YUVA&wMT3PF~74dQ8KsAlOzwX!5*<%mY}L_Y_11&E|o zAX!-F(lsseGDJ5+^7mCzzKa?PG47PDp}XjoVwDz9@4GS_ja&q8LOR#o23pwH!Ox-z zsm*m8yGCytsSGf83$Qfhh-0h2Wnewl?6!gSJ53A4d?B5t~?G%$q>oe42CJA!i4 zvx8>GZqlkb-3VcwYzaX>Z7#LkW=mSoRqFM3JJ$-swwS8b9L8xi+y<}8c(VrQikjVa zPY}2Qmst@sC#7SPtTEYh=ll{jZ@QjmE>lyq*v&v*#BMaG6VlWtQ8nMCVTT98oN^eU zQ%hHQhc1~6obNae6{1>95LsXy?$9aoUwI^9^}9VUlJ}#L6u>^(^IO06l7BJD{l&q_ zbK2Y`hg#T~$Ak3!Dj1~QTSrT46kL~vS)K$f(&kw}9a&v+$lf8F;SfT~<^^EB zR_=i??CC-B5T5VhNyi7zHAKCw+*XNlU%j3AR{1h%ozTiM^ISH&N2sF0Z8~iz@jS+m zY$3)KJ=(v+JuIl#z_@=K{xZB76)<)@TL_GW^jsF#+SYp)r|Q=kU#ZV90(o0s=_Cye zLsHjiuv&lHU9Jl^q?2viS%HEPb=zgKZ`9Iy6ty&&u-^p`lP)Q$?JhUrgpbB{V_5BZ zTm`i_1LV&&6u*j$qhDP5Z1(fn$E73drNsxY{b<0KoR_U_CS8^mH{l&r$)|T41wIKE zKO{MM%OoiL70Dd|QZXb-f$dX_qawyWBOOojC5%7p*xt4#hcRIeh_z+LyvP9XlBfbA zAS`1H<&Dz|Z{r#bgRuXb0#cbaT(-{S?sAU=ZHIauL`dP|pb|357x)Qjb)ZM~NyX1V z0E_-7Ry92zBS}hVbZl*IV{~F|K0b^JMm&o2VvLHq(I?N6qMe~3$Q}}nHG{=)4g|4ezJGN`N{zaexn2J4Z!E} zXFAG;-8SHxLM9WE%YxxKsnbD61usZ}{I|iOju0$^# zE;(Hyy_G+ghW$K03riUS@jH+>qbSM-8ee~LK0&Xq|I>`MyrRbF{~-I3a(o?`J7=6d atH?kNreA&hfIL2Q>RF=x<8O=-H2wky7uIM1 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/delete_sticker_from_set.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/delete_sticker_from_set.cpython-311.pyc deleted file mode 100644 index eddd32be4820cd8e8fe9ee97457e518a98c8436b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1528 zcmbVM&5zqe6rZsjC(b5YD7!@!tzRO0n(P7#V02 z(b6uWHnUmz^dcI%5Ah$sQ!KAS%U#r{JknwVXG?yPaOJCzC$eE=_3e*7*dXigZmhrm zUS~5iFC~*lxUgK_W)T|-KfcP;4yQp8ub}hr`0xtIUqR6fd6**4xCX_0CbPT}H9VV| ztW2$oVB;WG5mj2fg9ey7yEV_bgTBCCwTl+-#!|L&88Rx?Rben<;)>vLm#JI7S6x`w zBy-hHDBU=(##P*+)BC8M* zCZQsvVPz+uD~?DO4G78YMID?nhmauhr6fdJAj6$apL~3|-MhiXsJG5(m<)TPRQQSu z0uc6C@>y>y?Du4-*oCnljQk;!JwN1n=32!y%T@s-nS(|&%8*($#}n}qWVv+B>j+yrJK3T`Huf^bkBy!!DWwa8cf2eiLF@ zizl>xNrRL4F(V|a5)yNoMw+h?@@eWvb4{5L$^$sI`kY5u9WcwU65xQtWkO(*NYO3G zCqRDofr71uGVfG-=J*CIir_l1SOt~T7y7n1rLCL=sc6MrAkg)*-^{Q|l^N2chE`8c zukNqDIqe)+FHEamxqlgw6=F+fuEn~%KJ_azf$?R941DqhrF9!a~OvFXT^hY zMR8AWhsqmfk$75oEVJ~er*dOYaSb+9d)KM*0?Dc7%yc_Tn}LwLp=UregzPurGS#G`@Xb7g+57N( z=ARzVkB@RlEv02@$8^ZkGvxUU2^ozUjUfp#xK3qX$s(YYIx>qkwc8@*fhmX?W;f~u zU=J<=^9#NMZJ_6RIJpPwKCFCvaj0PhhHu~y-zfZsf65vQn!;+!Dj5EOpb?5H8F87G z2?^s+6H>R+SDy-wC?0JQlG)1|IHfKjK}3}zMA;xinI=!JUTSqe6LQd96)cSV-9aL$ z7LovFT^@hc{W$D(RjBzpBN_~7pQ|nng=w*7URl-5(IYcd;Z@xjjpYe=U}yPx>>Be} zP4BA)kbfs=T0ylpeq8%u{r38U>gnC;3e3A_&HnbgxpYVmzysBtJSV^uWr<}4kc&n< zX7mdN6H`4x(h4C%!IH@ERYJZ@Xf)H52w@_CW4k9rl-2;Mtb%|794-<99YgXYK|TiZ z(Ps#@2Ei;#RV7UY;W$O5zJZY@lIVl^(H$Wikqu;b(7t2#*NEIzDPcH8* zotw1x?b>8xvhm%9r|xix;NlqI+SAUWT~FE%QAj^3*(@cHK1qZ6)xX0YK9H zN2HD(j{t)_!K}6I9#veHjMwS8t9-?9*-a+LC*_qK=8N(yh$eZp17vDpjQ7x)-Dl@M ldTaMZb02xT&(5iH5<>$2CqI9CmpwRj{*h5Vet|xV?LQs?l6n9D diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/delete_webhook.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/delete_webhook.cpython-311.pyc deleted file mode 100644 index 038dddcd8c54f33719a702772325f40bdc4458b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1643 zcmbtU&5ImG6t9};`P`X_giTD)VB-fkh|?eeWe7pptm9Y4kliKNnNZu?RXf{mPgh%2 zopnME3kHm$;ze@Mg9nL7?*0`XM#y35(?SlC+sJy5J^5bujLCvISzZ15RlTa$@Avyv z_s`8{ok08b`` zaVaNmVGW?TMPa!mUU192=vKHTs=Ra#*42opsV0Ca|3G=;Hrb?n;a1D7-zJ|@cVUIh zpY3Maya4Yu;)>YVl5+dTA9WkrnijU%3bZ}S3bKu~l^DtE!rsZ(*+FEmV#HwwoAy{H zHWz-tVV|`1PGI~kd&Bd$aoF`kPwVcw7f1xz$&>2NP#BiP+%rOVdcv&b?s~_*EKH&z z4I3pF-St(Kh;BeoIKEV(V`fZtq#8OK(rCwvgBN&) zaaMb_Ic?^1Gu-{d)?AdU8&ZbX(nYRh%wiGoAR5lgY*W<)dei6F5!M)s$J~od;Ir)= zPYtyy;i|IAaHLjWM#4v}vEdWL3n=P&aK58=;H;T>9A@sqeGl%uef)2P7dX911A4RY z6a6MT!Eo}5{j8>6NV|}hbP@}dRv8PTz%bUf(&LX6$FvAH8OzqI7GzIrjAi05rtzSG z^t*?bFLVc2q}m=VNyI+bPC#d=7_d1I(e=Rx!Nx!bM!Xt>zTQyi!Aw|ZCajZF%VvCc z;;~wU%-73b^uFrdZ#+9`46wiUHrn^D&W8D9V{ial zNV}Y)X@H+W%BWYzaQGC)8^}iFjRa$9ow1SRNr--fu}=~&oJA^(ap}Xfh3cnGASu%h zwP$IIF*rpmhd1LdJqDAHK6RKy0yChvJ!91uVF)5nbrM1vWqeaTjjQl~m6<9AP;S8f z=$aO+QguquG{}k5yBGIPytv!nf5n+trzRFy?7v&ip7r{EWpPScrE7HBB4^*2R_Zly z$^W*sEM=bfF{@6^3-7n#iK7{shI+zI7zy}I+DV5R)JYjBCvBvi zjFEwP%2RgM$r(A&(>!D6oq|!&NPbj)t^)!_Qcxqs z6GoaRMTXO};FBXf1$uf@&lp*r1v}TXb36}rp=alLAK1m7UEn3K`(s=5$pN0(d)0q(k~ zyPkWhAuY$0%etlD(QUv-uS;PDg6p+q_)zFIFR19(VnuhFexTQcZo0b39m}=+K$?Lk zA%JqO1JwFF*lI~w>%J$Kz?;WkE}HjnH}HL@xS3a;2{6h>iDpgK;PhSOu0NDqZEI-qk8N&V?PACjq2jZZ0Z_ z2MtRKh8|nO<7Cw52&X0_VB=W9Mya<<&GYQJXeds<&+d4Z%cQv56n;>qatK&1ccIvW zVjqa;2%CKEc+A>1PeXf|9TE8-Qyeu2mdOFKU<_TN{R=*ocw(1i>ViVBOQ`0mcl&;!;$0R@LrS$ z%Hh#>J4F~)bDa{|d8E_dGtobuKy4jjlJYdaRQmsgD!kiE5kfX;YBcS7{Z;KTWJfAx5Bq7;psD-9lLXo$^R#E7*56P35g_AsFaJCv-u_zZpfKT!g!SJ)~F~A)fqAr zLya{-;_a6i^h&A99jBAlOkYT-2%AtJL`|)M@NZ<##-w;(o(2>1;(rgKlhiaVB!}DE x`x@zQsV5}wwEwHGZT}WRg+y;}@16A98X)kx_-6E{(u=)ke#fal-Y~C@@He`2p&S4J diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/edit_chat_subscription_invite_link.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/edit_chat_subscription_invite_link.cpython-311.pyc deleted file mode 100644 index 130c845cb113aba9c241baab3d72b4fc52e87031..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2026 zcmbVNOK%)S5boKTecEd$#)bgSX23$xhOp)W2P;B^jb#GKf^aNgywDj>x4mP}W9jZS zIP$@VNCXMEp&*e12NXcLAP$Hh!NHbtSk1{2C*KyC1M-Qgp555y5hU6@<*M$k>Z-4* zdcQ4~O9aMGU;VQDT8@xkQ5X!6aTxonKyMR9m=TcBa0~z5mIiFq;FND6PXaoY`&>_P<0UM5u?skdBpIa>D> zzv4%0dq#ix8V~r2aKo!ywPNPsMT23bjIrMW=3@w$6USi0$t*zNj>#=2%Q8-mnLN*| z3vi|gAp)Q4^LeKL;pJH|m3dK=S)P^d80^F?vTU%?n5LvSz=-xxvY5*NS(JK zMl!65R;)kG-$AKP##p>qCRRxZpf>K7>A-ro~N@9y@}HH26H3jdvxtXSFA{p zMYWvJxF%L3j<|>AiUV6C58n{B;VZy=VcdphQiFY1xeMPt_|mcZV25Qkjm^xa$&5SZ zruB{Sxo%r%FSAiK#R)hr#*m=X-;-)4$;wWfi=;pyN4}!8noGuxI7=lDmMQ&tOlPO!MtntTpQ~^P`pKT1QtBg}gO+wBEepFEu3;&~t6qTXR>q zZ1(GAIxTQHjX9$_4@XmbtcKbf;z_vj#@UCXUK>PJfy1&6hAZqVP!Q_5lwFfW2mQU*rX2w(|EM<|8brzun*kAi&o zT*6uH0X}LPAXL{m@^}zHat(1Bwj`Fz%K||Wy6Y1j#U&nA*D9 zop@oZv1?6k>$zi1cC8y-YkXVJ9c#R6J=J}pvUO?Os-$zrs&uVqck|;tGL{|bjghId zy`hmJ;Qaqc5v^!b4~RH32%-TP1G38Gtm6c`V&C z5F;OaKnanOC{h%02!|XZqKG@cB8RoaVKpa9IdPlFIYd6Cs)sdkf)pt|JvCKbUDZ`z zRqy^>uh$5S$3OhK@?C|H-%uEiQqCCL*MPZCIN^p*0>d^8?K{AH0oe#*8=TnYWys1d2+J;V(=PFXD0Ay9?5RTRz?Yu!WxK*FAXj(gs+McH zENZgB%kYdmF!_OdWX0h7?>6j_d*n029=$|{-{x4_nCD*nP9&3HDe8Hya|NQWQ5ct% zpmEnzG|=JGIHCf!($EP6bwW-(HwtOALLE?nCG|pJSI`qxNl(a*jFKL8yH4DqOI<;i zqnHMXis>@iQ-=p$=&4vbaU{_=hCR3&edH&@k+&ncs!!9FUFQ}CCFr#4ge-7Erz4m? zT}}VPq4YZ4Se>Rx=nJJN1P-a_Bc#wLLgXlF>lXc3#EA?QopmEFX0I>FL|mtkpGsU8 z>{~UB$)zZfu9&6WIPR(0nHe{dq7^?Yb1Raa8AwviI6dzqVx_^*2WacGfs4FRon3*yuvg2B~UY1L8j}P_g$;E zCMV#8JBRlI+!{uH9F*#PAb)O!dDAVMkg~;sy7Bljt@?}F&IBOIQ3>$ zg$2Eu)yTn@vyoj9cjgM@w!s@|j^^3dfzJ`#hn$A-0CHG&sX0VM*H?}s_Y#n19kIpc zVJxjN7DPPpksoF3X5#qIG-bwkDc+MPH6Ma25t%-qkVK6bZG1s@I^0{eE4Xm4k=~mx5(zk%(+_YL~ z+O@XIhca@w*vQ7n$yWxipULV6s{sH1BUN;yz3mb?HB51_IfCe~B=F+{=u7+?N=xxt z4*=LG;Kgy|0dsF`*H5cc=LBu{qX|5j`J^Sb|`!R diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/edit_general_forum_topic.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/edit_general_forum_topic.cpython-311.pyc deleted file mode 100644 index 997b0175e1513acdefd13befe4de34a8e2d1aca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1778 zcmbVM&2Jk;6rb5$f5uLrY7h+pMsSE61-plyOjWfCAw)D5Y7$i}M$^sC*j}=`V`kPZ zK{*(y5(NP_R3s4MfC{J=PW%-dg49E_r%0T7GYSWk6K`g1(n5M+JoEhC%zJO%`@OgG zL$z8)Fn;;^*UnrHq2IMI8TpLCM=mgT5km}zD8eqrnzuqLvRylJTqnx8IoPwA6Xv6W zTfoRdtBB=pBbMg{UOYGPi0;`4-G`M8x5Nq?s8)Qa#Trhhyf_w#mjohKH9M_tzWvq; zU4CO_`OUS~YHDAJchlTf45trqW-z_UL*A8Mw9b>BV1DK{qvKof(KV1ihWI&hF+;Ak z1$nqOcibGa+&r^+fjJjJrvwoLpU-$+lx0@AgF2W^-LAN$JLm)KmN(GkzgA6WS6Gm& z@|a66d|k*vv?=<5?_Gl6$^^!i;w0$>ibN(lk_f`V0`@qGy@(UhG5o^V#{y`80}{l< zBOUFKs6n60t`vhl@q1oUC!1iqEfNw9R6@2n@j#bFK^&+=dWn$QSo_!7+D8@u+EB%dP&k(%|^o)lGl@QmFhxv8xXx}c>UmIjYT&@&m?QEH%`)7efA$@ zk7rEr-wEPmi9o*ZrUjiQ4OnV}m^vENbb+2)7E1fO%!`x2r#rVi*;NwS9i@3`(n_6{ zh`F!ZN)HQ`?*1u+@X=*pzQlK7Gnt&j&OKQ7VP)gJe@>XShxaUozp?i0@9`JrTY(<8 zTQy5oL0QfK`3cpmG-ryN7Ab}DC6v~3>6u5Oq>6_fN>7aBQ(&2vDD^{6DN2=2K=;}3 zxcyqQeH{wiUKT8fyX~EUX$A^dw|RWCeKpu_t03X8^gVwEO0C*nAoO?B$XZi1G~jex z4Qk4fwL`tXE1!XTK78R+RO^%Ap939r9>`xqG@3@$=RaThWc9Pv2bKB#%KCTLf4%^J zdcJyf%w%F^{RnK}3CPl{0B-=2)0)!>n=;9#HFpL`ZAt^C3r%TSrZf_45Nf_c>H7mO z9G?^@Wx|JTXIqFctpbjw&HxT*%V%L% z>1tn=`dO3u`81@c555Hg2%P*zmXj-vkR}y0dv3UXFuOEt9Xj*-X8z{Pk1UkCVjVcu z;o5NRqqPHP@vv}qgr;&WJSrASK+*rACF3FU^9Yr5lYm>bvPQ5ofbSX*l={I;^T}=> zK*|u%4JP$>05E!rOP!*8Q4^E(S(^b diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/edit_message_caption.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/edit_message_caption.cpython-311.pyc deleted file mode 100644 index e4195ca2d7050eb8980e0928a9373f78deedc46e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3215 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 AqyPW_ diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/edit_message_media.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/edit_message_media.cpython-311.pyc deleted file mode 100644 index d5142c69ce1796810dc6b88cedf314b01312464e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3196 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 Fe*>X(@v#5^ diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/export_chat_invite_link.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/export_chat_invite_link.cpython-311.pyc deleted file mode 100644 index 66c47df437befd6de081952eee4f734f6b59fa97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2282 zcmbVN&2Jk;6rc6Coj9qg6benG5fvbpU~>*tL>oegXe~q%RcwtWlbx|Wc)e?8#&KO0 zDThiF#K#F0i3~oRCieZ?zEe~hi*A;VFQi+OHa9*F^-7cK z^L2apL{oR#rrljEIG<91hRyaRp$Oj%n5LTT^|rbPfT zackeYvH?P5y->D5n#Gz;x@%$w{Z2=Q5T=cJ!jKe=rdDPA0oPp_C@XDp8qb9)d}%{V z5i~C0Fu`2??d%Cn<%J&Fido| zB3%V3<0a3hN-b?u5t_Cv$8Dg>+;$ByB_?sa#AuaI>ZWZBHG}9q>Vr(fqI{a&2G`bT zd5zni+#WXGD9boG6FI>7uX<7Pj!!+~*Q7Vm-X<)E{C#Ff$mln+7TCHCkDkBM1!GitY|J~O}>{$vvykC6oFpE@HTuD zW#bC4=oNAj^n`T!4EjQNq}8Lcp=25cLzI!W;iFU)VDQZBG0XfL_7rRnmtpg*a~}qu z9`WJH1Gpc;9j}j%IV{1PJC1PfBz|{xI_alcN8m6tQ16y*uAtw)GT!5K!;-qFpsmuffQ9j~o~3<_Fnb?rPL0B4N{yR~a# zr>0gQ`; zu05Kb-=Dq;*AF+${~K50(=j~+4OGg+$xXxFW@sxRXU*}9;ZGTG0@~(;LMte{;y38=r^wPMmhr0?q>k*A%cixp_Zgc62}QE(MoE`maNIGl$L6x zwKS|JiEL$BSuHDY%F4C!T3+C^HP9+(1;81SwTdl8QzVo?vxwyGAd;sF%|Fw7GkTar z=n*{8&`M;Wfy#v^TrErCfNtB4r+cPjyJa~n&VMjBgQqXgOuzefZ8l84Wv_?XdYhYd zD@-le0G=eGt(l9osdp?7qGYa6*VR`jz@dd&V`d)DyKxITBu>jf9l2q1GB%!5Al4gi}0eo_hBfzN` zrvYbT3|S*N(DVCxjtqcai1Y-ac~X1`hkC>hCWbaZ6!0iU9<;!QNtR@v=1EEql4R&E zYD#4Aj-nOsqE94EX`tT!^0834VZckq;RIB5x#Of^>8?9@T{j(Gm5R6CrfwxZNhLo0brsIbsMldO1j>u=XgD2a z&`EXG^V;rYwQ4wwR=l{l6^E@TUD+`1|6ZVt1&-i}4%wN`hG*nzlEtx*l5! zGsdd!VUvV~CUaW2rzOE7%*Ua?T-z)5*vU69g@=1KZ1e~OjlpF zCR2YRvhirE-!T2i`D#(b%&fLKXKH9pm;o(QVH( z@EUMo#bun~VLHlWDAydD8a?{)2Ep6M07BC4WdPqw_uxuQM{|A@+oFy(gIl!aN0P22P^ zF6Y7{fBORLQmcvazXxKY5IoFbELerHn**J*o{!DF#>L6Ss}5URoOXz5uPm;0nC>|Y z15*~MeRJ_Wb9vDH`bt=xQj6@tI=g~t1)YET;xi7ot=hP+&niBznQm!c z<^GX@qg{xJ%7>zK90nXES0It$LB1x^e2gQ(l3|WGRoDm@JXwMg>;y+AL6l3p0Jh$u z7>9X`TMp>}QE^zn_~VXl#g+`l#4(^6oH1b$fViBHQ*c!WjH0j|TGXKtAP*xh0?KCQ#~~L?9pCtZ&votq1bO;OseH9`a?7d~V6- z0{KR8uIkIfz6_GjExF1!HWIUCMasLs`Hgk05HI zawHDG>$I1>5V2>9y$UKXp!*m^Hz`R{fKL1Ua|ccM|222e8NYu9XvFWI0jl`@GeD}} eKfCFdCCJ=A#Wx>)H@iJF{yR7Q@f5rGy1xLd%aNY| diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/forward_messages.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/forward_messages.cpython-311.pyc deleted file mode 100644 index 3358a8ae0c4c61e5ecb8cae618ef0e9fc102ae6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2574 zcma(SOK%fLc=q9EVmnVrLP8fP4->E}LRA`}s)#~}3JFqz+FB9AW@nr%ws+l`H4qe} z9FR&?TIG;xj0lcqPbe#7oV7b^Q{) zc;(W?&nKrQJmrG56L5LS+t2EOt)5dh-?u!{0*c@Q9&Z8Am4y=3kp?fWINPCl*ok`jYBfYqP)$g9Yi?~ zh7#zlGBuQ`G_gx3(&Uq9p_8We$YO0-8f2MWdhxcb>kU~V^wrHKNHq8**A=3?85dFC z!izw@J7R>k?TU-Ucl#rWJ#+`{A)O>z?0STX5=lKw7kVF|ds3lq2DSdPX)klxW_NW) z!bWlZH>iD5gLQ*b%~>?LRtY+#Ikr}8p4BR~vSU`u6huLLxn>tN-CEL0rbTkvWKrXG zg$ky#NHt!ihFLTz**OcDU0) zsqOo&=`3nhW;@hyz=>g74z(O@hmRmbVdz46zE;r|m|d%y)`AAfm1xxw&bI?-8_sFd zmd0y_0ZE>M^dKgtFNv(ijk3=9_$}SE#VF^Tr7GpQFd%G_Tv*LXa;seg5mGy3aLlMv zV-^IJ45~e2*O)=awMECN^6`A$uo=xc;k%Nv*+PEac6eT|nn%Jew2TGnUMA#*p1Bt@ z7Ig<=@j8pluHY8c5vqZNPkG%f%2{MoC*pV?F}Xfprr5F_=$fI67u(B(^~GUzvkL2h zmyGoa& zI8Whu4o`F4ZcB)~EG^5+%Cfo~S&kBEJ-QrwBK;u2m51QUQl_#|mH{Q!C4jhC_Qd-u z%F14Z*Q%6xag0sNbTG~)yq+ClV@}IOjQ`&d>j&dr0^?vNFy;xM#rq@H%In$B#^=7U zS!wQ~Os%qIfBwf~ki>!1*-BFwT&d_z-|deB(UDv>Z?24)Zb~wqOW@0puVL22RXOFm;|f zZ`40e9A_|sZ$hf>bb|bp$@~|REJ&lzT30EuGDAh@wI$IJp_AGJ><(M za#eP_`&W&%!G<~nds7_}+>-1bA8n}ptM@jPwFeCq@X<|m)Kzc0qo6-fKe2IkJ=ahH z&u^-Ep)xDG$4;(HuYOr4Yd0I}N!Xj}NmreH8SC@Wfk@i#Lm!-V$3Aj%XZ-H{3FuiH zMA5zj^|1}5er^r>F~N?b1KNhNF|!e0&-)3%Nur^Hbz^7=vJ7BEjX`958iW=ah--q}k#Dfd%G7+h51eH)r(|b{a@A4}2AXuSk;Q uqVtV++b_{bWA}EE*4VxM=oty}dK0W#8?(={PwZ_ap diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/get_business_connection.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/get_business_connection.cpython-311.pyc deleted file mode 100644 index 43a163f0f6727f850c01e78a046574e79596b7c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1705 zcmbVM&2QX96rWjpz22`BMNKK9PzzL5E6VN#aaffI2qAoRg-9!eS!v?6XE$za&oVQn z1oeMgH-xdl5oDr2ym<$<@b)t?pV5tNn>iAC*a@bJ+ z88GSG3gx!rIfHrDj_3Oz8S0c-TmzArJqG=tT0sr< zRq8shhpWK+fcK#-Wub>Z_u#z`Z$555(FCOc-^L-nUHTb+r<)#{)adah82*Z&G0P$y zQ=Zv`gh?m~X_?vbvEYcH(U1^r&zE3PRwYE2h!6pX4MAhARP2XDCx^%&)@MzRP^WN?c}{AI)E%$fM9#P%g@3tUp~JO#dZ<( zvtT1SK>pc7vnAAg?%VaRH@?|;(6}&ZY^nLmdy4kRT+DwqwhmzlYFT-D4d8W-x)%J5 z5}#7~x`HS1VoFF>BP3=)8Y#X($Y-e+%{3K50_Fo&>dwiU!01{69$>me2s9VT(*^kq z$VV3h*eWb_s%oVM*r!nh^}zfbsD!HM>-=eDrEWV-6eGR|0$CqDvyxf1XGoC-TDiP; z?O^4~UT-Ag6?MN`K!yK!TCmYFfI zRS!8-B1pgi2^9$r98eMJonL`Oka~!Gio_|mMd5&Q;>~!sO(c3@cKrO_yf<&(_q`ea z+-^4!j9sD%IwXl}ip`AIQ18X&Er}fMY zUC$kB|Mj% zTG_t&!F$VO>7C`JcURX|%G%X@R5}|ucn_^=Lu+X(QrC(!UCsOa5Lb({H(AOCBFb(s zwZ&6(W~@=w;OZ80yW_&;9}6-gmBeKG(?|@YaDc$FE)1a3UgJ57b&vGWZ|$A| z_2>#H-{J>wYSh#ZD-Yp$1Wz^YJn>MA;(Iv3_pG1r*XCTp8LF*`ISBj(b*$2n#gK`z zL4ct|5z?{CvnPrplBIn@OuRS)n@W!mLp321?gN4r?i^o#d$D(mi|yVLr%68OZ5JX^ zToB-?$MR2l*OSejOcYxfM)7tuV6r!9Q@856>;iQ}lN1a`;(17W_soQ-U|QGiE&F{6|g8Abu{eI(WWj&Ecumg4K6@XdL4GP1ycut#VwSPtv zkVhFKq-+wBaayEWZxQlw5v3E4O9ANKs%Le8pn;GP?!8D|NP8?FZu{V(a63{{>JQs{=5O4oosAgy1(T?EpE{%(|Y zxPU-Rg<2n8p}&@;WA0@|puHJMCiLgE0(?$uCaWglxN*5^!xixwn3^5=1Bh`AW4w=E u**iTC(51a+&jaM|ou2!rP4JHE7qBMjzvXWJUGMSi>wg*d-_Hm#)&C2~EvY~N diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/get_chat_administrators.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/get_chat_administrators.cpython-311.pyc deleted file mode 100644 index 834aa56d46bde0fde9a1a76748d4f4cc6143dba8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2100 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 FJ^)DFoLK+> diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/get_chat_menu_button.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/get_chat_menu_button.cpython-311.pyc deleted file mode 100644 index 3307b674744fafa2c35b03acea4e85aaac740615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1907 zcmbtU&2Jk;6rb^~zwLyiiBLi#ZRi19TAK?TqBM}YkwK*LG_n6bTR))B_wipd!>W9Qg}+Sfm`HJw@V_n^8ER91w4I<2q5PI53`le)HbEH}C!4 zoB6R^E+81ceEYbwnnvh%xfqOm!r+a~S=d1?)-jfR%1OD3uDGhMx@kS_X7mim z6-#xpZcfj+c|GqI^a9AzR>mp1CB1}E3N?_G-9uK6mS~3NX@TZC%GBUQG~^yC2t9%? z8G6~uuc1oeNG>ZlDjJ^W3q#nx$17@7zWx645~;tnRKNLlvk@ta-cFQzwSo>~X&bcL!k4OwT;W~}F|l%BT~yy7lci1Z3M;&Yx_eS*cee@~TN7m5bzfz9I8dTIb4Ka-N?%xFs#yY2(*tEIk#$js0 z*Sb`Ih-zlQ81;m?>6j#rtHW6DXuhZMz%(i6)j}NinjbKe&S{%M z^!Qw@X8Md)#VO=fpLJ^xDX$ql`x4|M!;-EO&#{AO4CLn_X`Yk^&G3Qki4UW!v?I1v z!E7AxjxLd>U?ilsV;P>XO|tcg!MdEm^*~XE#c4)r)Ay(;TS5-`FV#h0j~9UX20wsa z7Xv*=9>VtszGQs#L}R5ad=K0BUg`(@ReZCc&y{8z*H5UDiqbsjQ5NM0u{~Q50_{G2 zCOE>W(;+0@&n|%XC{IXS0z$a#N9cv!llN}SwKjaV)vEiJ?R8sQ0W*Zp2w>Tw-gfI9 zyWQfppjUf_xn*=IZ=IH}mb4GA0jMNK?QA7`J51i#yVFm>R~>|V5%jzYT^2^eLip?vQc6bdo@)FvhO(JK9?i;##JUr}bqB1Oe50cb+;RXg0Y=^gmXSmP9;M?KAVzx#ex$YyPFY#* ziXnPla`7P&wv*g^Qp^Q*8I}@H{wt8af-ycoFNWvmA$mRhuX%`WhR>b{NDI%;er6g= oME{*0sN-M17EWCbugr%F%i+}W{)Lr&b@dNLZvXQcMsa@s0E?mx(f|Me diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/get_custom_emoji_stickers.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/get_custom_emoji_stickers.cpython-311.pyc deleted file mode 100644 index 32a662eb6f085520832a9892cb714a6cb7c1807b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1722 zcmbVM&2Jk;6rZuzAM1~_RBhS+&BtmT6PS-nQXXD)+GcyKU z^^ij)Kmsm+T8Rq>R6ykb7yb$kM(QEjQzTBg8HEGNsc&X&(n#rrx3h2GoA>7Jd%rg` zKUS+H1oZoNfAoH{5c*3ib1I|)J`f;0Kon6Nq6oVfYdI5UqO6;ZEZ2&1ZVu+M)C%)a z!7YHCqxrBH*{+RI2DK0^+()#?Y?fn%i}U#CNP3h-=rO!0xg~0^qgrWSt2LaIy*TE| zQvr`CpP?S6 z_Wg{|CBN0o-i=C@Ncw>k6oTeXo zQa0~+0oPE})p*EceHN%b%j%B9yW7lHvR*RTt@DxaS<~54YABnHhR+47s~MVgF8Ylw zSF+&^gI6KzG)0r)JV6sBSp?$=5FFaNYd575x02K8Vq#X4fXd``ax!p)49C=iVtq3B z*b{vza?pw-FHF&i)#fqtb>}tduQr!KJXi+dTl@faq?+4d<`KM);Z14#KMT!Jd=Cfs zUgih$eqahPXk&qw`6d^S$IrB_%M6$3)i18PvVNqfeVwymR zgtLaA`#XoXt~ERFb1~?wa2mw@&R`@w#RUOeJ1qXFb3N#GWT4pPq2~|0K9ikU0~_gv zkqy9>90PBTeSJ611W&0G6OyKCN&8WK*VThj>A&XSBVd5sJNt5t5V$i8vjFTCNcC;m8YTmI5J^ z`v6y7FDwE}s-T&k0xsacKnUzJl9mnnDbSDZ1@P6Fnu7I81GLY=5c-0}1u#k7**Aqg z&7v}Awl;hX3`#$GrWq?&oFdIC=-kDJ=f7FoS=&8#d8fT+Elte$(^}fK)L!B26qR$E zcv>vjz|sHWwuz9&d4>z!7n5omt`UH)H-cjg&r#ouwRCQB+8i6g5dJ5ri16DaERsJI7XvmD_qoAcszr!J(vvE7xG?R?)L@ExupHBb;i2L~ zsyG$~gB50SD~Tj!BI)~h5eCeF<5M zLuv+d>*w*-fCCLL=@SO zH)$l8BN%2OaoXUI@Ia=@$JZ??%d*43Zx01{w}d5p3(JH%!oh{&w^FVRY|-6@u?Woj z{~|R{zxE;d#G>=Zm9ma$pNhnH#WFLqDh+SX%mBTBt(PXDt$7^NZ43v%mW1YN(^eG6 zQi;AuXq2ZRp>bX|D_2$)uuY+lZ^#sDz!EX6>3Egh`+bcMtz4WlJ zWj#l~2rG`1K*+@=lt9CUd=;n)c^e<(Hk67VO|Gp?oAPr2-R|y|WmV9u=d7rW%BpsP z2$r2DV_pauZZpW72+774Rei0>a0s(XUV&L@6%r8Ib8egcx6>2$a+-tAciuy|YRthr zj68z(F}!)Zc{sxg%)9Fe?{48|?^}0~!NpTtRnuVjD}u|WtkWS^S&a~p2t!D-l)e5^ za76Q{M~Jgm$6!%bC&V2nLUajqxC3^cFMrbRT$gI2GcWA{?rfxr8mS0y)8WZxXIXSR zS{VM}kcJzy&vj>f7+d4IX#rh%-3+(Y32=Mo_?RgFAh5S!RQn+Q-a(@VntJ=2g|C+$ zEIpY#vpabio}aGU{|lFL?NC006{uOs0Zc*Pp>S-g<5qpm&QDkZY?%;}H3*3%OCez- znc$IN=ISHqX-!H z)Jd4qHfJBJQ`QO+or}7icmM)Gzxa&`<#KI=te8e8PVcPjop@(wb-#3cXL)D&%jLb& z#r^7=BUCTXd!t&p4ifz@S$7_CKQBpTziTeW)n>!e)l1>p1iBP_6`+RUbOI$gURTv+ zcje}+mEhCBmBp2#e8cvfLyP=*Z8qnAPQ3@Jr9^)ZVpQ}zZx5Z_J^JjUcXwa)?4wh= jN1r`}caJ`!%1O^M^J;lN`C;wJ^w~e%^k4sBHV%6hFsF?1r{Op{gR56G(_i;J_LI5&}^nwH;^?k`?KC@m&))wlBRqgEAm> zU}8op5(^U_f`N&@f*}J#<*5==x1ch0;+>rU5q&;Cz2|!$zu!CG`-O!X0{Qyp+s^e8 zLO+Z%6{j$)lU*JGjnF4}3-Mhxw}~3HW8*fg>>N!Jp{WiM-bY zd2AK_;uep1SJHT$>z-hNDKQn30%Dz90eyft@-2q^60>}pm;VLkS6Rt-m<=GxS$&o3 z2STRtmKcP=!$2gHmWnPx(;5bOtT@)aP~kZ5inYL9u5pkmEn>`Lu^VDl09DuUvtAhV za6l8>;W$;CVX832JEjSwLKhrD8{8RUnhZ^Z^zb9TmxhunoCrLiK#*%LmHDnynLvJm z?@CFBSnS|d5K*OC+cXqr6rLUqxbh|dyb1hmEIPY9(8{aj95zKN1Kz?ttp}>rYz9Jd zPfw=l3E6FSgjP*D2rmP-9Bhu&K%H{S3uSfKKYL;u4L5TMNdP?|S&fiburxCEJRy52 zjV3z|Axs2>$TFOitb)oGz{{zINf+W52>~Rem^UFG(Fp{hQ+mJEej;SQeNQk5Z1+=1 zwU7j$w|Vlky%u)bD%AY?fChcq<*GfIQM0I|nt+|;$IUy;V%{jx-m_+ynIz)Y!Hx>kwTU&8{P~GMZgS=;CO0 k9U?rMUE`{2-5jI;)!W4n`pfF)=il+|pJw~l88JE5-xpRvd;kCd diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/get_game_high_scores.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/get_game_high_scores.cpython-311.pyc deleted file mode 100644 index cb994801033d70c153c6ea27dd7ea5f6ac988e8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2352 zcmbVN&2JM&6rZ)%pNaDUqy!3O0%^f~I0w{AimD<&rZl9e0nu)ahVkyiS+d@BXU3ta za&RT2Qi=9ffmAB>Q1wIH`&aZ}q#RaziqsP~SLvbR)c1DdBnG5P9nU_$H}mH0d%ySQ z?JuQLk-+%<`#%=FJRyIg&>y*kF*a9#c}N`M7#?XFmSG^D@>0#Tm2R4r+00m(X4cBW zdfG9)Tr+RwfzLQuuh1-7MT4YBl{mS3#L0`I$cX%b{yWGH_j8(%C-5Z08gdE?q+EQ4 zV%dm>xbFv=Yd7#!*^ElpKe={^UATPd!UylqSEKZKe>F1aT&1J@hb>g%-m_G4vQ*_w zaoKGwE!cq+&x~Ys41{)@2K76_)~ZsB z7*ur2TXiHnn(j~21YIbG@vsuwwwOk2gW2PQxHN#u( zF^C-DMRXHbVi2QoSRa5{MQPX9Q4S+ut~39<)W1TX!uqW!2M%c1h>A_26mJONcj+iC zZ$;y-@43EUI~wJ*+ymD^?nN>IBs#{bFTRYlF62td3~FYRij2(pz!x^& zSR8mQp+}J+LX6Fez^seJWt?B#+~gQC$(m*rPk7Grei!d*D^mD-^N`G zI!t=LY|1e>@PfO)k#Z`^sCG-pD9@PdyPC0bF50upXQqU=$k?ln%h$kURA4MFd&U%Y zQ@o^85Dpt?SMs7JD;k#O<| z&ez`zkDl!nU?E=Z70KS|-q5y)n#l%on_!KUhZ7J+flq)OM=nl&%wYw{eMk_PIL&fD za+5&HqX@B&y?{kU#+rfC_K+WD?6WrawsvxiIe`s$XYpVGNK^tTZZ-fT=#MZ4l@C>j zJsspxkaxZtpgUNS5=$z^3=PGZvW4eCo(=g1Y$+_D_v8`OD)kAzSFHm92zP$HR5p_b zP=Jh)i35)gukSnFxf)KK=*(}JW1YFq+?R8qIT;?F>QuYtR5G8MQ=!R2I^DU_HK&vL z)SM1YD?EOxYff}cpg5nJr$W=&$nEQq{h1MX!&@iA6Q{$Ov%S*Z0_5WVkpkL^4Q>-j z`(e(PhcOk4ZTL1oDkOfHqbzi7KsvzEdDPb85vBRP#IC9)yCtdV<>huD`v=I22aP|_f4L^fX&*@6JPl{pi6?-B9| z|JtIaY;Tg)g(EjzrPFhwD3ld8RfRcf)NB4T1NsOhxdZ2)LIxu(@;=yYB@-7nH+KY$ z9$!VjPk=;JlBgkR@Z%!09LF=D%_ z)NG*aZNo%qx1q3UQmJEBjiCtH2JDon2Ez))CIWSV1#R5AEp=hoK$tXPX@R799ViB> zv<$f%FYdT}Ia5O>STD(hF}*F3Dpz7?cPC)N63Y)=54M;Zynw`pol5s6YD=KUwym9* zUbmYl4WT`4PpI^$iwR6uOwyYpusKvg(*SWF)>m88Hs=NE<$T)VJXf;J9A4ynrxe-g zPK$G?63%siEuAhQsOrMj;L-D(BRQ|z#`#Bb?Am|w_)#x@uJky5s3abY$E6llX^v`Q zC|<@-(m`xe3wI_W8H*8^__W?`&1AYL5n02@u3kXG%C!)fTj=)wezS%jv}eS*MY6oI z*FRjowzuv+eQ_S<>cr}XCEf;Br`^Mw2323{l6<@%(2l*%b-|%3{1T#*_Px3>_w{9* zx(8+~x|v5QJtQ{{&W`Wo%E8%jNZ7&IF>AKz^%?osy;*;I_uC@->9&6VXTMVQ2d|d~ At^fc4 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/get_my_commands.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/get_my_commands.cpython-311.pyc deleted file mode 100644 index ac6a5349ee06ab717502b0868f88b48532761d9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2513 zcmcIm&2Jk;6rWx1`YT?iO_S1;wrtx#lu~R&%O$E%Lt2H3##E#gV&iJM*%>=-c6QCo zxM0*n4wWbpATCfOdguWGRqu#DfKT{chUa!5Rtx!y7oM%xU4`3%se$k7OL^lN~+lcEMS`$#xx zqB|LqaO;B4dH-ydN6WcPh>r{e@+Fpxu8c5p*JnXO*>y|<}DQqtR zQP{PR$Lf0H77c8nfV2T!yCo>MeK)AL+&V4U?^D_0fdG>|!@1j5yG?t(E5!5-w-Ks@ zm1Mg~MG5xD-Q7$5RNt_}rJK}~qGVsH_22Ho@g}7$s64H0^4Qa+Az zA#8DvPTR{;HpO(g?1h|`WEZVc$m?ZzwJ5vI#z}~uwR<7P4@Va0`q`^&{obqa#kjy1 z`$vt7xmy*d?Ol2(^6dpW$lfpSLDs!3vd2rg3{>tc@_{Z%kzcen#thr*A*lTi-ixIQr!>g1|ZR<{-|Ojkb$`AT&*B#oe6 zU1`N*3Pa^oX>hB0xv^9g4M|^Xy50&DzNmJKyPPzaC_@=x*6vlfC^g&s1Z@B5!5!Hv z_0C!bn|K|_U#qBd3Ry?Ly!iRt7jx@{BWs1l2XFpr!H>EwIb9|Z3yYiZ3{2c4suzHd zQQ~U8#PP*&@S{pRraX%(KY`0A#!(()7Lt~)_yWcswOqez$zV)E50a(O;_9mwSs=xY z2KfO0BF4}`I0?6#)o2)${VxY-RmE^M4&&g}9&xTc>id9?#wWle6vpTI%gSr4M@E$4 zF%ZZ{|F5GPX10SADWI|O?+&kzPOQ#vj7_XoI)_ls>Wm>X-$8lP>XT=&co3Oa^^KF0 ztMhBdWO6+=CO3?kCz;U>8aJz2=LFh6w()AYb95{R68g_H7w?+vy^Zo$dNEd}Mim6L z7K}`QfUD1Ol!oaD8BUU>3NnE}{rkYP%E64sXN(DlK0>^ph^0tTkzqylDY73(WGuNb zp${lIPOh!E_y{WDTiJ6-1-!-2fT)lV&|0XI(ll)Yomks>JwfNz{@v9va+=;j|1TLu o+VM4HZ@)U}H#CLbVET3C!P%el>nG2wkDh%N`~3M2o^gu)22GsLcmMzZ diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/get_my_default_administrator_rights.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/get_my_default_administrator_rights.cpython-311.pyc deleted file mode 100644 index dc47504f869556610e288dccdf0113781085adc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1830 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 E0lcuOf&c&j diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/get_my_short_description.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/get_my_short_description.cpython-311.pyc deleted file mode 100644 index 88844bf57a470c7a529c9137ac653b3cd0c8c25d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1761 zcmbtV&2Jk;6rb5$f7>aP1{GA$iXL1Gu{g@|Vrw+r?2Mfy`(b8g3$A+b zp%O&`Zm3AW4Yi;ik@zb(7^#P7Pmy}c%_tmDPQ00on*`hw&$Dme%zN|Zz2AE~eo(8G z5zuen|33KDLg=xY%qgDcRjGQtpZJ*ywu7p^L*C6Tq z513Z(q5-CrJ4;UaF8Ulhl?^n1H)`o}hso~v-;v!qDBD2S1heIqFYHhUX3N+fG6_q} z_7cunB<;;u+Ct@J)1$=fLCm$)(7(wdI}wcAfg24IcgULd2TUeB5_a1QTp`*wTt8OH zH|2Q5L=zkm?T{RE*j#|#4Lgo(k$4^xqFL7QZo~=qSlix`awOWVmKSr@l!xFpV?Jzw zchPc3{&~nF9P4wA9iyG3%b@!&B)x;$yr$QMza z2ob6mp(`c_{Y&lshcVyouf^1lhW+h?yE5hk(CxG6X8(PEvoCzfULU#MHq>174{O}Y z8cDPOViJxQ6nZq~&%-gdUS0@ea~}4KU?ZBq{+^)O5~{uQ_4=2cuR4#a=cd&jjGy07 z@0D&gd&2i&2WsTA^p-%@IqF*QXVvty(pMEcksC5X(lQ}oOp`##RYE>Z+~81CAcV#q zU{!=YX$=HjOTYt6mk5C_BU!qKc&4Xd@#yA&RRyR{S8dlQdn^c`D43rGl~84Ui>qsi zSLdvx6c2zw=10GoVdaW5q*xU#Uzl`vmS3CncF)%*-Kka2#vfLF$GW&%I5R_)++{o~ zqcz;YGqX^F3Hsl>q@8B2k8!R_rNi$vDhkd)0-ry?$<_Uu=HaUc$TBEY({pvTr#XEY zWYAihE?gk$zaT^5jFPlhh0H;5B`eS>uftS9CVm7qGcm?H=#}Zov5Q*Mr;lA!pPn2$ h$ex}Yv;0}C09(wz>rG!>eRS^4Kehg^r&#Im{{ah4?O6Z- diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/get_star_transactions.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/get_star_transactions.cpython-311.pyc deleted file mode 100644 index 5ad40b6ebc64b2acf349c64340d66190e84699e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1800 zcmbtV&2Jk;6rb4-+w0g)Y1#_fKv$HgG6I_;m;basJC@0?R+T?@u#Q4qIH}l@Seed_) zj(;wfiwMTA-~ZPB#6;+KwU~@tCg7bm2zL-g6bC584#rB>0xi@XJv1C6G#wN6bZP{- zFz@6+Hfb&>gqCArq@hJb^S2N!FpK4%nRrL{bc7zj%!X5>)-tLVx7D(WlPNcfV(Cgh zjzm>Y$}3mjTOjjqFU-IDPIEEQ-;6er!j-O4yTP`WojJBFUB1HINVr~la2sce$_fiu zhr8htlWQ^c)H^1_$OOEz3c?qVCqoXV$k9H4d>x$`j!88qM|CGp4OXD$1+cRqTgOV* zxopjfyaEX5G=Ep4<=d!@Y3WwQnYxWW$4+S(O`g?CGPB6!;Ye@(QM6&a&t#8B!j@~y zUXA5>VNW8r)d^efOV0Kq+gsyt6bEs~_uRmaIc2*FV=`Qn}ynJ#~@HfadUPn!DvmIY06v`Einq+ik&QVg`Qb%ljIi2Hg2EV96Xg z0zpE$8`O=Y?~(P-T;35J`WYp;41vUG#u4*WKd7M^Mz!}8LU`vQ2;bs6uqh{c*trMu z0nBV%|5rn`O}wd5d{^7lf5P9S9|JV5-sDe#>3vky5>xcLj3)&`{K%JtRL$i0zVL`( zL7R}hg!pkdnOKCRB_c$q$W=S^cdx$HXnh#-_11h${ixGg?{QbgoB+rz7Jb^f?604dT@E36_n zWP~I|Lc*B#0wtFSxzTfju_jLljXeOa0B4di2x)TzEMQt81bU8SS&zX@reSmM8i8Ha zK3skAY4*xT3c1IE0Lp~Wlo0vMNoOr4$c=0Tg?`k!F~M5mKy#PR{k0h9_U_ zH@9Z({-uFoXY|OhhsLYJGiUn?1LJH)kBqZJ`gQ7y>TCz6=yO_70ath$16^_P)B zb4p36R|VH@;X+orH+U763P_U>{?pYq6H-zMdGq0k%$!xRRK@33`Q^ zaW%1g3nLA+5v|@p)M6GhpINMo?!sR8;4PbPQ@e{A&XF=3IA06WG?RghvQ#v*yngAE zkG9Fyd)r&@?{wO^{&u>5q?I$Bu8hJV<6S0?a5=PoiN$QdgXAKUdl?PYnu|8y5g)$` zBVPk1hI~wsuU!UgzRnE4LN(u{I;&D+6Xw{6S=^z{O|*-teWT{vH_;c^ce-ftZLH<> zHj~RduKnh?&@Kz+%DqUqNs)#tGk3tG8@Qs(*cD8A?uV%>#$m{WcpY4=Fb;%hT?wL0 z0r2GhhzV~VKvckTn=5YCzsf@C!WNv#F;5xwoMP*4Hs&E~xqDKMM61~hGtN9YXT{6- zpxMu)Xa=L`Wk_khJgi;>=XDrcZjWpY=Y7`aKaz_Qog(hrxh}-n>f9vcRGVype}%HQMJJ zu==$#E3A2oET09R@Id@CK{E%{pZ|9IoA#~t{n~TW+9vcn=hXMLH%se89zz6bm?fGz z=mn&Ldj6O)A6Nc0#fB;xA-O|HlF@Oj^co?bj)QpasS-l75U8m_OkM}2I7k2=rmhnL zCxn#fz&-``@>;@NMO}eVMHYO9ERKPG%%1|6Pz8L8Kdoj#)k|S3$Cn@g^zxZ$M#Y*T zC2DBn?BwFX#<@x7(5O##COcp492hSiR!`56T{%CqD)#vq`ai-}VMXkT;Oa+IB-Lp+ zil5yvTp-|ws~<#e!o33yN`S?gt`s-1q{-+9f^h|;g!QD-iUk$a2i9gu_67bbn2G~& z3&c#v7$2aQrmOuBy)u1NKSVD~SNj2Sr>lKtp22|ZzvBDOo!0%+-e1b~_app8w*La6 CZ=kaP diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/get_updates.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/get_updates.cpython-311.pyc deleted file mode 100644 index 71c341292fe07afd7599f7fd509fc8a5297a8eaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2228 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 JJjE&w|3Bm+0M-Bi diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/get_webhook_info.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/get_webhook_info.cpython-311.pyc deleted file mode 100644 index bcad95575519053a71cd618179dc3574676da3de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1070 zcmZuw&1(}u6ragvlQgygl_Gj^@C#b%#&Zx66iU%n=m&)*IGyZFk~N#1?aZvDw;uch zy!GJ4lOo>zD?Iezq2wfZ$}Lh)J^5yLBMtTK?BmUwdGGyx@9lnGSg0eAZy&yQpOz5% zWj9l)`kFKydmWG*7#(E4WGT*M~^ralE#a%hZxv#M;BGFT9xGqdz z^1y~q#a;oyXSYBfBY}L(kzeB2cSPBDc?pU-P_#U1tO|1>IopQNIsw_yf|!1&$uLV# zj3hl_NRTQeVnYscKtu!5RC{Do?5Cj;n#7VM3{VLp6!>4oM5jR@v|b@fm{i4@FwzPl zrgdwNh0-$c%wZz5SLCE2u=Fl~+9R^_Mg+zqYhA!3NJkn1$Wk4~y-T@ryxIe_G)*`& zkQqqs34-DBx?0 z_-*@T*lFv~h=&Oa2COG^yO=|>=v~wHZe|+Ep_+r#nW}=J?}0k{_e@GCjm&7(zf zw0^pH|7gQL>e@8SG6tUA6g~prsq7Chaiz4FFMcdO`fZQ?{O3GF^%o}_ BIPd@f diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/hide_general_forum_topic.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/hide_general_forum_topic.cpython-311.pyc deleted file mode 100644 index 1eff9227768cd60a0b0ac3055f45b6fb6ff9daa6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1759 zcmbVM&2Jnv6t{P0KeL;ls)1HYkp)80R$;dXPEl16LYgAz3Xw!rhpk*^?A;wQGhS>@ zLr@PnRH7i@fP{*~g##*}-uWvy1gVE=PLVkEwkQapocip^_5;!j9?u&;zYo9nd(ZPz zvsp(le*ONp{@)%#e^_QR%J~8x_^`NxIN~@$G4?UG>q1nBi+(Zod@nBfCD|~{l1f&mfZZN$rA~8@bzAVg8@*sDc)1y=H!A0OdgZKsVF-Lx3 z1M={T!t+bK;Foz(RJeB@bZSUcRh`#wqdw-fTMfT<8-0TP`Wl*iTT|KWrI3qNkqE`2 zi&CZWx*UZ83n8F7fw7?lF~d-k*hNH)Btx)(JwfJ=?B-z?j7XReM*7wX(dkI2fs*Nn z1Vd)pWF7Q3r6F;u4cQcgfi923B-BPRBb7C_KCQO(ksk`DZA-NU+B~-$vK#r?X9Jed zm?dl=s5@Ps{g*=(4u(eOC+G2Phf(CtPK}JADgle49TG%R3r@m52@Tn1n#hqz+T;Ua zQk7`37)UM_udl0ATqiPt%z{8@-L5-$)?}&zu}Fr-jPzos6G$c6=BS8msRkWLT6fqe zeAU7>$bohkxtN@jY}U&DQ-s4A*Bc*(iCG{3)3vN((V-#F=IOCzqja>xSpu2St!<_T zT9u#=va)iyWL{S$BCxGyhy7ad6f6%ez~Wnc2m0Jhh#q#7-cm|gNSKOsfJsN zpz(GOdv7oHu0ZvB%aVu5ptqH}PN9HkPb4>b?}eK^9UAfahy`2F2fD{XX)jMF?^WHg zu+k&UsRKRlmG)>yorGgPefd}z+mo>EJ=bj@|LmgiG-{stYUT6QFIVq3=JpzI!TjNh z{hnLOxySSXEKsYQr`LeB%hA`|3z!gL+6i`$4@0gX%&Io|Xv$nmh>@OdnV_GPimO5jJ z%k+d@Id?Yu!|M6G02kD2z*<=J7eK~EjPV2X%HFecA1&-Xf9@l)_v{>(PhpG2@$|dy S&u`qHJNKs(|MeUt7waQEneIaX diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/leave_chat.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/leave_chat.cpython-311.pyc deleted file mode 100644 index 8c4ad6abdeff8d0ec926311952bafb801876c8b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1503 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 G^7vnCW3P_@ diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/refund_star_payment.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/refund_star_payment.cpython-311.pyc deleted file mode 100644 index 9d31f7e62d79d64178f162766154721f90e098e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1601 zcmb7E&2Jk;6rb5$uRmft4Iz-0uT?`47GQJ5ib^4k0wT4lCQz}mG}-Kooh9pCGc!wZ zl!K8fQKZ5R6$uU;P!Z}KiT{B^D)nIPDH5mN7KH=qi8s66q*Z!hJoEhCypMhF_h#nT zTCIX${Ql#gy~IH1FD2x|%ou$12{3mMMHKsJfNhKwuld?QxAlQx8zAe{@CyUeHZjuB z8lr`ph?>k~#j|-dbXP~{9;|HGC0g7-jnYFUHgG)S1VJbr>4kx4XmM@x)2pjw<%89g zk3Q_I#rk`}=poK5>zmAHeeMjdFu4;_H;b3iX?T2e4dkyOX@+b}k*$3U$=f;lzn zlj^KUjb*SYL#n`=8P7_*LaVn>57U{ORl9r(eTnVL2Fm{%wRr9t>qPtC97{y5%Y^7fzBSBDEHALO^0Y1GE3D-mDTkunYRTq+wcZb9husjZciz6Z zMVb&yMm!K!+YKpeZ*B63ZCPQEhi+EVPi}+}cUjxYBe@}GO*uuU8S;K>JCvg3480|u zW-Z{$)0ENx@m#k5ST(Wk1u`y1f^p)}SQnDV=kl0j>P*}nhxeH>SR$tYA!InBP9Qy( z?A`!7!3%(NZ1S|I*yw}-b5%3d&|s;9HiHm8x&+Mk_zrB!Tn{^UVcmn3jn9rXRNKe< z8pS_p`}!~VyYyJXkzCWz>mlFmu7uPJ`rX}#J2K=1knXbJi|)F&-4&i>Zw(!H z*Xc9Sb-YlW*47|BuA-GePE;>)Je$K2Uw}{SojV0)Gtc=2(2L7J{vD&_IaGV;+tqK@ zZm&J4zL+4RR-Y`sGI?V)DFBxQ=FYDCg^)o=BVX}VLOzcif2t`GLPHm}jqNb>;~GGkwj6MR%{n1)5=jOF z$g?1y+Pcy~3^4s4QdVxM?=j)( z(MxmeG|CFEUIf<}@Z#!yicL8h0wh_z>D4f{9k_2r<@Ivz%I6iAMp7j|DlKQIU*xZW zsIU-wKoT8eJVECVo}7p1!okz#A+iphoQZiJLjkAB5A~nrgT*)hR;quVqEB=C5A-sx AHUIzs diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/reopen_forum_topic.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/reopen_forum_topic.cpython-311.pyc deleted file mode 100644 index 437e3c671ba2dc6f5b34e8575f08c2d4b81300d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1780 zcmb7E&2Jnv6!(1WXLj>ZwWSF`waTH|5_S*Vq6)R7Aw{$iqzS0QB6l+O?hct5FSe&8 zC_*_@qDX)c66ygC98eMJoxgzthpp5@G^a?MdRr6@C?}ph*)9!m!0UPY-m{Z zC9h;58?7K(xQl3!l~{RpbRv4-AoLKve0UXFx`7(yCt7S+*@T}YT=^>GiEKDoef{QJ z%Vg>5^3t1ctgd9vr)#EhCkIm_k7wcdRJ>@Fv4P?4@y-gi;A#aiNVB?9sdR8M#Mrb%%>B*iCcGo_|{h z!|;W`Pe|-1ewPvBU0yhLpa{D?B^Pj-L`+H?Dhw$Y7lIj&ykkUT-Nb85r6Q4dG2oOf z-dYzayM=iInFImYH>(DV8$1;OTf{x3`f{<=3bCGeqob7)A(RK8b~ibXvO2(N$_*HSa*`0}LXtxO@)XG97YX*d z+MUKgTN=~@7DZ4gOPm3%)J4A}^m8Zlvua3LFMJIIFd6@bwp%C4eWCO diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/reopen_general_forum_topic.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/reopen_general_forum_topic.cpython-311.pyc deleted file mode 100644 index c0131336488966febc123a664455e16f6f7af917..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1782 zcmbVN&2Jnv6t{P0KeL;lswJ(IA`677t;#Oq7*!P^qya%Alx$QnZ0kB>@9vP9@nX*; z1oe1=x!0Ad+@m7*LYlHT>Fb^eOi1YiROrP35zzLXJeTEE1tu zbXlq_?#fXZuq_CwPGGESLDFHUNo->xsU*tU5JrMXYQf35BlB}01X~g&AnO}nL}w$R z21;fl5)4_|Cf%VR8!{zvrc<&Z2m@Unhe@bY#Zsw^aSA#{+xT#2!=c+!ZGtv;mP58> z!V=_sz!Dm>gbf6>r|a|oa;U<=FxBp47vFXmMfU70l`)hjU{SO~vSb)?E)o*L zHRwR%y2D1{D-OYdL){`}BeQPuSttEZO%7*lvwRdL=>-CCUCS#5B^vU)MOTlnBc-Dq z&JxIxZf-L*&I_UolDmcLrQ z-<_CKT>&nsSAjLK=r4hcix}ev=;gg<=RUfy_x!n!$lkMa cTt1Br7RS@?lV7^`UwY$DEB@;_N;cMi02C7Uga7~l diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/replace_sticker_in_set.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/replace_sticker_in_set.cpython-311.pyc deleted file mode 100644 index ee763ca3b4c29254651c3f7e24b654fb30667d8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2050 zcmb7F&2Jnv6!(1WXLdKCNmLS2F)CDO3+xJxs|rz)5Ejy?YEmIaD>;*~lT0%^v$Z`< zgL2qPl_*l-hKdA7R6cs=$X~!Am3kP>DN;|lEeZ$J6VIO6Z6ksNj{Wldp8fOl?>*1{ zSgn>3v|qpbee;6?LQmyn*z&2O9dCg001-qqA9Xcb)1%?y#zLj$2lFw$n1Nof_;%SUor*OD?z5$jm;8qmb8bP*x9d2hE)UF_I-H_3S$f~CivaRMuD0tK9d9P*J$Vl-52undElbI(A zL)Q(7smB9G<1IQa4!*Hn0gPUXtPrh@TO>%^Z($aXsOA%Rlu>_p5FA;XZ44h?Q~mc5M*lmdOb z=eRr07Ui9+h?`jvH?ypaN++wB-X4=*q0i?|;kq%rgas@3#~}Xdqrohyp8IO?%cc8E zPbzZ*l&{v}mtT#iXX3dxKpB+4psa&3ntXjQHk!(nsY7bVfQIUol!z+mDVgI^Q;aH2 z(yFRLk)u-0rlf5eM14%sEUO6Pq>OPlB#|%m3dT1h$ImvuT z2dY0dX9haT`TAjDYJkq>YJ=ir35fkaq9nJey(7WS4TE0+UV+Wc2tF9VCX>GqNnY&r zfUuMe_2P11p*(%E=7s|=Ti%+TAHuM+Qd6jsoM**LX@1^gZ^Bfv#_xj|7@DTV=={OS reuyp{oYoJKb#SuBC#T>YRDQU{b)?vEwjO``+VP?lI zK{*(yf+7JoR3v&qLM^CwuKWWW9H|FuPeGh|GYSWk6YuS2okj&AF&;m^uX!`?_uh=} zmr8j8wZT?u+{v!D=_ED)BxMOcm(cyTJ(iQG#O@&LZ^FiT9mLMr)3C{~oP zV0oS|Eou8+P^)NRY32RPm+1U!m*(Gmy|xghE_fSZ_N@-uEhp5kdcZtVCg0t9A?Yo^XrGtE*w z!?bhYlOs$AKE20hfY0vnIWx=hAQwh*juk;J#WK%}GRwiId{<=?w@FiBhi{e5!fo=g zVivEEzjxX~-3cDdOqb2UHaba1IP2PZUHQ z00zN~)v-?`h&2FUHv%|{5RNB?edKq?qAt5;d-Ajac&&yRTt#gbra%{F5OR=24%#Cu zJeF8(x16-P33J*=xGL%yccgV1 zDlS)7!+h71wnNdOqKZj4k9YZqRbakR?!XO~i5)ce;QIi+@%V6LVd|!`scxn=wN0HVclFKm56aiky8`z< zRjcUY5G)bnNDdVYl!nU2+1w^}@?Tegoc z$xM9rf|;aU;zGuqRPAhtW3bI9N1sH!n&fc;9D*evfAz?4nv|aV>e3erUoJc>P7g_@ zR30389_RF_!P&P5M_(KkKo=Q?MRNG$urw0UIW{1-0|7~;9K$gNe2nW;$VK2{5o3fW zki+f}Pa{E`q7D%FREuYUR7wcDXStlxFi)xLv#x`DkcczLd`o$PBsac*gIxa5QMptjt5qpvN;b4y!B^>S)EGchDndU-fO&MOy{!8_(~ zY%&Lx`F|vbp`v&rB913HSISt8W*44BsD?;^KFlVMLYS5t9e_SY6Ys6SKX;KqFCA<= zh#x9#&4PCeE;JFRkVKG9BNuIiFz;s1#WjCLoCOi_555O7Oeu;oAjkU$=QbJZMV|qA pssCSdo1Ew$oC9L?56)q_ssId6l5daws6CuI^9P##{0DoK!ryvUfl&Ye diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/revoke_chat_invite_link.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/revoke_chat_invite_link.cpython-311.pyc deleted file mode 100644 index a24d8d83813dd55a791e5fe18f0e8552143b787b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1943 zcmbVN&2Jk;6rc63zwHEyTLDech)76QgUywws)|AsBH9QgsVX)`)A7#O-g-aG>^i|H zha4(VB;baMM1?q@0O}p_M{sbZ9-=)(>M1v)AcS(_&5Yf|D7`SAefwtSy*Kau-h1nx z%jE)s@!R)*wEj*b^h_=$BcmDPxCP8Z#1Jz)y@J?sL@Z=h=7NG_{JQlvo;#x!=r zAgY>4dGq6smdVlw%S#`wuB{~Id%++{-wxpPD5VufhpVCuEK^KN;i8jpKFL`2s@Z$Tk?VQ@0^h+vJv=W+^+vOrB-dHIT_eV8CZI&vT-{ zN)J%WV8#0-JO2QEX4r)dG%`mRv)t2IW!u6>bXgM&Y4X_1Falm(;Z_|Dp`T(axJ#T>9 zJm5lFtl>><5BvQn#!W77rp$K(H;O?b6yS%t#{qb83)aeE@N_2>U65v4vqQIKETG@( zi4dFu>;Ew%+;%69YIvQ;eGx=TdhG2~ur$Jpjz^GajXO&7X{K zRO>>UnQPUQm<3_+GLTM5T(5 zNCqH_dhcZG{l&%|sE)=`$lRda==N155x~2_gYCvmx7moGPv7oQr%T&BYK-$-*L@Jx zHR?p8s`@}Dyf+Z9!Zn{?IS|JBVLl63|A#dydt>@kZMuF6;PiOk`xH>L)P~sUn1nw zKJ~^YSwdLo0CqXhNy@;eBm*)aIztFlAkl%tdKT8FUp|nviDl02r2LX1-i^DwEzGB diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/send_animation.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/send_animation.cpython-311.pyc deleted file mode 100644 index 54aff8fed80c45dea99e064980f7deef6f997e15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4883 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 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/send_dice.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/send_dice.cpython-311.pyc deleted file mode 100644 index fd297ad9c402bfa7fb898fb94ebdb819e471f249..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3369 zcmb_e&2QYs6(8=B`=$NRw`5ti=&!mPtGkYs$cT^#ZDm;vQptj4Cn>!GL+y+tTI6y& z4Yw?Z zg%Be7S z-Qjh1lQpf~aQNMZWj5G*Y(y{CzO~CAfhRO`=3g+y-}ONhWIwO=u~a zWN9kD4aQkQ6)i(kAg6nBmS#ZC_T-$<=X!DRjD2TzBpx!*tN`6>qo6+=?ATs&WXek5pIzXI_gp7_H>Q%GR6~ z0CP^=_PnM$SFP3^&MMv^eku;%s%|)*TQ!>IIb1P?J&Ar{21VTBK}n$hj@j_0RoCO| zVY&{R&`r8>Q0Rup9ibTAXt{uV*VXGzqrvJJK4ABP84R)>4jisq_qI7RC|HDwIGuxH zZ@dl1vDU+3I3#1kVmidCxoOr#yoRMFcRUy!XYt^44o>&F#Y@G`)9PV#uD>uL+uX!{ zu%r{cF0TaHdf3k~jP+(O?hfwsjN|c-3-D?6n7DqWF^=nL^(a}u;_~rycAO@1lr=en zjWT)*63)O~7mm=aZ!_D_*~cC?!jpz&IrnvRkJ;GL@0)*}H95qwYJi_6`fh9=rlJJC+I<+jpJwbSiPJKN5+ z`>6DJUpxON>9^t@fgGM(DfjU)=>ETN>q}Bjgo@j0G9G4h-E5eiu9u79;0v3CleIQ= z{X5RUUxS5(SzQ+atLttNWK0pgvUjk2ZLao#!*^;64!W?m)8dBba2+DC#v1o(KQ%XM zuIaHKG>!TWTp4cdFzl;wdU31hd>v!8(%j{jVTK0-U3XQw+xjsyyE>46?vZGk6i)qS z@mEW~UfR!3Mx;%pmVFufF!g0Fa;@3#OE~%eC(ESeRu(1?UqN zfDsuJV@VH-x(=xjf(O$$$R&`E9tvQ4TqNO>=-6<|prRL3Tt*SSg|iBL)R|=g0406} zT3rl2cH}Cy zuO))ncfQ*4=WldoSNCUE_ip&|YFs<=Y9KEhHw6u@%=+@MF9XHek!J(>a+D(3LZlF7 zAR-B+a74ZlVu~n^99+5j)rBCF|KsFi&sX1wl8KoVsAp2&B7qfSuhbF2uBj-MRIW); zhP+mNJo4E4Ti$=jLJM10(Psy#8i1buJ6x@ZCrjXA@KQ2!EsN`<3zt z;&`(KH#*>$CqWUW;OYmg#$dus%<BC?AervzEp2 K+kayu&gox?;*pmC diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/send_document.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/send_document.cpython-311.pyc deleted file mode 100644 index c99a437035432764cab14a8a697cfd345f8dfbb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4371 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 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/send_game.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/send_game.cpython-311.pyc deleted file mode 100644 index 6119721e256780ea937e8fe20f849a4f224c01f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3092 zcmbVO&2JmW6`v)S-(UK)W%)yE$Bx5TCH>Jzu$rh%ZAT3v(L!W5>6*f1#Tij+EqB@3 zWgP`Xp#lNw7Huy@kpj)3hr)HC9&#%BC-hLD%R-06o(%Nl8w2N1_|*4iMcNJ&w9WAC z(|hwiW_I51&FYVZLYBbz%kTca`Rfrv{)Nh5BqKq2@^cVAA&fA^A}vK%6qI9DtQFVe zEmc=r2|dwD>Pa~tw^FUNo(5TE2`kge>RBl#tz0Xw=UWB6&?@Rhm`ky=RcejsBMOO; zCBiZv6PD#8yl`x=1M(nF$R0e=&_`Krjg<3`Q7tQB&aiFAGd$C=-Le`MZv9~O2EF#Z z8`s`>yS5a@-?Vqa^vyP!4J%CCwn2cX#9Jn}*yC7~BXyl`8Xe0k$HR%YZOgRzJA7xu zF$7yN#CE40rdGJ?8ciOS-sNp;XVnl!i+fzSkCiAx@fNpu6J}Sqx8<+~Zf-E-;S!=e zSq0~x!Xa{^D~#x|+i;kAoU3|*#q=bL^AuBGho}r;36PTqa!OCLH0YV3o`EAuvD{G4 zvOMU8NRJVoW5oxs)*fz74n5CG;87e#6lBJcp_UmB{mNF#4zIs6l#(kF_k|b zeE^5HhX)sB9+hiP{STgFa@WTqPd+YAK~DG`w%^Di`Shn5rrjr-3Y+=3s88G{A1eCf z8X5d8pAOS&+-6HqkdOAV8jRa6*Ssy$)u2RB3(a#h7d$jWYl2fnyJ>4~r_q3l&VnCD zqo*x2EW>pdJ}^uN%UJPt+T5+QqOw;G%Kw1|Sq1kx!se`!m8-2e9ns(m+Lq_F-Gyqk z;Rs&w4$x3>M6hqX%z5y)D5Fh91RXq7BEf*24*A zy2ggZDYTKfX*Oglg{8J|JV=Y_JvgAJr-os&hwfnTtai{i>(8ykH#ad3RysBe`BK-c zha&>}h_;7~^j!YKI&eMAM-i>4A+wCP1&6(Ib_?2h^sWo9?>4r0%b@&2PZ;5G!?K)v z6c5?7oAjOuSm=0EW(mimWS&C@=VP*RMoa;u#Wb=L$W9`gL3SG1OUPbEb{<$bP1grZ!Cvf$713Sz-fM*Y$ zXxtrISgfmbW8HXH?Iya(ZmOH^X1dvKjwzq!y7@mSzmk_ST#oTtIVUC{TpU66|Gd_p zNI4cJ+)kT|Fiojxn;xa*VmS8POTwXAo0NXd6~rsBr!YgQ>^Mr@BIww+!?F8x<@!SX zJx6TUuQ^z~`gTVco+Bu?SumFO*^019)Sfmv0GUyw;TR|^@{_G13zF$Hce*F&Z zq%<0a?IcuGu~4|6ghqo~7GO^i7h%@LF8GePgkGZqhWm5>0Tw9WvtK`^CenR^EKep+ z?5+fpGrP4%>d5Z$?($ET1GO5cQ@*60I@OPnL@gG~Ui8&zUj>fTQ!fVUMsWUuuTJ_Z zaHO7kAyDrI7pgKAI8sloVurO?F!#o1O@HxbZ*FyeZguyjudYVaQ&$7Ec33VJT%PmQ z310<{)KljISoq5P?y|4WN7Pg2F+Yn3m*+n_7o_vQKk?A>wQu(0u`9{X39v7a`RYuc z#1hG83~Zn#|)u4I>wiGPh_-oUD>%HFM`}>RU-{TJyGIqSbj0r{@~)f5oTf06phnxepQ9?tLo__xjd(#xMq^A}&?B;WZz DOtVGw diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/send_invoice.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/send_invoice.cpython-311.pyc deleted file mode 100644 index a1ce63e2bfa5c21b470e710f3d4cf8015a1972d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5305 zcmd5=$#2}&9e$j7vv1l)`!d=!wlpJIo2}Tg1IJNpOR`!!O*)alP(wE(HVUQ0Ua(?{S8b3%3c-0xk8^ zr|*0FJ zNOQF4%lV4_oWB^z1z4W95G;mrA>dT>6~e_xF2cCK5G}@Xv0^+IFD7z{VoRiWOZKcBO(OZYgqJvH}~DstWs(mH44lDI9JI zicpj^Nm0M%oc7{(pzuDVZb;feSEmPn2hNzU^o+~}NFqB)=F z$@xXE6cFh}s1+ij54isn51it`Q#{n*VJIJI@Mtb5#z4ni9TF3uTU;Gx`K_*wh;5MH z?&>Hj-{I;Q(@9syneKFTg0>K3NEUERubkE`3nUg)pS)$L68ySjtv0aquP9&~jl z(?hQAVmjsOZl;G_-NW>Vqdi3G6-OV#!ac#oV^^+E9D@;!x;6UQ498tPAWlI3q^k$T zDbQ)R#UU{&o)OQ=-0!C!!zw?)$INLt#rmH49wmp_UCKBmr4eNY+WgL+m(Au>t?aM6 z#l;WF9w#n*5YLT%NFH*zvD>8iH@##8cIr-t)*7-1wmC;-WB9B?u3kXSdr9B(b+kf#twQn z1??)5R#i%pmuMav7)@@cYGkgSL(sd+_a4q*i`+yH1QT}n16kA#tf(UnBzgZpJC3`(@0QDj9V=9lpwAMxo7KuF zlrBkpsao8X6f4Y47PuGHZ^UYyeoh+NR@Irb- zR{6bx^ibY~1?muGRRF?+*~@!!o*BNCfJQVaukrbENrUI@c+efYv+Ov7=~Tnm;U>Ck zBkk>BJy@F_x5_{H_>R@0ptGOcTlG}?FFPT2tf*6?=o}bfQK~2sj8zivz;V-hS1p%# zHGcqe<)w$3B3OMwp-_InJCE=_|3HS#Rn>Ubiq-Bk2KTD@M9E^hTNwfqQHBvl5XKP3 z5hf7eAScQcLK@)=!ZgARLIxp=FpDsUa1LP}VF6(Y;XJ|$!X<=N0BeB1eX_53zH%rE zB~8xr_Z|q!zN+}JjNjSD7TttLB;WMXLCC@viU=Xx^S=T4CHEN|_gXU_QXa$a6Zmzm zyKas+B*TfQbDwgeNB01FbuS>*DWFgH0s3`6U_cK52K69dNDl#q^)O&Wj{rvXC}2#F z0mk(>U_ws-w&*Q@t$Hh9o8AW4uD1hr=pBGbJqg&UcLH|lU4Y$sH(-z61K6wg0`}>B zfc<(u;D9~=IH(VP%IQPD5}xP3*NDBzk=Ve`uYI)kv$dzuew(CX@e?q+hmHca7t)?} z_I)DRKFsx#fvKaLb^v*h^rWCf2zi+FjvRH{5#&+QJ^0CeJBBi8Wc?X%iXiU6fCsA~g;n~j^898SR&)Lf;&O76}fP96_yulgMYxXOs zE|T%{#@MpiHfmo+{o)cZ`5ab^q^~$nd=j{`Z@ZAO&C3|u!HltO%oy9t{aB7|XtX`Y zs8h(8TeCD~*`t`oe4FJm^Ja`WIAhGlSq_lKSR#CFC;67w0fN}-ds{rY7^b~w; z;CU;|^To1Qh4Y)YqCEdzRVXxa0z5C4^I$M>sAI)|uoppmf8eb+&%+xY9Dn%E2|5A# z!a8E^rqQvcwV`ny$mkI^2QBGNdR26nUxuU#*rP`Yi z#f;y;CoOow$&c-!zMxGIq9oa0+c1+OwasU=-(XRv{U&{6(s=Dg?Z*2zOgd@O4ueIV zc9=A4(w5qKZTmc-rul2#PBql%fm_wtr>joWlqE1IKS@D>uvDyuTjyX}MVlP7ht$!(80HO;0Bh*780n9h5!S?KDdSxkP{V@}Vq=>cNY=`5z_ zJ?6rBgAN-M5Tj1dH=3WBGia|t0Ws=y4%2r$I6@fp$p|s|j>kNkHE6d%0Ws<{i|MyL z=F+9F_KnqB^`)(+OIvs&x16ZcEt77(Y~4ij+!A{b05R%x$)vO9{4(B|Whd%%8QU*- z&2!6Njhn&f=lx%3Mry(KdglG#5P)wH3_4^JkI#PskO$K5^}WWy0dyw&Me+;nPf_DX zIb-b|BfVWuZ$C|M8??)yfEabUZF^YpFbO7Ya+CAnVKTb_Hx%Q-C39vDW)Cxg6*1E@ z=9vr|0EI)kAf=xLNfN#GFzT+wZgdi3OHeZny z^b9MWFUatXk`bMMGb!jW@coHj#0ols5<@^6R1%m)cLh~aT2V9SxQdJo3Ekv4c+qjx zRpo7vXfx_x0BkSEaV8ltUW{ktqVfIW8R<1%jAvxbcri?}WqendBxSr9wm;|LV7*?B VpJYDodfJx$hGl>IFAA~w{{y7kgpB|I diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/send_location.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/send_location.cpython-311.pyc deleted file mode 100644 index effb9fa519a45d05656a1881cd5a5a794a9b8d05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4006 zcmb_f&2JmW6`v)SpW=roO0p#DVbEVLJNN=sclJ(>?U1P*sQoCX{{xf zon6|N!Gj6}XbQANfuN1i_TWR{x^NFU743h}Lk~;9hsE|{peNrpa1Mol0)20mq$F2G zgEq_IkMGTU^R@GSZ-&21r;`MpKmO*g>woJd{isdy5NR_&b$tFTPYovub#eI~5S1Rph!(4eeDZ=p%NO zuB$b}E=0ZLb(59o`?P9od)@C<481~c(Csx-W!f#3ZPlt?>=v~wb%T0&?)8TCVCDO? zY~H6{mU}L%Of6HJGV7HPjGMVl4Y~ofx2U~oY9(A!>&XOy@cMIb{xNI=C9j%Xn{s)cDx6W<2s1koZONB7CGrVQJnCBT+!>j|v`^i*3!1rp7aPCgFg3t4x9HryY$<%cKj2v zE@%@UXXL(5$U{NyUm>mE!U-?6LMz%$v&5tE(VvqNJa;TA*_*m0!PdhbOSUOl;3ZW} zy<$sd1&mZGtJNuKsUlgmQVF7Kl2?M8EzOk-)w1S3QgsspWy;>JQfsOlgy2*&6hD%n ze@5*Zt59t!$;VwWYY@nD(xz=!t-0yxlF8_l-Hf*>lWk0|nYJ~pR`qe5kI|epZ|kM7 zs99oZfag^6WZ#P4X?M#%!hhex3?A5pv+bn)Yq)tOuNrD(==ASZcVq;HG?XU zO!Rd<*g`K0t!H0dhgW31Do4k<)R=rM!c}A(W z6T|M^wsX+`VHs#rIwbMDQ5htjNog;e!Q@iGaOEJ6B{f=Q6c$Rg+mI1+_bk{CtF%eW zszM*yO!bbchG9NXFc#odDi3rB;2OL^o*eT*XSS)dHcZzFX*LL)WWxv&!YINR!Z^YN z!f}L?2&WJx5vCE&0(is9%D&iBl@C}}OZHt!EA+6ShPX#Sh4*`bjVL-7i0!Hc)z-T=R z7^}wsNdLsLp|!*A2U;}#oq*z^-q9*>=1vJq=$ZX?I#OAU3ifi^hsAb zvj=Y9$m5tFhPs#iqmTRi2wJ1$=&{EIKZbIgoSb(~yyGWONs{pk&e)9Kfl7)@yyYCb z0Z}?f1J4wF;o#s&PYBtZK(oK%fITM%t9#neC=-DS({|L%`&3^k)86acl zozZjtQB(%W@Ttc|e+cDaa^_vZnOyKkP?Lh;-L7$e9QA|i;_7R70io|FbP?8Wv5IBu_9p^HaIH9@3S$z!sIJHlp#QDwp<0LO&9cTJ!lsMga z3*WbzFp?{9Yf=<1sVHSrt3irZyp*E+u%;SKOH5HTvjkzChBjUr z1b!4^&QiRLqQDskNeWM2(6gZL-5A05Yw!-Q%7><{I2ziyi;1XWK;k4g7fRGHfQ16P z47C=fn{Tr@^y+Q_QpH+?+YAKh-p3D#k+@F~Qlw{a=a$9$QAQD zOFK(HT5`oPSL}9pX^7pfIPOlKb;JQj1jN!1&${B8d*ZYs_BbLSmWFuR74NyHrycQ# zBLZS+h|{jP?2b(tu&b#lz;Px#ws3;sCKU#93E73j|H1{RoNVd=iSJ z_uxyeMoGjJ-Sd~em~i8%Cxg#yN4nsLLo-n@&qTjMaKsU872N}D8ug>$$W;M2e`@+! z&olckDd+pLvvAib6dQ%&i$amVER^d~z;=1iyIMot|-LF1dv>?nJ@8 z@D|GR*Z#EOT>qdk|KW@I579n14@=1Pz^{AmqF*?Z0Q&xKkicR2*ll3nY6aM0p$ECM zUW4l)aEIYPDK855NZ>~hv3R61JUCelZSmHT%P_pXOv%vU>NBMU|B)Dy!He*FD1(!h zuoMDPkKun7mPNp$*b~=Oi?S}%dAMIhiO&luup56n;PX8DE~v;23;szGKP(7>OU9go z7esoosTuu&5ARW*4htt zc4|;B3baKJEmEL4pn4Vd9Pr0@x<58_c9nW09xSJge(X(<^7g>~)9N*e%vDx5LpJwrSYx9k#vh=$tO< ze5=_Ai#O~>(_3WJ(BE!S!wHA`1M^O;X))V7sI;=_c+SCrcMZy%Ftx~BSKnaah*<19 ziyR)j#VqGO3yVT?Md!N3JjUIpQndZTZDz6!7+qxErbBCZKHVo13DUD4gYwTH=8UKk zC2H&r#9oavnI-z?ttM$qP0=_@Q~3%QW(ZAyoZOdFYKEqvpXv3p5WO@V==BF^4*L11 zA0sSB3lCx4$GB1PsCilhjY7|&AUqEC`b9bf^TRz4gTR>)I%-INDm{c~J;sPdo`%F) zV=tgNEOt2_X|fT19DKs(dHaiI04F|A(-WVPxr8QMb35|SsA7QKzNzxS@HSy5f@|Qu z4qIc23k*`c?FO4smTkpt)@q5@&)g0SqHLN$dg}xf>Z!H|!KPS!GfiQRq2ZcN}vq z9HoYlo~_w-T$@(GFHR(lhx^ z9a#$pITk#v(JL)sma+zCusWl+pCJv^qHrt?6ECZGGbOJFFA1L-6Dh6Uje=YghHjj^d#K~anSa9~O;Pk~{>dio@ zpm6HdV0s}qbE#7T6`|J|BO_-zt#q9MDzJvd=T%_rIhN zUibYx;xcwILb#S-Mva*!uukH$FzO=lf50!H7XAtlFpd*{ff-diFAh`Yc|ACL&X-HR z42Z2Qp9|!B!MTbrPxvw*wzgd9#7JT#7R13D z3@%;@=C1vD!@vGsd+z<+x%YAG@*K8TU+)}0l>t8gZ;-)N#8N%rZ**h1R6dH7tT*8T z21@ccOoU0e_7j&6|SDC`StwxZ~Ox`v<-wE?45D!T>}mn5E$buHU>kMG`5=dblGk^Gd=0< z!D}=JM_MVYltj5id&nMEQACKyflDGTkvMY5p-1we)hDE!xD8?tkxzNAdS?6+kXHF= zSATw0_1>#juikrI^T&8RO5pkH@BY5>x|@)HV5ji}JwkZ*dmz3hDp7?zDF~7vAnnWh z3Vz97pb{+vq(C7k1q&f5#OM6^a3LZ^fTn67A1$;H&OYMaYsiV*-bpl^V4d+vZE~!f(J~B+d`o`yJ3SD6oioL}R%D;C&1GFN)LF$?FPGf* z>soPr-e3T%uRC6dBso)%wmT5 zM(|8a+-7;U3Zt{kTGQ1W?!ECOJVJPP1orU@I6FopK_!y!4xFLnXH*KPJ}IdBSxBYl zfH^|c0MNlY9g@Oo82XWBKLRHZQd_*fkFcm3djf_$Lu2?OwWx96h&3f*Y6AMnJrb=4 zB;sltaI`li5^4wZJNHPW4oD=`F5pNtC0eOSc8ap7i`qX|+ z`16q`;F)K5%AWO|eC?yVoP3Ys{`Ef~o8ndt?8<&{l`ihZL64Jl8|Q&D^geIaM-O>PKHDq@Ks*3qk5#AdUa&Q*O%wE2{PIeDs&72+tjp ziPoBCiV$-UT%x6mCNPN>`@(`T9@1t;yipX*axMq`VPI#-V~G>FykeRY_Z3aY@XT17 zC1z&oLYewH_eD@{Fsp17nVO06MHlokWY~nbW?3b3BAdZW#QhSsF9l7}S?_x#Sg-o#6vo|Gm)cS;Xz!D=X`~#F;yZrjBJ@&o8;1 zs%9$7c_u@t)K;_{FPCnzWat)b9-Ux;H9JR|V%~;Oc<*9Of3TGmlmn0THboAUt|hnC z!1^hJ!|K&+=U$W9)BnE8IxN1YS{@kms^ze_TcyFDF>kqoSD&LQ1Bb#!nR**4ecJ;Q zPT0(?v4SE)L>P*DSjp%04H;ueE3V2L8U%mYlDQVQXP;X&Q?5Hub$c4F++fSFw^i0S zIJd(yz|!SL*l21xZXAK4V~7X?2*(jlBBT*cAq*pA5JnKj5I#j12XOo4h240U<XHH`rB1ikcf>6{MX+$hvZnCgJHg%IJL1jKKJui-OmHRfUD3B1qX^_~aK z8P!)2D!z)pLMwqvuo9|-E0IdH(o%_4;*~@tsS4jDE3JPJe$6ik@Im&^rIW@XP-FBV z{I|RQ6G{8rfLSgv!wt)_R@5w6PPe=5dmI2~mtT?P|KX~}X|Uam$TBZ$vTU|PA8X{k zXKQEv%EaR5y0N}^S;yd6TrV4nr5iHTtVLFQxOiP#UNkj}eOyv<>kuR6V!c3Sy&7v~ zG3**~k|}K(=V75ooqG;C)7bP)m@(G@{<%eJ=SaN&S5se2|8jae)>k8K@r2WJ)JgR^ zC(k>BW6t3dPVazo;w&~Xiz5R+bo$fI@U)Y@q9tR|9<j`<3;F|Bgj$$f6sCk1Whb0`9I{(aRl`Hu;h~qYSE_ws0W@6{ zP!%BP0)&&;)x)X%%1&jUrk+}_V)joYd-|T8UaY1Ux6_L@?Y1c(wkln$`S{vV5>C~~ zSRherC!d~mvSZGf3ok-1W7RXW+h=B-@d@YVUHj%;r}fBNzwefi022VgBcGgcCZ}Gk z+E+iXPTt*~yo;g}lQ7Yig8$C++{+E8^%MwQ<3fNiH#%O+W+PA;{xgW6o!riu>z zFf-i%zlIty6pAC@ZzP`cMk`Wn2w2*U4gi-fD<(5Ay}V@m5mMaDi$Lv!&w15k(wK)X zW~M0u*8GAXIAqY?-(Hh*_V;VA$sv1xdrgkp`&-Qy5qvfB|AkH>4A?~6+iJme0Rn)$ WAAghiwtKrh{gzLE_W>sE!G8fMu6%d^ diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/send_paid_media.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/send_paid_media.cpython-311.pyc deleted file mode 100644 index 656e2e662d6edfc5aea4508450c26207d2bfb270..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3219 zcmcgu&2JmW6`v(%`6VtXiIghaQoKr}B(xRMwQCzuUBiy+sBR+4jqDa#%Uv(IBWWw{ zE<3wSs(?UQAV5=~335quXbwFDDT-W+{uMotKn{yN8R*Hk4ctS)Q{S5%oJwHpxKTsK$R4ho3KLFulViHqo5nIwE3FSm9VJEeu zO*LxEnrx@El%3Yn(3do6D`RK1tew+x_LMed=e4}8Xo_9X3U*N|+SA&!J)_Nlt!$=R zvvx@E`L%8BtV$Y)7HK8GhRTG`BQlS=Lpsud}mG91VC4c~GduOf%a zoi}ga)NlOg=8e~G)i=WAb>}douUnoUX13aBWVAy0t^>lO1Wu3*bFaF*$=+b?)?rw_ z<+Ln^y~Yk3uEEVsgCBI-Vd<9B?)bM2%iLt9W!&C(efR0cpIRn!!}KQeJY$cA%1F5B z_?CYdmc;Z=PkXHK4Q9JqoAaQ5C)U{vpEI*x`7L~s zHJ^Ep>`La+y9I6bJ@P9_D{YhUf8}(jY%|B4xa^(3=2R$mJ*N8mmZ!qq!X>J{t9oFj zw!yW~2EMJTTaM~=noaQI8rU*4@YVHZ%kaGQ2ZrUM532rQn|W0`c6N2->jx^#%$eWe z4l}DcvEsJd0dlRY`@Y}y)@!w<%URVQxw7i=y;{Tdy_(Usp2MBsM#MhE;84M~$svYC z!P|S59%XK;nHNR*u$|vfF-6!V|2Jz z%eR;}EKCM8T(@;UT=4eYxAn1^(SWef#lFI_X?aGY#dL^xYu9Rus1J*6?)tDP+?)@y z4o^%bd@7h=b&hea!*)mUHM}=59^ckiGr*d9EL7vP@Kj?QziaAIHi5(D=ikMIIQ1>r0}cv|0n(*3&LJ~R!uw5ERWw!!y2E~8Z{W?V??E_epB z1(rNK)9_4TTDSwkN7BcTVEu7Fw0s87=kUbk7n2?{(UrQ1Zn8_eayQjYcQf5=H`kr& z=1u97d{_BY`arw@APFbyl|08p%}*gLA$*%7{)JQ$q3m_qjE5Orw;apY^-3|Eed4UT z$6C9({=Y24*I;8|R@X%o>$+D29rM9a=?%AkxW4l(%Jso;eljO69-29@i<>dS#z3qW3~L?^&d zSVt#GX(c)}QE`U21Et5X3aKo{cens@?5~q338yWhBs}*FN-Bbo1Wkn`xcV%12*R$Q zBv>mXL0usU{=SI4NMe2l0qwsRsmCn}sbfHfHu?}brXV^{z&!6dS z_34?o4(OSH)`Rnx#H@f=2lP@v&qXPcRU(INNJTD0WpeT5 zV6_swxE5S}CAj?k;KJpgdOldc3bV}2Ma!#MpzVJLS)5-iG68;R?5KKW4q3L_fwwcT zjN|8In1a_hFe&ytCR2`IygZGNK?7O5=Q(~~amb{EV_M}30`ie#9^sf~`3wSlKa-F) z43F_L>VhWcP!jt<>I^eiVy0i^H$X*Bc`3jsDM?a5p6ws656PAOe^w)!lM)g6f5AMF jmit6~vPP-8B!LIM9zU%A>GBulvtNqte}03JxTk*u`H5{& diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/send_photo.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/send_photo.cpython-311.pyc deleted file mode 100644 index 7779dcbb88d3fd6bdd2c5a59995cae09a74662df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4271 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 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/send_sticker.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/send_sticker.cpython-311.pyc deleted file mode 100644 index b586954a55d71290a909ea0b1bf48ae89c7079b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3619 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 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/send_video_note.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/send_video_note.cpython-311.pyc deleted file mode 100644 index b783f9697cef4acbbcde9e0a474565f3b6c7b7ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3835 zcmcInOK%*<5$@UTeR3as>Pbo?inP2ExvQ6{h_HzmdeDL+iZCTx8Ic(cx0~ch^Vsyv zN~W;~9*o2R5+j$yK;nZBfucY;_!Q(P!A4fzo8l&T)?QdE=&^62fY zt?H`ouI~P-y7#xmVxB|9m_RIZ*`~`(>Nym)x;#a_YK^S3*MQlY=6yy_D!cJ;Q zn`+cfX(>CcrDc24%Gg;g3p`~hD`)4myyVkXpIy)jc2O(ZC9PzawX)r>_1gp5fIX-U zf=z~Hts#3@8&*hy%oCRTl(0M>=H-K3kI17WAy42N7j1;~Es;v$If@k}>N6b2^$p*2 z9j`*8;?3_bUePbTcjeOi*B0iZ1at#wG>NeX_n*}M&AbG9APQo(>r`d%d#xUxt^SZJZHg76X>d<4Ed!Ntg;mDvzj4EB2TOAm&7@&FqF{l1<&$o7MLpf}jLakdScYIIvnvI4ld{wwj zhjFHQKWrL;tJfE=%%4}~aB}KqL-k$tjB1-s)90$?I_p*Smd90p!}L^u9pDQsJn%p6 z28|NOURAx}z%=zb$Wvg?(a2Y4>z3hpvv&>CMTl1Y%?9_XJDsXKL2y@v(FOOL!r`o% zmwU0~HX)j3)$T6TUBRn+x5D+kn$a+iqc?I55Y1e6j*8gU+u`l94Bk7Y<4>ucFIJ*V zeZ%l|lWmX0nqFY;=<{+s9S2<4E_Rc^9ocu^YSV+*_B_4rIu5U6g2176&0wCDXkcfN zy1yZ~!N4NQvZj#fCQ4h}S@$=#hk8TzJXncx{zlVYbqv$mF7@=Qu4}DC!_4%IRg0r% z=9*cLM=Li3I9m77As=>q`$(@_ygckYrS7Dvm6v?uYirmKyg%6M@=BUniTVZRG`-Qw zJll7A#@+4v`)oI*z9zH1(ims9DRnnkmypY17x`DA7mER9~xra6DhPx$9RtDf(sbwX15Zk2I1RB zi1Ok#Fuzc~fZNOO>Y?Qke4oHKF86vGmS`!hL@U{%tyC-B%CxerTr1z|YZY3>R*5NJ zmRjZCD4)yQ7H+xZLZu`Qz#!rflK*1Czay1Il!6SxMU>Tb(=mNruM9+kFRdJQ-&)i4 z|ILKrGwkkNM|z1r9mGceUB`}Q1gwY%nPpz}6>{B?_T&XVHT z&#wGr{-^U#3!@#C2JKZ%^gyzGI%kH^Eakq8%OkUI;cau9Lhz_Ucxqr9%$ zE^9)H(xZZ|!#!i|XfnFa+&X{+gCHsbBQrk6tR9tg9a1?2DPA!kmqFfroq_E?2Qa=$ zUmLbrRP+aX8_ zWMp*fdN?w%weXCN2C}y4Xh=T^>0}^ln@)BTB(+MzsnY>H6i}d8+w^ouSHlyh0y+{< zpjg}VR7mfIN5;3_3+Q-U+jKmH=23O)YCzSvwy7G@%i&~Y>sml7ac$EIPGo1pQ?-B| z2q;jjZCbQ3k;?tSMts4PdjBA@NhIHX|uCVazOhAVN3KVOb&V=-I zCrxt2PKu-kIwX-Q?vih$m?kNghG#E)JsD;TUyVNY1ND3-nK+jQ^||!7NCJ8kd!=^? zc1?HE$<$?~lO-o>k4GN+e<}nYYQg-Spt9VqEI+L*2Xucxfnsgb_TB?n>m zpOGBSDJSj`G26w?LS-LD#99;HHV_d4|BFOvcmx6JV=&@nA@Hx0$e=FUy-WlmH!8&s zxGIbPWeCK1l#-7q0e1)y1tj>&mr*6k$n_(^oEgzo!{cHIWeMl=$VulA;@jD`<4~Ow znA#BgUO&)IQc;wUj0bz`GcptWtNM%_3ij4#WFpvGJBh54=#c*h86?WFfT%CmPWlIm a0tfVZ`tyaaE<7DR^^H`2`wxudj{ObR+#DVN diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/send_voice.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/send_voice.cpython-311.pyc deleted file mode 100644 index 14a3fb7b5b4296aad7a760c603de6f302f0aa258..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4304 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 X%iqa2$&agdo@o81O~3zx-DLPD^H=c= diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_description.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_description.cpython-311.pyc deleted file mode 100644 index c007e9a9809b37286fbfec5b25fabb13ce8638f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1835 zcmbtU&2Jnv6t`z*zju=o2q?5v!$%|*+TENuL=`GZqfnJDh$JdZ7F=iS-5oMt*xr^@ zk;tJEMFPYH6^R}=paSX@A^r#sTd9X=PLVkEwkRA>PCR?EBvC;e@YrwO^YeT2-tRrn z_w{-O!T9-`U%MaY5&BIF<59>My!SpZw-G}O2PniY#+tVRE6lmM(01)G@8-jTTY&u> zvx8z-a!VLlXbG|WO~eYk#LF{dujpsQGH)Jp$XDavE%h=)YH4% zVTUG8+;yna6Y(H91B@IbTo}oT1<2Yc;z83{0kid3IpIJmXPrAVawrS^$d^h`1!w)p zxCR5|bU`*>htFP*#Ri;anPs0|%R-<@BH~2&RDrK!j)dRqE7^43=4v1!>CAgEexORjWuN0K)l z(kW0Z90ziL(v*D7kJK3lGJG#BYE$B~_I`cb7i&gQJ>su{#R({C`T}{hHiRUbj7G}$ z$i{UldQ!keKxsjkG*i1BN8HmbriTSf--{|jc<($gU*X%Zsm6NPxeMzatZaPnw}x3; zc*|n=jTS>- zmmTWI`VO_S{**1K0WlCCfwP%xil^WkH%>kZXLB6&NjM}Qy(#As-HCaG)s?!eS4$?e#bg(mDWW3Jj>g<^&MD4wLUMN)~BFBGE<pMU@ihtJ5e^Q95eq=u$vwlD8YH@4fm z_Nk$n_w7?V_KlrqXSXj6?b&SJw`X_kx!vLuBQ%-s;L!>6Qgc+UmVrh8o0g5s%<&N_ zbP-K1?M79D+a18&2XI9W6lpvqFmv{IqyFPx I4w;Dm0?!Tq+W-In diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_menu_button.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_menu_button.cpython-311.pyc deleted file mode 100644 index 895f3b7e4435b5aea59be860061e0c306b56eeed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1942 zcmbtVJ!~9B6rSDNy+7Zbv56tE5?B-Qb70O?6jp>19LtG}4Z=2t^;zTf&e&eOKgY~$ zz>y0Vkq8pdp&*eW1qzBHQAV`XP+X)G)>f9N+#NCna>aYQzMQQPQSff|?faYA_r5nX z_fxf6CO{8<_GJ_$5i(@@rZJ;>R)z_5+Lw9O!I=fR$1 zhF=JZb}=Z~rJ!t=!Dh0&-xpNuibixYMOfhmVMSiy)ide($nNF{xerf9c8!(hNWHv| zYF$hEoG^@(qr51Tbt9?HfAYa3owzbNF@1G*D#=|6x02%fEp$76VlIRr?CUr+mkiGE zFn%{yDhel}AaFt^lYyS?GGB9IUnS4ivFeSQ-FK6Gq1lx=(tX$alYu#|CN><^%l7(jWeaFQa!YM^(hAZvEfrbrh7+!% zm0PQkdKFz^Y^|nHSYBv3R!ex-9K|tGjardNV_AmC@#u#2Ay=^or8VwGjE}F(io3U_IBq;Q& z$-`^S_q^4n^b~)y<+z*9I+snyi||y8W&2HzLE~uJnPXTsT3g~QeB=7?6EHTqNuyuB z1?=w~(itYzbKgvUHTCt>qsrNKW$Di1FK@sL$5s1C$kfWx0n8!wVpiS&$Z5;OvnXMq zX1Z~m}#@_V=R@^!Q?}oH^Tq6bC<-QM1(!>kklGx~r;zf+=@3Im)egy_t^nM-P zFpC|6tU`v)?9A*Ay|y#EcWz{7s%?y9AKnK$GEV%HO<1U1#qv$aDf2a0`K@FueMr%Xa*AQ zLV>456wqgak4u4A2>fdjaCiu`!;xH6QGXd(irFwq7Ba-~uy`SB>N}zVDgrEj2G+@G znzl<`YM&f?@hp8iN diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_permissions.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_permissions.cpython-311.pyc deleted file mode 100644 index 72408ce70c192f734d9f94ba1a18924bd09356ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2008 zcmbVM&2Jnv6t{P0Ka)+Gv_UDP#i9{tt2PlAkkSgZq*XxBP)H(Ry2YK0o!x2XW3jz0 zK{@15i6Q|v)JpV-3aEE3{0kg5QV**+MdH-kpm0Dr@!m|f`9ea%>v{X^_hG-^d(S`B zYE=T`*B^dgiOPihfs6hqW(?iF4a@@~h@d_Rs7)#IIX@TV?R;R_R#31DLD4S4eqLC9 zDJa`z;0vPYSAwctr6fn@h$!77qAaU&;AH;<@;Fb(6Zo=W4~ohHsaK!jvQFaxCk!Lw z7%vKS-HL0ApI*PpXWzLx``)|rb8-H1xE7Z`XrtKi(Pir)P zMzj5)Md{0?a)N8pv?Af+N&R7E4Bc)4^A$uaiA@Eub4w7potKtf5IMUj^0FkXi=b11 z7=bVD@+G?r@s&g+Tg!^7iIS*3qT<+nvO>l1y&=1LpL{{>fd$h4uaCr|3(_3Au5%IY zTV*hov}C5`X%?gxW+q}<8Ybk5)A0>+AxzfZi<7NHiaEXy>cO&9dWtQ!BwLOQ3p(1c zWyze7IU?{vPaEYJ(Dp(&K(eNaI&Fs5On1Ozwnlg9@o?_lNUego$XvCYJ9sn6&bm&> zl>~R5YxwTDXAd2syk^V5Z9bBwqe9JQ+(^ioTZ^hAZ?PzZBVAW&JylJEUWhu%l{2hm zOk2-PPrH$lQ)V}FQ;}*;LqvMoX?te?48&j`1gVF36a)u1QHsa+U_%{Q*|8OO!A}o0*iEzzB>)0e}}WB8uHmyO%cB_g*@ z*K_N6K_BJUtsm)kX|F<0<>%{pbqv(i2ok*LFQlG}3u&(7GKbJS!+E_JkM6rH*V13% z{E($O0p@XqbJusY=3L`TfyK%;c0Rc>)A$$)r7;@`FKjkeJ86}1NLWLLcN*_|%MI-r zdA{wqt4>quhT}!pkkeU#>uE^b5p1X0YwATf?Fu)|tO z0aT;NAr@&i)fjRw0I3fmprI2;&f_ZQK_ogp@`Idz-f{e0Nr`h2xv*_vg~c_%IV}f( z4K{~3hx&$o!gmVR!?50a4nY@lsPN57kwNn`9j^3!$Rkw~AktVFm((fLs`Uv5pnn4b zIPLwCoK+|%1j!&7JGpVKH&)-6-?ApU>D;s?k{l^q&h;$TP3NY?de&_3%?n*?vTFgw zxoKTMwaPnl1^uMXo)d-1PD7fn*AU~C4m>P?vBK_& zi)O72FlO*zt0^o|gI{+;qjBU?|A^a8`C^v8x70aUBB1&q zkR(qj?U7fy2j>=fqx)ZTi=62moIS$22WL`zl|s-*$-~n>TTf4({}V-j{fj)k`9EHF BEE50# diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_photo.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_photo.cpython-311.pyc deleted file mode 100644 index 0ce412e9ab39b44d73e1088a515cd94b048f601a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1792 zcmbVN&2Jk;6rWwMzwHFt1XM_?5k;yj6`OOERz)F%3hG8pqKd_6I@uZ9OZJPIaYCvb za;QX+0C7P*P@x`B5$c5#e+36u>LJ=wBu=>*g#*foH?wg*Bzj>y`}WP7_ujnsdvDgi z)aw-lP13%#VRwkKP;Q{Xn8s6fn zA2UyT9*?7Qt%Ext`3kb*$h8=9?N!Lq&2h)gGuth&94|6w4s^#-i7PsAY>L{$;>K zr)_{RwrLGS$9Nu2n%aNrN9rnutUgPNTAlbzl%QB?-WaBr$mt>wl58;=Dc>XOn^g3q z?s$|Igb6-%+Hu4^-8*{duF@BvijZ}11DGGIM<7(=eULnb=NUZN`22W>+1u8(&8)}v zcJ62EJ9Ay2wR7!;Eha%(yaMD`)UeaM93)(%B|@M$ijYP=J$EWfB6-jy|EAwxfAaQ=^H=^d+kd}A$wdDzGW+aV diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_sticker_set.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_sticker_set.cpython-311.pyc deleted file mode 100644 index 9fe2e2a9f317ef4df15b017f7d6ab6b60f27f942..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1886 zcmb7E&2Jk;6rcU@XKbgb+A1kQ9gzdL3bw@2s!-cB1O$yxov5%FO*T7Yd+~aAJ2Tr5 zltT`cC=zf$LPdfD2ULW5?_a^em3oNw6sf1)jKTrs#G6^CNhll`&py95Z{EE3e(%lv zTCJ85jK@Fz-d)He^h^my17tOf0|)2>L=iOtG&CH;P`nwKL(8#-wqp--P7c;AY6tmY z!6_KXL@S8q?jf3I1y-EX=P2^fLg*2E*>Fm<&_?y*b0yY|bjl6GNV?LGLQ%KU>e|O2 zE|aBqmzUmuZ*?WLu7%raZaoC;b0agTt+9ahxI4VbWIv)_c5Fr`UW|iVAb$z*GvpW) zIp#X#;aJRea@2J4)M5o{Ux7U(h#2^M#1j76*2^din0a?%}*i1(V{Ks4RhUw}kZOq0Ao z(g&n7z@4t<;k0hHPyA3WLbdp(X+aqhpQaXw>6sJIkkB2nbb+-0c?co#Hg!X&H5qKV zyeD`LdM(Xo@TK-@6f#e>vl=FR>efxETXz+h?~MnrD3A28@({j9@MYt(7aD5r7&|64 zelmBgUyN_{9fiAPt=3Imh0S~#$Zx1_ra9eaX^{}kJazn*^}#u<&l@1Ant4e97L7U2ov_nCMJ8 zq&ex3CV;Lxe z5lsTcR|vV2xWPnIAcRI9EZdt=6r@!^R5vof1dBC7pcP4m0?5-KAHRLD*H-Qn2+C3e z@3A0&Vi|lER)wnjRjwXZt{!kric0Yv5WwX4H#Y5Daf}qHp!0LPH}}rJvAeo&&yVzc zV$Y9Fl)Gl`*>fX3pV)JI_Kp3*xiOl_)yBnY2{8OWq@>KW?F+&$9tF8tFDul#3A`SF z8duMBnwQ%#0Fz~{+Ka1O0MNODag`Roq=?S+oZ|FxD*MCYm8<}7^VdOCu!vnCW6Lm% rJ@ne>^xQ{_qyL`!2#-$BaUL6x%gf}4+RyUo?BX9v_2<9nb%cKd>)I1V diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_title.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_chat_title.cpython-311.pyc deleted file mode 100644 index 66668e41191b430de6b0e518d190db5573e70ff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1719 zcmbVM&2Jnv6u0MNzp|S^X%H;|MiePpRCbZLMWreVQ6SK5l@C=6i(F^y-5oL?i|tKG zmBS)cq98zAP!HwM11dtjaN@7v5TqWWIYr{s+oEtl>7~z}EJ-AK!E3*LeqVm?_dNc& zR;wTwzuo=4^VmV?PrVtBLeAiQADBCcA%-IqV;^J9Tagvpz8yQh6T7|(GMhP3Aujqw zj4ZT>n0pJc0x$B?nQ=sP-$v*GtbF)oR$M{#(j&dC<7|Q^Nvfy{(?r(othV~m)de#D z-opF`@3$5+`<-MfbJr5kKEk=fX&b$&#_-wLF4~=Evv3@HQ%FZ zHB=F&Z$VBK55}70p6Z3ti%n9VO1+>*ldhJ+(#Bre@u-%nhG)E`7tmx@dF%YpmU*32 zczqFWQe|XHf+_f~r^<^5(wNf3qbv@SP%1$c*oTQZLkBkgCJi|MMk+Quny}onM>q3a zXumH~I71(CGLQ(nJ$>RbR|AnqZ!Sm~pS!*)2K>60CY~Gw0hh8-F%_?*0}=2!ucuUB z&NZ7sDtJR3wx*GaZWFSWP1+C7Nv?Eu1_k4rRY5dAM)6?E^!MX1QRh9V>XWRf%}K~I z8@8Ei9J80nap(!@Z!wyvFd!Q@sOU=JLOZj9Fv(|5D@}NyZ;T!mEPb&j5W@SHfcXL6 z0ihb}L2@6~16cX^^j{6Lw(+*b@Q>EE{S*Gqd1WD|6+b&qY=u z1e&7=sk_;!V_6c(qYfcQPU0Ex%*uoW5tWhw?p*sCw68s%vM}kkHwLEF z1Q2cWWV8KYxZakb;&1e6utB?AwrQB^PokM$KiLF)i2>1I*XVDF=OOyd>EjSK#+kkd zD)}ame}-r@iE1x>yYSWGH;WIeGdtBQ_pbfA0DpSE-8y9QZS~4N_`s)}*Hi`GpdltT zr>iqP5zlJw6p;FaMkk>$CnT#75~pksX}(IxX9F4?YKnxgGyt))o~BV&1JF!U0SORJ z5(0OMkQyK1^9%1^|FH6>H|V~`T8meed7T`D!I`0iB~i+C7;%u z38!H=C|$@qaZ${|R^ubT1~RfS#=Gd%os)A9o!@!-+(X{Z$vG;V#TtwMrr%$@_u9kf OX8$tkzn@}ca(x29QrLR{ diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_custom_emoji_sticker_set_thumbnail.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_custom_emoji_sticker_set_thumbnail.cpython-311.pyc deleted file mode 100644 index c87dcf27a68604ff1a500c6bb887a21930a427f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1765 zcmbtU&2Jnv6u0MNzp@{tYAaeOO!*KD61xa4D2h-~h(c7lMQkd>u)&>-on(@k@nU;` zR5>hCB?Nddl+lph>Y0u%-Hg**!FCYnbe9( zaoHT0C`oMewDKO+= ziag^oq~e*(@@#5&C2F!VwPxT<6@vCEI%rxh_N*!z)TWi2m^QDY6-*n~nqKWX`Urbd zJv8~ct?XQnso7L29?!*mJ?yD4*kA&Li)(4TocLjM_1BsMt~(;#3{wrjbk9#2KU zrkypV26DR73AkWwHHNFr#cF4nE7|b};gevs@RmCp`vT!XM7hE29Ekoq$;^~WWLDzG zth?Ws6zg3OE@iF41<8Gokh)m30QBr7(tD6uLI#`EPXGh5@u4qPrGREdSxMwTWLB3a zEYKaHhXG6X?i50J?>sPH;Ts@S6Fo?7!MY8r80!ZbYHZ;xgW{XUmiaCIGVgTgP_yeA zq5+5VfPX-)k=ZgGFp*UV36oF};@a8qd!i(gMJt3HUJ}RPdR8SQhl#YkHiTp~LSjzSNb_|< z-cS8#tSJ*hc>rQ-ne!-X0K$0(0Bj&^5(3Rk3RGaVMIOywnH3Akz zP(dsn29?y!a9-#)OX#;TCl#&u2?)S&_!}9PT^S)w>geR@;l-VkFAuxBR%5s@T=;ll z$2zm~v^%`CZMnt#-Ev0;virtv`NRmd?Dz2K7;3*bs!mmbMgN;tbCZSPd#E@wNu%r5 zG`K4%JRbnA&@XXTQkw(7ufRojrOhPY-~3VCd3NT{T>aO54&|}_1Fx>_ Ap#T5? diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_game_score.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_game_score.cpython-311.pyc deleted file mode 100644 index eba6dc404f0a8626a35de773f629a5c9781fa05b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2465 zcmbVN&2Jk;6rZ(s{T18!4sFwxO`6cUO>K#yRzy_=Eg=xn6g907ORCAnGftM+yJmJx zN#%npRia3MxS&>Q4@E+ys25J0`2#pOQVy#lZs*}3i6S1q!Klv71dBHnxR!< zMhw=YOfAPN2_pf##$x4UC1s=(5+SpM#qSW7;3*#C3EoqR9PGS@Jm(%q33&=nIE*w) zE|Og88Hzb2=rL{E@l4NhY&WL{nQI@uKSM9QGjr*^cNb=Z=$rONkhoGswOJ0d>ozdY zBH`BfW$wD>Du1Sga`qZ8^HpJ1E^}|qVMTmHXT(BA+4%*S&mnV8422ORavcybqFm(~ zkL``$h_i^1U{RiA>Ur3c1RQ|Z+I-ANu{g+yuG}N#WLHkJ6zF@paz@JOuAF5V&}T!L z_lkZN>;8HlYHau}DJg8|PS)tVOFmPK{zcOH&y57>Mefa-6~0(>1UDZ50x2EFb(ibj zn&s*h34!i8y30LS;<}5Lx>E{;Dlb|ki!;6Ea-mzcZtAPx4)#e%^ZFHAcWcEWh*P>1 zZffgva1SNZO&j)=ExWsEO1hpdmQB~4UN$WUYmxUhs@%sO_sHlE^MPHBe9MYo1qirwau{Gw-zhf}l(*NL19D;WRNlImBQ|jXNilkah9quc4seLvI;VE?s&>j?9hRR;ZS2u(X zuede5w+8u69mNHUZ454`M;jN+Vp9r@8ofBa0V z7c^4c>LY^_t^TfvTS5hLJK&b&20~DJfe&$(oCJFS*JQ&;PIk>OuF2Ms9QKbmfCO=q zogzk&I}9W@fCaHJR~n=!tvIX(%}s+erJvNya$6IplsQGH4mOiW0tr++7C{Eq%l)aN?k+@xlkW7v$&P6R?#*zo5Z|ijH-33@&A1i@aQhE>Xldth(5fZ-`?+MW#bA z4tE4Jfc*1cE23(N7D19G!-wu4fAre@(_2F)8khayV~vGvwXZSXn7=*ms|S5G+n8(2 z-JbK+oPStv%rsR!oSUlNiV*E$#6MMNst1}XP@J1;!B;*1$XH{xsg8wnQyueF)7K{& zb4_(3oSW)|uNwaGQ%!ZasRG5hsh;vxwjCd8kt15RH9#hF{+V+=&=XUB;Y@4rU=nKo z|40%&O1E7iCOSYZ8u11Z zIV2MPqsU4BSd!hu`LJ;=h*v?xTDji=X+;%9@yU2||J){LoBuYq$!K%`^oicwKU=Z0 i3MBn^^38=ulTYG54L!+hji22bJoh`={P6-qnZjRW7njZe diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_message_reaction.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_message_reaction.cpython-311.pyc deleted file mode 100644 index 1a9d887e263b87e2bd84a91d39c7f7b4efb93973..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2400 zcmb6aO>Y}TboR?%iJioWn}&RJLtBs~>KuBhq82D=NP*^qCQ;f|r0Hg7>}<0iW@a5o z6^S5KB1i@0P}CrL;D8FKcYXy2SIWWKQzcHlZIvESPrO;%Nvag7jAx$Tyf^Rr?aXi4 zYzD#j^XI?HKcx}+TWs1R(L(lb1M&b7L?j2fk|DXWA-js9xT>MLnxRRE$V71xZqi7) zDI?{kjWp0yqB$A2!|0HZjHVDt+(jfwJ80)X+X8x|AoLhka~N5Ynn%U-GqEjdVRqr> z+$5g3Iyv##Co@x_a@pGm)oV5n!qjXvuzk;TLT%9lOSBXIaz$O=VslQ_jr_Z718TLEd+heBD|#y^5exKz&XGuXI2tP}>GPDW+ZJsTxNe!=yMew!n-Y|Ox{`jm1`S{awq-ibhF%`_(jdN%ty~6xjRbMsNn_h9#rMkIp+K##6v~0mKuA3r^*f*}* zUMqrFX-WUc2c1p-Y7lc3TJ12dl75{AH3lliEuYZwTMMj4Z;5Dm&9XpcDHCUF-mfu> zj_a#IQ03!eW0ucoDQGon$!C?Z6)-bqR_)WA1}$IO*^4!Vd0#4WuR)S4JWQ}SE=zn=VyLiEusUGv zUjgu=^Z@RKpv?!$BUq1NHOK7(4v{ydO?gw`419*60L#={U%qCqEOR@c=c=Z)2CdJRP1_gu$yl?~`4|)e zxAWajb*Z|+-U2Ik29IaA)Q&)h1N>6}|7@XX1Z9W6pZsp>-qc>_P=pfMT;t@a#^Bk; zz-Xg?I7$N{rbZdmdnW2Q*ou=)hQRhg8!Da|VH!qog3G z(7;fX7FY)LpK5gX?JU*@->a7<>r+eh!KJ;zjlJ%h;75Nh>JX>8QDJy@;r>iha~{2Y zHtH4hK9tKx1%Vw}djl*joQ*v`0Boe4^O<5UOavQM=!PSOi)$NKIqnAy4p82#b6jyz zZ0IMGQzjl)cDk*OofKHCUDWnv>SD7i-)HAwD~ir{0Yr)WmU42|_*&c1M0!_Xf^A7pxbr;m4l;3sS0p7ytkO diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_my_commands.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_my_commands.cpython-311.pyc deleted file mode 100644 index 230613428c965e4b06599adab704024daf8801ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2534 zcmcIm&2QX96d!x-{Yt#~Xf`yECJrft6(uVq5K557j%PMm;<1+* zZ|R~Oa;QW>fViL@=z#+&pxzOG1cy}WA@TuL;?$c99dg7M3Dztwj@`$HO?kxmq4=L=BoB7%tGBBof1B6ZbOS;|T=&C-}|=`3xf zS;oqMFGVyr%W_tZ<*hvHv3gjq)yoXaU}}M zVd{d{4zWE*?h7%`D9{JRf6G9d#TcJE0KH|DW z>vqcxo+t@Kg=^HMtK4RbG+6VABa!P2Em4#m50uX!!xUKxL6&+QGHs=(X6Zz=(j-MQ zM4N?}9OTT(k~G+veLDv^%aB}R(>yOgUUibcr;`3VsIHK{+XbuV4!WgSy;aotUm6IF zDh(Ffd*}<>fCJ}E7}o_ggSCb*S$twM@J(mU_EzOAHC;%B>DOa@#Sf;0=_L6R(`J=Y zb2(XRdo9~FXV-$DDQ3!L$LDl9*h6C4=c{E{E6R0h2Q5y;WM_}_%h;^@+++}M5*pYI zSD5yS-wI4vaNwifr?Aiy=8WSLIFx41)R%zrtC-E2$> z8nAZf81drJfVnO}yZw^MH@ewg3bUQ~%I@zSg5QYweIP96@*XM9ncd|bjvwUbN&YUo zPx49vALi<@C>e6%GIKH$L>Oz*}uCaejD9EMIaDf*sdzE6DhLXyk2a@tp5aBpJ zL@$h+ZDM;t!@=vH*nCxRT}GvOoX1eB_#Sm+$;cu5O$Oc`gp{3&pnR*`g$@;T{4jGL z-Usj|cbPgG3zMB7h;md_by`vFQjl%ZG#81UvS(E}jnYgmtHR74B*nw@JzbDsy z4)g>q`F#+lmA@c0dHXnjd`xQNAWDXW(6brEILu?reA05I-iz_a&;MpQ(4K0h|Q+=Hiw%l{^o%DY>+vKF$n9XjCsmXVE}$`_*zZemV!a_-`U7H;Q-L z7ksL7#Y(9t(XY2;TLr*mC57pr-2{LW%w*YdNmni_jAvzl4gpkf`9p+5%^}_^g&{>j ziasg&r5FGKxw8f3r=)#OiWuMtsm14zpzmg969$~;Z-ObaA^rprr4&WkMlWt1ejcOQ ut!H~8EvKjv`hUd`QYN;LdGLwSZz%x#aq&&%`!^m9z4BDL{yM=QWAYE|wbA+j diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_my_default_administrator_rights.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_my_default_administrator_rights.cpython-311.pyc deleted file mode 100644 index 24499eb2ebe2af263a7ad59a2197eb0cb2543996..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2054 zcmbtVO^g&p6t4c6-<_FN1PKwOgv52SI)ll^#0?s7ftARvhFxN8h7>(rH8bt@&rsFv zI)=j@NW?_F84m7&gTW9ko(yNt9)^UNO`kUL#BB^7%$|I&dq!9TaoN&z}zGi6}^17${hGqDsW%@ZQ2Qq`3 zUfwTQ1>kc$?-l)$Rnmw~76~t0BfKa|qI@8=iR6|+$Q^jHVNLPU3aOVL;IghIQ+5!9 zksY~Vpz20aUH#;v(`@1W(+eM*U0zI#lffVry6v%C%~Dp@paepXj@Pfce~jo za4J?ps@G{dj_|$#wWXjPDZtl|`XP5anI9gc2+npwP=gn4(4Dx~pyx#t%Rte2C*)%O z@~Vu*Wf}%>kK+iX8s!v~l`xi$n5Vrc>Z|!?(*aYBXq@3jD7#IFRWsPg_I@dP!tHux7w`rF{M;gm=4{W$i>Uxq>abL)!$QZO(#8^F-?0L*R zri9mF>``#?1vr_M7;`*ZDaI6fjupMJ(>*oc`Z$zptp%uwpxauD(}rb`vz7=xYn^l3 zE#*eyjlS)y*-&0B+YPaIn^_a6CZvn`12#@8+m%OuNPOXZ@!B&mZcHLN2)orW zAb)L;(Tk*d=$q4DEq=XtzjAO`xp?!;UHrp&)*3U}vU2euoFVmM7JCi&G`sRSu=e`+(G|h+<&-g0ZB`7<5MLAzxwaN^E;$O@T2UIv_T&jFKvVn`Rvl17VFZsBV@4 zGR8fb2H~SuCrGi%B);BKD9}cl4M%t$WKfeYfl6T&oRAp3tV~D=6~6!hEFS$vx|u7E z2$BlfcVJ^_Yu{TN%iG81HqH#qxoqAu=SDiot?FAxXEx3a&6#Z8GiOlzp0QonJ0jD$ zmNu%9x8K>CZH`J)C0LRFO-rfO%=Tkc9-0KTT(2PBofuv*fVadCP?C=ZeSkDW32Rhh z4<$Je3nh!ln{69jZ1}O1N06i_?ME&(jmYg3k7sFoSI)u`Ayu0|Muw(oTja=a_uMAU p;nU|fnH}z)TZ9gG&r$wm4N-eCy&3$pdjHk=KT`FdPuY}u|2I>4QUw42 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_my_description.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_my_description.cpython-311.pyc deleted file mode 100644 index 7dbdbcda32ff9e2a194d61aef439b2d2ff5ba736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 zcmbVM&2Jk;6rb4-f5q#jRa*!Yv9yXTQ?Tz*g<8@mMI{E26x7Albh9(Dm+Xg`853Lu zYLrTP6}KY&%Avf^TzM}-kbTw zvMLD1??3*rwrwKxrxM1akTZDC0p>2Eh~fZ+*uhxwTA+oxqlboLgr;MHPNzmt2#Zb; zBMmJgYTib)z>2IiGd>aB*AaRMD<4jo7MD?@^jL`voJ_e<6iZk7aU>dgVy#?%e}T+j zS(v~2PJ1!YFGa(o^j=??-QY3KeQGN#U|sHpOHB4+>g6Zr)W|=0ZxxuYAO(gTOp&8q zgH#-y8IDOcr$BY5NDWq^<^|YShD0DRB^Pp;Rd@}O(`oUZMy)$&4b$rFnlp6=eU6># zG8%sywPbpk$)(|CCOqzEf!<0gHjHb6*|O&gJItcAWo&yrH|i=avsYtT7dD-EyM(~mLhA(?#H``yE7+^OG`*PT{KVWjeBVo^ZF=cZ%SNMS4wByJY z1J7eZG%Hz9%khAFY|idU*%x!ImKSr@lm~D&W8Q5+V4~&r{d0oJaCj)d%s-h1^^t7b z`_{NV9}CHEBvXfc5-Wg=2X2=U71jfdTL3q&0ZGo1=Yb=nKcsFXeUGefxV$Skv?odm zJWDMx+Hu4@)dOm1uvE8BA%yoX0`mjD3rab*gXTW0hp_VT$ukSpHu0uL@jY!*{~3Rm z^)~dR-sZ<(>jTu#5>pKNj3*^R{K%JtG|c40q40=c!5SfxZ1^;ICS^jrz!icJp(0mZ zFxvm{@?7Vmn6G!{W9moU&ia76GUfz;?y%^y&b$6}BlKuUC6KUUq{${RM_^5g&MVeLHIaB}j zi&O_L7q48O2$^O=_TUh>v3asp;IsPij8kc6RpQ4LcS7y76l{?jGD4CHAz@4hf#R!# zd^&K0151$*8hfBNR^vEGEI>0WGe88&8X?ewBuC%?=;RnEC$9x)RUdJ6<1;YS85#T@ z3j!z^<}ZRtsIp(=>OJD>-OETx8GZu-;7oq0W|*ZEDN;qJW=2apr|P5j?rXE7t6Row zKDUk8R72+5+RnN9Xlcu+=X2YrEAB1ommp{S9_p+cyr>V*@31qWB^!P-+KPQ5Kk4<#qw?AnPVsKo5d+j*b+-tW!q zuen?X!T9~BKQ@k3g#HxFcqB%f!v<^~AcBZwBS$hMM>b?fF%$_AnJBjEXoe;s8PyO` z?;xU4jV8{Iqo79$LQi1D!$^|E3MwX_3$~~Pxz)ALmT~o?9gHIZPZt7n;E!NR2yGRsx68kbyPg_Byry`Oh&5;yQHc~riLn7%rc_Y7r zZb`=U3L3wQnIOGF{d%uqI`sCvj1J=lr@Ft{=DHJ=r~966ZJKUNNU6T=`30`KU|!Nc zr+$~YT(4Ljp_QAftV?g|o~!e&Wl_#cnJC_h*JT#1=$pRZ;gxdP@)#}oBM3_#Yn34; zFPokA0;j&y6R{)5APsz+S|d<}ILO(MNY`vpEI#>IW>Wwe%K`~5;NwCt?(~T1`fUqu zeQUB74-za&)e;>PLxv>|lyE=13gk!W0SNuE9wd)oJ%JUEuZ}fD-j=pyBJIoD$}iGA z3633tBcwD~4on}Tq8w24b82s3e3CoMgJ+P&*s@K|G3FZZ zq80t4>(?sHFFdx@ta_yFwwhaAX8In(09li|-!wmMuQz$yr%N5v+5%j7(`AaF;t~-j^ZTp_kg_YqwpNcz4gQL_qDsVXW6+ycJ1NfZw|b~ ztbIA!#B6r$5PVSajHp(81LGirvEz}hE%sTAzwVm$NRz~vcovA&bSUHxXKLv6)37qgp5G6sBHuA5}O4T7tOoM z&Iv1VK_epC&;JGj1)n^jtZJzc36e##=lk{Htln=NygA>$w)4*JrMpW5bspwZb$+O_ z;X%L7D5?mb@?FqdWfbqLkja~p)h>69Hytzz@Z76KxZ%PUAn&% zCL>`A%`HBx?q3;MX3)jA!>LG^ Yhv>iQZhp^yc4qOfNd4j!Mp0(}0D|tJ#Q*>R diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_my_short_description.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_my_short_description.cpython-311.pyc deleted file mode 100644 index 402faddb84a0c4d5c7cea172de3a36a9397425fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1806 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 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_sticker_mask_position.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_sticker_mask_position.cpython-311.pyc deleted file mode 100644 index 7b4df04dcdc5b84bc7b270012f15a6d54232a331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1891 zcmbtV&2Jk;6rb4-f5lEhX(I|P3~;G|+Tp-~D5{FmC?I0DBB?4Cx0CVC*fHJ@Gqa`y zr6bZPYB9Q|JR6cq|6@LVWAoURKDH5mLjKTrs#G75aNu*RlVm$lyeayUl@Auw} ze=L;>2*$(jesBF^BlM>h#v_w5c)tbAJ;V{m9`dn+vE~iW@J+|`Eywb0#|E9rEidC| zoh-!7y%wsDR`20dIk_r4(U#1w ziD*6KuJ%73R?6W01~8vPjsiKDBgeQ7xjLq>9Ge?XhMOYGt$A3Jhs>ND&w!jwWs#R9 z$Tqiy`Q%;H!n|~6(ka|UpI~QV1&!b3sd#2ZL@QCp?FxA`O!g|oSs*a3D?y_5jv{^% zD2YPiuCt)6wSuhqkQ?cZk|Xo$QPfj&)v6mxQHe$=RzlgXHp56&S+Dc5-Z9>AX^oPw zMHorks5FiWSq0A{f%ttDk*4s%psl~n9vhU1AOseX+e{Hx3Kj`Ynj1-2@UaScPegqg zC^F}UT+FSl%Dz}5VL(*hb%j!uLXzJ~*q5%DBmW_C_~Iz4qd6pA;u$cWfMaZ`NXFUG zw)(-$xH&$k9chZ2aY=imV_3>qJ_TisFVK^#Luqe=vjE_t-P=sIm4rir;*3l(j;(qa z2v;|n9=Z$lnVCQc?_UPy8+;Fx(bx`}`|vz~CmkO?ws2z;ZyFqL8Jp%0`0M0^!D%q- zWkXKE;v~wSQQ3%X)$a)z=P2z2oru!19iKW9B~`*}QF^#Zo`UUho>JFiN>QqG0=nG> z2REA~_~`LpF6>%z`! zvxC~UHJi>qtl6P~?5oCZ_Vf@<*=u+>jox^3n4ic4i~cvwCoWURN2t_AOme9M%m8ky z5BC9pEA{OjXQGWB;Fsc}yHDyv65F5_O6D|gHJK7p{}agKnFB*3gQUCw| diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_sticker_position_in_set.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_sticker_position_in_set.cpython-311.pyc deleted file mode 100644 index 06fa42a84029b61263a2071c44d00478bffdceaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1632 zcmbVMy^kA36rb5$ufHz|a5}~5|(4jm7S-4h1IZA1|MAo<}RX$;t-9ni?Qa7&={GnIkH>}WRqH9W@NiI zMh4nOG_#MW&1{xEyYhzan+QFCl@2#Yvu#w#Jlr54g~L-%yKi- zaBXU`EVV9xP98!9-cEUz69rnjgZh{j_e*a64!VimLL06AE9H2j%~V?j{*Z~wTn0Mc zOA+kd`lH~$*pbXpyMc5@NpOzh&WPV&j_1hK$O$4XFy;7yd5Te|Hw6pk^tjU6a5iRs z&<}iPy!2mnt}rzbk#y=lr>uUxBPQ&+!y`vde4j~KEhKlh`9%1v?(8Zxmi1cA=Ymz$ z609m0gBsi+Yu-3`6YgKev$`aRU@vhKZvb~vim@q`h_g$>*bE{S=T`P{g|tsLBV;_K zUIgir;TN75NRa{HV_PIi#a4?)%-6Nm!+@pxu80smx(Lj7_%3X!)j90khxGtfIzIdF zgc^Hz&!G4RW6%5vf17kEbeP$y7@`EqVhzZz2%0M+Cu1h!93epzC_*Zk_=TsUB$9=F zLXM5ZDX@(5g!rK+B_UELpsPK5Og^f2uW>Q#ZgLt#gYIx5JjDe8q`NG-(QO31E_4Zd zXYBbyZ@^^N3%G9HTG}A824IsVq+|sq#05d9>Ub*F;i_BCbD*uRGI$lVqqKZ$B)(c2L^+@!D@U;ZM)a&XP&R(#{dsz$;911<+HJL|Jn>>!eoVwC2tL zsT4J8kvC$5#05e|oK8Z`mk9ZM;)TnTEFqNpux<4?592a`nG_okg3UETpa)3`0LZ66 zK7Rb53m+nsB(5zJ%zYMyP$w)l;7IC{UlcEEt^A7Q^uawKfWYx@VOW{m0%=l0>t|=p z`FeHMI)Zk?GmXU*Hqx%K{G_N4_XX0GBzE}I96{uj+B9#TI~QK7$t zNxZE}USrpvz@rB2g#Kv7wwjIso;3I5fml6HGLh9*=T@fTMa?Cibo!5T7t#uRAl?E| z<0AKgEKH2?9KCVy>^wy04^Eng$T@g+F6>vZ2H<3RFZ!kP@Z5WUC&&LhM=6Q&2_bF4 Ac>n+a diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_sticker_set_thumbnail.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_sticker_set_thumbnail.cpython-311.pyc deleted file mode 100644 index 0a1b7c89501f404fc1a0f8786dc2d1e69a91de3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1993 zcmbVN&1)n@6tDi6&t#HpzBFOuHj3haJHrZDAuNlM#5g27$|ga!cVca)t7g)h{uryO z)yNzsu;2>nO?JUOc#u`ui>Ez`e}IPwdl>o@@RZv~JV;Ky>YkYx3<%a#zji)h^$Rij}zxlPkI)u>gQs|F#!YIdgfq8%kB8rPV#Z(l@tFG#4rsnCU?xoC>mp0R& z*NELsx(PX(8r97dQOz{bXol$5z$XXU z0iW*iQlIJZkUPnNoKIw$V+E2WLyr`4;XbM>WbEFEnZJ)dQOu!r)c-GzN7L(6tP989 zr3|=@ozUC%EyuNn;QV<5#wMqR*m1bw#R(W9FgO*UlIotf5!4OKV6+js7Bd27coyF^ zcoJ5+my8YYuLsPtgmgZ;x(;|5UdRQk6ZTGQJ?q;G#SO=gt#QbkRD{gu#)2IXx^QQM zh4hXQ_y!Mcn{r;t$LC)ULT1wiV@HT4UnrODfYFlZ6{QrgMtM6Bylgd{mmq3?BPs^T z#ZjVZFrI@`q;bI_-M2g%X^t`x!?2WNT@m_I|*2 zYl{JK{6=jzWR?gRhQigT|50tt*{*R%(92EB-nAN(*DNQHcdnfDEH6XxaIds*2!RKP zmzsO*B5d{PrSlOl^;0pxi7x~BtBty|s4(~C^5-jGtUMdO*hOk#q%$@1?HfN`{pD6y z11VA6v`>Xtb4rdO5GoEQNQ?rXpm{-ZF{H6h;>so^k?6#=X3t6Pc_77MiL-1xjH5ip zUO+-u^1~Q^7+P-6lEIh+HmLROAaJ7sz#lgY;0VeQjG^&y0u#uiAfLYcz&AdE?4%ea zxjZhAOZxoONivM4X4*G8Q>{CY9j zyip2llrsqgfN#NT0d68#PK##FRe-($y42>7W-6&dx)0 q_29qeA(}flJ3GiYI6J%PR}@J4-{j#3KP)|)yYh!L{dtZ(KKb8F4e3s!2mbHF%7$B@`7Wv#9%`|Uld=~@TzM+sk*pg@b?f>k>tyZn`r1eB z&PHN>5bZw1nPqK@g=`?a(G{k4IQ27s8C|%?^Q$0#13@$7Vv1bj8U*i}%yMmNxH)RF zJhd)@O%Xx|-p+Vd5G7i^jry3D_A74jHu@U7r7l{2>y>1s%T!kd{*VdawgMHhn+GKa z#x==UL3!k-|9i_&y)ol7)u!dTI(cogx+~!I)y>ak1cwJloTzY%zAz1hOs9x8VhVJtkw1pz#JEc&wdaj@N!fnpcNolSQgwU$l5l`Ig4ixo+MY>aos zNx01f(-)M9S$@(*lVTntMfCmNitm%!DK*LPng%q2?=ud=Y!$Vkb`swHPPrmc!gQqUWB zfdB%>znNj#g&ESMf=;bYu1rtWC!Hg!I%!YZx7t(d^wg?NHYc06HmBA*NBNU8RJJ$q ztdK7PMgNNyQxBP+C#ZOR8EU6q)Y$c7c&~t+(Em3{PVJ5Xo-FtDRao1eWFoImon0Ok zE1F9^>GU5LE@l;YUz`U~<0AKg%uI~&6uou$^gKf64_`EokaPI-oaIhq4Zw@(-8T=c Q2dftzrQ3hM#3+sOU#di-zyJUM diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/set_webhook.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/set_webhook.cpython-311.pyc deleted file mode 100644 index 2de18393fce76166b75aa8303429e65773d20d0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3400 zcmbVP&2JmW72hS7q)3UBW!bUaSi!`Vtdf!_r*@H4FoLA6E7@@*A(Y{ok-Hl04#^Fd zJDb^A$ux9efdEZ`w&U*;!B?oO>bU8bE zZ|2SW{LRejFU4X(gXil%{;hE^rD=ahX82?iLVx}d5T9wbX6vrj(d)X7bjnS2()D!5 zs2iP3J=4k7voM~v4L8>rtB(Plv9oTzQ>YhoEv2n$cJ33+9%BVIeraey`!cO*U%{I^ z^$9y))5?Ws$d>hZoO&LYR65)X%0^t=dboMpytQ`w)_Zr>SL5`%UN<)GIf0DFHhdJK z?z2>~GJnVOL-{kuWzY0vq_o9c))ch!K9enOTWDhV4=O*KMtyx(^}O z)6A%6>{LB#r&-Q6Zh}l6f~$|&S>SUcJ`cg=?EHu?*ahInNBp=w0eo@9PuL~kCr5ly ztv{3StR&7t0#ANZpJ(k0pK1-=e&v%=eezT7v0gt@(}sV`7vn;W$p>t=#d(`v$!J=E zz;i!fM7ErObX3?xauWE=avEJi$^8%R5$f4QFpD{Rj5wafJC4^Rp>I>k0H&29dQxeT zl68C;RLKWShQbTL5pJ`Uoh=cv9l|{_Fi};xztbRH9?sjub=pt`PC69+1|cL&wkQM+ zQ4cao_Gth)l4Q4wYZkEs=Rx71SOK#HOhZ{Hlu0f1DTL0@-AXcRO5SE(1p;rJWOGr; z4s)$)F-R>$*<#d&_47Yp8t#szpK!VKuJ0_>l)1>|N+Nc>K2Kg1Yot8)y8uKKm@hep&j}JWt*X6DtVk_h&iKo8v zeQQP*9e3RO?fYasF zl;g=q@nnZSHer`|%u@H*Ddl)|eTeHpin=b}XZ8@^$EA^hUC!M{@i|*?-}K=Wg|rQ& z;)&B6znm3k;cgP=uzLl&i`ab+yH}x$FPpVdxTfiMZR$zKGTZx9Gy?%Qh8Abxkb#3O zHr6>fj8`Wlqryi8Kho=t~`ac@Zc6Q&A4Ei9d3s% z(i5inaY)_4OwKfIZo#mDSdNQOB84(UvKg056Sk(ABo6pV;7>mLK=wO9Eev!9(~Ejl zIW6Y8fDK*D!f1dm*qPn9xbeGNOJoxjw3KRW+U9n(OkK=acGp2c4U-MRHUPY zWgK2k+L5u0!@tPE@S$<>^mt^v8C|*ByLV_@P1=!h6=mDT)7-hfHj^nq?XTU4ey|uV zy%Al16I-R)pT3j_0Q`Sl9+fK1qfT5Mrfj`j#0ob;I3A$FA`KI97QVZnh)E6b{1Esr zgTUh=&ZuuPfvJYN!zCv01Q83^sX`E>lzuGE@z~7-J#UK}z+%;cKSS3~>$)CkR}Non vPqiN%zN|gfW)5F$kwy+*Z2jyzx(-qQ=l=Jv{mJ-dYVIFu`k((rNX77P#)9At diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/stop_message_live_location.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/stop_message_live_location.cpython-311.pyc deleted file mode 100644 index da8a6dfbea69791af69d8016b867ba05a9df333e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2376 zcmbVN&2QX96d&)}`@P#HP5RwpwL$H+$)=^0h^2*=w1miaM(yWSUyGKRB>4p4k!o2d-m?86{(Pz9lw1u@68*( z-}}w@VLqQB(0=~m*Xr+SLVm+Rr==oATK^K1yMz%YS)?Xul7xE9iq+y;ye4aMP0^HE zLQBAWoXJ+QmeNwSw3ddk!V*@dmesNniIFkFlD7#<@hng9G|yFIdpdiOP3=LPkSFj& zP0O?N6e(t&;jkzLS>3iBPxnm6c8hY5zxwfq7wPEx7e_B&nj8z_=k3KHb)}AG-3pXx z8l8^UHj3*3ku<(8WTd9waBY>*{m-nG|hMxXLX)C-m9`_vRgD;J%%f zh!ko45hz~)CY)#zBU)@4u+idN<_b?dpOuzmF)hX7TAIl`!;~|yE)6JYS(botvOCTJ zDjAmUj`N{^raLaMEZB3=m~Rt3fOO}Vzpt&`)<_$jX7$JiCIY>IALYsEE>dl+3S_`vQJx6t6joPR)@U-VtUA17LYPDB_Ux=DI z%d3vy>M^v^Iv1wHj;Z`s-4xs{saI^(Z5Rgl4ytAqcHrHGuoo0k)os-b%hE9nhF+YR z9%pLVuyofgU)N0sOH%R{>kziRcd4DxbroU>?lpwX*`VscF5;#M36%|p@$&VnqQPJA zDP_W(r<{f`cv+qIyt-Q+9yTD6lGm<&$q{qIvySHu>vi)mV$t3e6YZc7h6#3|wf!#7 zqdU2g?=bP2>xr3Q=WN3T0=h0W9NXpwvXq)^V^7yD4-CCrz@CZCsL=W&%>_E|vVke5-Ac7)&33Vu~ zFEZWsOoJ}m)Ww`D6!cF-bqM512NJ|1g$+$`yO1m)()xR#d@tRF`@rkiVdeomPvD8# zr(Fw+ElEqUrTCJ(q%i5evXuBq`YybI;8uuF3cNQSkpZ=J z2uO;B2$}7mM?~mFEo4I;EAm3@LV=KlWf%KU+Yh4Hixsf-8mBbKP+D_X!$Lhr z>1PeyYFm<&GRJ^&Byk~rf&zKgajYN@bKyw_lwnnYQaFBq8(zij>IK_ia`Phqvs(~X z$QW3~zz{O5slhD^Xd#IZMkLrdaTvV{9f1^e{{{j0ZvI*^SxL1BiX7?Rd+*4PuiqP5 z?K`?W;rEx8C)Wl~H08Zb86@@<`GhYo_{E{+v8Fr}^%Z%j6(dS5=BoqCA2j8GsISNa zzFhZ@9B<0~O&KKi75TU?Gyl}c@_17oiTa8>;>%yGCHq=rk5XtA$muuzlc)WogZ}U- z|E+gg+xpW`&;KXV7%>dn6=I+R$YimAMXWa9ZiONW{3-_txP+lP5yE(~1%4L8N(M@J zK??-3Q&rvNB8TH5iV*9AsD+y#{u`+?5lh|{ufY%t<30q@ic6B@lS9oH`x<$p`ComF uoNR8@eWEsB?5#veg8ct2?%9u~pN{-;;py4cq4TQ;-~9u9{@lVbOynPZO_-hl diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/stop_poll.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/stop_poll.cpython-311.pyc deleted file mode 100644 index 334f1ee141429c4f0323d44b874016891e7150fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1955 zcmbVNOK%)S5bl|seLqa>JdKkK2?#9;yO9t?nDCMlnUL6y%8m!jUBU=c9O5d5q9Ct2s+%)%u4ZU%-pIQJqX6?c zra48oWR%>pQ3g5B3QonX8dZg;WR|evZNf^t%FD-wyO8@iLLR`#no(orMbfN1MzN{H zRnznQ&xT@ z!0m=n-6EeVMs1M{|C!Ghpu+U9C03-d@nr*G= zw@j%^?uGht4~)6K?1wFV!P8~evbdCI(n(wvaHdaNjw$8zP1E)fjaJwTxNM=f7Vdjf zhs^{JyTaqFRY`+b^t;01)B0K%26DRHwtT@`;U1hVU#zxaN7*(5`*gYsxJlQ=B^1%? z?pT_x>$Vr3fdhyeanV{cLu#`)2Xk@7g*eSs4iodc^R{+Jb;n4k474%ZYrDVW^Pks$~|o}|AX>% zdbObZbMsA29DoI40?8=KpRlg;vKw#_mngM8JEXK(jK}{GGnL#~p>)6H;wX5F%ao?+ zrc}a}Cs<3 zRZBZ7L)pf}(zIxTo;U%nHx3LjZ4HCfVOqWqPSS(Oo7}Ecq7ePcHn1#&p;bTE=BGja+qXs7zu)q zrc~e~Bqo70>jTbmlB{h>A$X&aF?(O>894>1qFVQ1lDYvPhTj3pk&F=mQBe;4doQFDdbZB2;*+)e3sI; zL>olJSAGv9$tj8wkyC@G`!;!P@LzqKv1Edo*_X4^;iR Ik3Nn6ZxIX+l>h($ diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/unban_chat_member.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/unban_chat_member.cpython-311.pyc deleted file mode 100644 index 4bd802547bf5f4fdb8a3bbe1aa4f7b2e0c7e377a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2189 zcmbVM&2Jk;6rc63KNCCYN1zp{Ius~cD|I9e9HI(ALlp|CK_n4k>oOhhjO}f9cg*Z= zicuttR6&sdaX~%M0|!)udgH)f!6B7;i1rkTQ*TD$fO6u^Y@L!&fy8*``Mr5>X5ah0 z_vXiHwSr*$^4+hUPl^crriAe*WQ?)<0Wh}_L(K3|U^s@M_?({$Ovel?#|rXJJ}5W^ z*f*Kw7lV>hGEfdJA(p?1Sb>*#`Q-Rkbk{`a9;|FQ6;@n9cIlxKZ6lqaVJKo6dm@Z% zE3K}+|IS6S_{PP>w=Ol8QuDQNke1%=D>e1g{8|XiLnAv{Tjf6QN*Y||aZfNe`#?sm z?9bTk0rNRT!;xb!MD#zrOlV>@nz)W6b)_JfggYUo>9`Qw|#7ZESGntoVl@(d# zj=`pHp^m|(Zq}U2E%cG$Ost^szkMW~S_|7WT

    KG7s8ZQkp}kf?=#h9LGH`!h!Y{ z#{wtH7E|1pe8Uq-81#ovVVcAu0H|H+`-3^$PGYQ&w>hS5AKVl8x`3~4coh3yxITw@>}KC; zix>w<6k}xzezCv{y(pG62Cq7>bZBtF4I$SX_`(1)-l2&f&m9Q5n@~x^nDYp>X^d$n zhCr3G$|ucap+^`Zg75>4A{L#@2+sVA-(K9nD*}6&@%W-AU7~IqWWiHE5-O^CUGhL| za0WPbqzLvu*ua-McpwtYMED{g2L6N2i{?}Uv{fI1f~-O$brJdl;&n)t$9e<5t5Xu; z1y?Y>aBWp4{2CS^44508_vVMcgZY1-{u8@^rYBfd3UDc>+n6TirK@$iWyBC1@ z*0>GtMLgES&RtmdU}fX_zJ}#Cjm_Mq$&5SZruBpIwSJA@1u>hpDQjRZrxj6N{)FsY zn%5nZmI#3gjR~;}>CwMAOCs)f2sw089)sg)nGn~fQA9|j-a^&2c(}Lr`a_WY>4 zFDkQ4p}1YR3fYw`>?-gXYEz0+(8(i;C=_%a<#EN$0I??(lp)kNA!&t>K(NGD{3IbC zCe(kVDH6hj3)_||qqGVL>%s@XV6#RDlrG8e0C@`J$Im|4Y8TX-tzl8ebs}8u`;b9H zJ_D*q)x@iER#`zIWu&AOKLY`r9{)x;D_HVgnX|*@jy1cb=Y4B-ltcM9 zbKBPRaCx}=>GHPK*nYttHn%K0oA)gn_I8TLM`$Kr8y!WBmqrsu%7EzqBV~1qzG|OH zm17-A)1FY!b`p5K0a~frB`w5*KAwBq!g3ZlKz z`7Bkh$U2A$yXZ3@BhxU9ZFFYq;M_qkZ~fQYL3r!n92L$Q5Y|7*H{tiI51y+3u2g?K IL9hM%3s<*mH2?qr diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/unban_chat_sender_chat.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/unban_chat_sender_chat.cpython-311.pyc deleted file mode 100644 index a67b3aa744481216cf83c0d5925934c643e18138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1758 zcmbVM&2Jnv6t`z)KeL-ao3^wB7!@J3RoUgjC8|(ShysEJ)Fi5yE;zGeXLrcVc(6Sw zsdC7n5(NP_R3s4MfC{L0#2>+7EA?lipGUGypT>Pu++Z#DDND@o5! z<_5l6VhLqJbN(d=t?oiwk<3+tP`a^+%~jmZw7%=RsbCu+&t$aef*@hk4F>uj>A!MA zts}FPiN4@j>T)q&Z@bF_=JvR9<4h{I$6W1?#$gglC42>%YcR~Vu-`2%)+> zM+7!$DtIbFUjcv2ScLt7l5O`oQ<+GlI~#DyW>=R*##UXPKu|%zq-@tshD$sX0h@IP zN~LnP(+Rj>ZFNwQHW&R4L@GOe8op>U*U3qPl;(_!{Ipq_gZUwb`%|XKH^W3-b|J41 z^NKbgAPACK+=_d6P6$WJemM{8J!0|?TS(wyvXOSl?(8owO3x+=J z6A0nGtH6AN?}1Q_*Fkb0#se5d`}n^VYHi^yi{kICE&C_@wYeK`rtQU+C7Pftrhxp4 zT2@{%CC#gZK)Dnltx|sKNR&jfXpN9VBk>ei<~2fs$d{53sT0sAYkS{&bGCZ}irbyz zG)(&4^~@BX0N!1eY;@lZdtDhS_Dbpp>wcfft{-xJPdde6lpO~js*aE*4Rq%G_O+cem$nyootdHO51pAE=k|_sZfN>L=iH9-+HPffgr-V8 zJgQFAfTI6JYsN$2=Li)S#sM$3>Kehd4DK}`DD>l)m(^wpAQcGc!zJ_`02qDAgicYs zpoz(PT64yoMqh~yVQMmENH2VEQ<@4M*o@X37_xx?dqRDK?7EKa81 Uwtty^bfNv1S^oP8N+#BS0YeMxMF0Q* diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/unhide_general_forum_topic.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/unhide_general_forum_topic.cpython-311.pyc deleted file mode 100644 index 4e2719df7adcc66803ba6e204a8f62c4741baad0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1718 zcmbVM&2Jnv6t`z*KeL;lswJ(IA`677t;#Oqz#*zCLP!IGMu==wF)X;w*x4O2GhS>@ zOHdCvRH7i@fP{*~g##*}-uV}}a0pTl)tn;r)Z3zPKsoX3+3g3A3m(s#_xwKm-tXD- zW2@CbFn;;&x2<1&gzj5mIw}Q&4+3CrA&xkXQGx@EE$_u%QVL3mANWZ*D8pKb`*9_y z233qaw2FB72I3V_6}3~-i0F0+p*!#vBdGK0I%?M*Sh0=s8J4EfFcZmCw@Z1e_wL&( zboup_uh6MYa6537WTU))izl3!gI*3+KdD_ z8?uxpEM)^h-R}DAKLV;~Ff_VD-Vr8KsV0k|V9?rRDzZa$E9D$nO z&#Sgn8u7eMkLUxXqaDst6NPm98dC$U%Fx=pqFhC}za~==+S6l){aW=5um=}_`3B#D zqid#mSh)@F9e9iJ;X@7gIKGY}eBJv2f8{O&9OTlPYJuU;sO{xt*Ur2~DKyMb+V=Bf zk0nR7h_@(p_G%WK@;aqq%(SLd!$m}Jl6DV2cx|zN8JgK&mOM%a{q4*(o&v6YkzVb; z6>au)WW)<27H&gZb)QAj-iK~+_;j~`mQIkT4*H_`ozadu4jX+!j)1Z=P2FB!-2w8~ zE*j6G*6A--K3n}_^=@-vulXv>?=Rc$i%W&{kRE^sYFCO9o4~s|T|d;E6`!*D84FR$ z5Hg879i&u3ZTH^ETwSBXi+oBb09zZlYp%S z)D>$z9m=7IV`vIiPlHO^w!Wg~t(E;9I#RQWuYo|-kDjsTmuq8WNfVtowR`E_iO%lY zzQ3^N=I{Q(*hA$dZ@+qcjAqKqcwDR2fujFK>n=hO=P{~IPLo_~H!Nyf8QfPuP1&Db zUNJi(0H&zgo^NIUa?eOcL&d7>7H?L zl!FhE2#AM-go4C{0}7zr`4t?DltVNpOF8AX$Q+PQRP}iCk|QB{duqD69#i#Ib?-0D zW}U$J{l`CgXG(=mUGl*5W! zp`<`oh%DV8vaBkqdT#8I+%6Jw2cCSmHCb6Ft?C10TQr*xQ4}X4@#Dy}idl2xqYsw( z(!0w`?_FG5$%>27ZdTfiK>C2@29p~qP<<`JRh0~4>E&*7di)i7_zv)&L;Q-kR1&wa z33<3h<+vqTaLcl&D$=!8g( zR7t8M!{)tMs`)D$I#pL#9D#4o14P<&3*>s7YER9xL6Qv3e5d2ZTD6noYPVzE?*Im- zBZmG~#@9ZlI5y6i{E90SZg&MIiheVM(=PpU5G!(Az&#P|62 zRiXPv!$BcgS=&T1XDyDDhYg7X-zc7d<>3M>zNfd~G$dm=?A(Uu4m|nzpbyqe;@7{d)O}m9JLrHfHu4Z^8WO z629M9%(;j35G+WmoF~_Swaw60LQf(49LgsUoJfR<^Q_K!7|S%kb%XOyQxP0XDxAyM zgKcLkj)SZTnAuVS9I!dbIdm1YG~Ot{PXYhvS^`~!(q@X57GF;R7`#RG^B^)<&^PrN z)WW;fk}3+m1p-+=`i%-ssX8J^8szl3z14fCU)x(daAx-H{L`7a=Uh9eOpnM!X^D=i zl^Rg;zi7>R$o)J<_1STRYpps$)=S}Z0%RJm&#av6!rAKQDPvn}{7(Sfgi#uE(z8fx znx}AO-C^oS)eAZL3;Gpc5fk$zkWrCRdXK!g|KvO%bNkPp2ZZfEIY;HQ6tOs&{;=@t R%XeSs{AI;|KSRmJ`Y%eW`b_`; diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/unpin_all_forum_topic_messages.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/unpin_all_forum_topic_messages.cpython-311.pyc deleted file mode 100644 index 3e00676977760e9927796976a7f8d557cab10817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1821 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 diff --git a/env/Lib/site-packages/aiogram/methods/__pycache__/upload_sticker_file.cpython-311.pyc b/env/Lib/site-packages/aiogram/methods/__pycache__/upload_sticker_file.cpython-311.pyc deleted file mode 100644 index 7f4fb5c9482d5f9f2299d89876e4b3258eb1a55e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2010 zcmb7F&2Jk;6rc63Kh}wzrfr%OTDl^DYSh~Is6vzwLPTPrCQ-%8VzSv8CrkFj%!~=C zaxhXQiUb^xP?12u0TrR%`6CbqSL(sqQ>319TNDncC*I7iU7Dr`CbKW^&Aj*Kz2AE? z{`{+(iTt%}0S|YntS9elE~$JuqwoWStm(J}B6Q zplBCC&Xa;)3QXJ7P!263QoM~wiJG)}57LPe$7zsys zQOIk#xU%-a`wMvf-G%x0mYR#Pem&ef%t_5$Y`o+7G&YyQPFG0wP)j{j*Qigom=ml} zu^katIv$SfSncRTSos{1qsZ0>vUBT@q^(oK&Xb&7AUZ7);~MCgkP`5Pj4uLTN_kph zWm3I^+8U|c9=FXq=u^!uucG1q+C)6L-ti-ctP0QFp-jf;`~g9hEg0*ZT4LMdR-mG^ zL}Yc9w&hrD(6n|vu?;*=jjeXXEZ-57SzWO7LNKP*oa;NB&uutfBonTuzIfeb6jX6Y zcX4KqITiJJwcMn;SwyQ;Y+QM+6NiwIwTP61>tvYBT9g_?RL={7(T?x9bmYSem5&?g zau&i;DE(w0aO<+nN~P~Qp|we6vcw9yzVJGLiSPo-Yjx`e6~$!w zOJ{Wn{e~5V7Vo+)<-A^2HCTs+w7nn@T+8aN`J#p}o01mn&gaY86P z-r0577H4_sr@&O+vC)h|>dJPPL-sUWVKj!2cJvl7-)eW^@`>R-tlWd|K78r;XtYCe z``UhPUnklR`o8gt_O-g=a2@q#O=lCJ&Q3{k8pv<*&gFTxLs?wH*b6;@ajg)a{!g$_ zV84y=F-vv^%wrQ{)vXwF`M}6KVD%o~e0#2SGh#cf`G|PoR%@rr91$@Lz_)1lNo(2L zY;jM}s~yMPakeOLWxd|WdcBcWVAN%*-km)r-*BX9-JSekkj_!K!=e+3_# zl$=CD)smf++!T=7n1nNQ0*Y~5#yE&b*O&Y_#vgYbKier{Od=Psm8Fg=z^GmT%s{n@ zF*GSoApv;;S0hgrq|Qh zbl|qi-@`QdX~`+C5|GEGYiUW|V6THHk>cL~Npwxq2I%Gf)AInm+COO?pxORObAYV= d(=#c&ra_X=lJBZNi-$8;{*qgNpRliD{ufvXG%^4H diff --git a/env/Lib/site-packages/aiogram/methods/add_sticker_to_set.py b/env/Lib/site-packages/aiogram/methods/add_sticker_to_set.py deleted file mode 100644 index cc2e31d..0000000 --- a/env/Lib/site-packages/aiogram/methods/add_sticker_to_set.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from ..types import InputSticker -from .base import TelegramMethod - - -class AddStickerToSet(TelegramMethod[bool]): - """ - Use this method to add a new sticker to a set created by the bot. Emoji sticker sets can have up to 200 stickers. Other sticker sets can have up to 120 stickers. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#addstickertoset - """ - - __returning__ = bool - __api_method__ = "addStickerToSet" - - user_id: int - """User identifier of sticker set owner""" - name: str - """Sticker set name""" - sticker: InputSticker - """A JSON-serialized object with information about the added sticker. If exactly the same sticker had already been added to the set, then the set isn't changed.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - user_id: int, - name: str, - sticker: InputSticker, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(user_id=user_id, name=name, sticker=sticker, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/answer_callback_query.py b/env/Lib/site-packages/aiogram/methods/answer_callback_query.py deleted file mode 100644 index 15ed1bf..0000000 --- a/env/Lib/site-packages/aiogram/methods/answer_callback_query.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramMethod - - -class AnswerCallbackQuery(TelegramMethod[bool]): - """ - Use this method to send answers to callback queries sent from `inline keyboards `_. The answer will be displayed to the user as a notification at the top of the chat screen or as an alert. On success, :code:`True` is returned. - - Alternatively, the user can be redirected to the specified Game URL. For this option to work, you must first create a game for your bot via `@BotFather `_ and accept the terms. Otherwise, you may use links like :code:`t.me/your_bot?start=XXXX` that open your bot with a parameter. - - Source: https://core.telegram.org/bots/api#answercallbackquery - """ - - __returning__ = bool - __api_method__ = "answerCallbackQuery" - - callback_query_id: str - """Unique identifier for the query to be answered""" - text: Optional[str] = None - """Text of the notification. If not specified, nothing will be shown to the user, 0-200 characters""" - show_alert: Optional[bool] = None - """If :code:`True`, an alert will be shown by the client instead of a notification at the top of the chat screen. Defaults to *false*.""" - url: Optional[str] = None - """URL that will be opened by the user's client. If you have created a :class:`aiogram.types.game.Game` and accepted the conditions via `@BotFather `_, specify the URL that opens your game - note that this will only work if the query comes from a `https://core.telegram.org/bots/api#inlinekeyboardbutton `_ *callback_game* button.""" - cache_time: Optional[int] = None - """The maximum amount of time in seconds that the result of the callback query may be cached client-side. Telegram apps will support caching starting in version 3.14. Defaults to 0.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - callback_query_id: str, - text: Optional[str] = None, - show_alert: Optional[bool] = None, - url: Optional[str] = None, - cache_time: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - callback_query_id=callback_query_id, - text=text, - show_alert=show_alert, - url=url, - cache_time=cache_time, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/answer_inline_query.py b/env/Lib/site-packages/aiogram/methods/answer_inline_query.py deleted file mode 100644 index acfb80a..0000000 --- a/env/Lib/site-packages/aiogram/methods/answer_inline_query.py +++ /dev/null @@ -1,145 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..types import ( - InlineQueryResultArticle, - InlineQueryResultAudio, - InlineQueryResultCachedAudio, - InlineQueryResultCachedDocument, - InlineQueryResultCachedGif, - InlineQueryResultCachedMpeg4Gif, - InlineQueryResultCachedPhoto, - InlineQueryResultCachedSticker, - InlineQueryResultCachedVideo, - InlineQueryResultCachedVoice, - InlineQueryResultContact, - InlineQueryResultDocument, - InlineQueryResultGame, - InlineQueryResultGif, - InlineQueryResultLocation, - InlineQueryResultMpeg4Gif, - InlineQueryResultPhoto, - InlineQueryResultsButton, - InlineQueryResultVenue, - InlineQueryResultVideo, - InlineQueryResultVoice, -) -from .base import TelegramMethod - - -class AnswerInlineQuery(TelegramMethod[bool]): - """ - Use this method to send answers to an inline query. On success, :code:`True` is returned. - - No more than **50** results per query are allowed. - - Source: https://core.telegram.org/bots/api#answerinlinequery - """ - - __returning__ = bool - __api_method__ = "answerInlineQuery" - - inline_query_id: str - """Unique identifier for the answered query""" - results: List[ - Union[ - InlineQueryResultCachedAudio, - InlineQueryResultCachedDocument, - InlineQueryResultCachedGif, - InlineQueryResultCachedMpeg4Gif, - InlineQueryResultCachedPhoto, - InlineQueryResultCachedSticker, - InlineQueryResultCachedVideo, - InlineQueryResultCachedVoice, - InlineQueryResultArticle, - InlineQueryResultAudio, - InlineQueryResultContact, - InlineQueryResultGame, - InlineQueryResultDocument, - InlineQueryResultGif, - InlineQueryResultLocation, - InlineQueryResultMpeg4Gif, - InlineQueryResultPhoto, - InlineQueryResultVenue, - InlineQueryResultVideo, - InlineQueryResultVoice, - ] - ] - """A JSON-serialized array of results for the inline query""" - cache_time: Optional[int] = None - """The maximum amount of time in seconds that the result of the inline query may be cached on the server. Defaults to 300.""" - is_personal: Optional[bool] = None - """Pass :code:`True` if results may be cached on the server side only for the user that sent the query. By default, results may be returned to any user who sends the same query.""" - next_offset: Optional[str] = None - """Pass the offset that a client should send in the next query with the same text to receive more results. Pass an empty string if there are no more results or if you don't support pagination. Offset length can't exceed 64 bytes.""" - button: Optional[InlineQueryResultsButton] = None - """A JSON-serialized object describing a button to be shown above inline query results""" - switch_pm_parameter: Optional[str] = Field(None, json_schema_extra={"deprecated": True}) - """`Deep-linking `_ parameter for the /start message sent to the bot when user presses the switch button. 1-64 characters, only :code:`A-Z`, :code:`a-z`, :code:`0-9`, :code:`_` and :code:`-` are allowed. - -.. deprecated:: API:6.7 - https://core.telegram.org/bots/api-changelog#april-21-2023""" - switch_pm_text: Optional[str] = Field(None, json_schema_extra={"deprecated": True}) - """If passed, clients will display a button with specified text that switches the user to a private chat with the bot and sends the bot a start message with the parameter *switch_pm_parameter* - -.. deprecated:: API:6.7 - https://core.telegram.org/bots/api-changelog#april-21-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - inline_query_id: str, - results: List[ - Union[ - InlineQueryResultCachedAudio, - InlineQueryResultCachedDocument, - InlineQueryResultCachedGif, - InlineQueryResultCachedMpeg4Gif, - InlineQueryResultCachedPhoto, - InlineQueryResultCachedSticker, - InlineQueryResultCachedVideo, - InlineQueryResultCachedVoice, - InlineQueryResultArticle, - InlineQueryResultAudio, - InlineQueryResultContact, - InlineQueryResultGame, - InlineQueryResultDocument, - InlineQueryResultGif, - InlineQueryResultLocation, - InlineQueryResultMpeg4Gif, - InlineQueryResultPhoto, - InlineQueryResultVenue, - InlineQueryResultVideo, - InlineQueryResultVoice, - ] - ], - cache_time: Optional[int] = None, - is_personal: Optional[bool] = None, - next_offset: Optional[str] = None, - button: Optional[InlineQueryResultsButton] = None, - switch_pm_parameter: Optional[str] = None, - switch_pm_text: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - inline_query_id=inline_query_id, - results=results, - cache_time=cache_time, - is_personal=is_personal, - next_offset=next_offset, - button=button, - switch_pm_parameter=switch_pm_parameter, - switch_pm_text=switch_pm_text, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/answer_pre_checkout_query.py b/env/Lib/site-packages/aiogram/methods/answer_pre_checkout_query.py deleted file mode 100644 index 479d76c..0000000 --- a/env/Lib/site-packages/aiogram/methods/answer_pre_checkout_query.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramMethod - - -class AnswerPreCheckoutQuery(TelegramMethod[bool]): - """ - Once the user has confirmed their payment and shipping details, the Bot API sends the final confirmation in the form of an :class:`aiogram.types.update.Update` with the field *pre_checkout_query*. Use this method to respond to such pre-checkout queries. On success, :code:`True` is returned. **Note:** The Bot API must receive an answer within 10 seconds after the pre-checkout query was sent. - - Source: https://core.telegram.org/bots/api#answerprecheckoutquery - """ - - __returning__ = bool - __api_method__ = "answerPreCheckoutQuery" - - pre_checkout_query_id: str - """Unique identifier for the query to be answered""" - ok: bool - """Specify :code:`True` if everything is alright (goods are available, etc.) and the bot is ready to proceed with the order. Use :code:`False` if there are any problems.""" - error_message: Optional[str] = None - """Required if *ok* is :code:`False`. Error message in human readable form that explains the reason for failure to proceed with the checkout (e.g. "Sorry, somebody just bought the last of our amazing black T-shirts while you were busy filling out your payment details. Please choose a different color or garment!"). Telegram will display this message to the user.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - pre_checkout_query_id: str, - ok: bool, - error_message: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - pre_checkout_query_id=pre_checkout_query_id, - ok=ok, - error_message=error_message, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/answer_shipping_query.py b/env/Lib/site-packages/aiogram/methods/answer_shipping_query.py deleted file mode 100644 index ad0e9dc..0000000 --- a/env/Lib/site-packages/aiogram/methods/answer_shipping_query.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from ..types import ShippingOption -from .base import TelegramMethod - - -class AnswerShippingQuery(TelegramMethod[bool]): - """ - If you sent an invoice requesting a shipping address and the parameter *is_flexible* was specified, the Bot API will send an :class:`aiogram.types.update.Update` with a *shipping_query* field to the bot. Use this method to reply to shipping queries. On success, :code:`True` is returned. - - Source: https://core.telegram.org/bots/api#answershippingquery - """ - - __returning__ = bool - __api_method__ = "answerShippingQuery" - - shipping_query_id: str - """Unique identifier for the query to be answered""" - ok: bool - """Pass :code:`True` if delivery to the specified address is possible and :code:`False` if there are any problems (for example, if delivery to the specified address is not possible)""" - shipping_options: Optional[List[ShippingOption]] = None - """Required if *ok* is :code:`True`. A JSON-serialized array of available shipping options.""" - error_message: Optional[str] = None - """Required if *ok* is :code:`False`. Error message in human readable form that explains why it is impossible to complete the order (e.g. "Sorry, delivery to your desired address is unavailable'). Telegram will display this message to the user.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - shipping_query_id: str, - ok: bool, - shipping_options: Optional[List[ShippingOption]] = None, - error_message: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - shipping_query_id=shipping_query_id, - ok=ok, - shipping_options=shipping_options, - error_message=error_message, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/answer_web_app_query.py b/env/Lib/site-packages/aiogram/methods/answer_web_app_query.py deleted file mode 100644 index 4dc87eb..0000000 --- a/env/Lib/site-packages/aiogram/methods/answer_web_app_query.py +++ /dev/null @@ -1,103 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from ..types import ( - InlineQueryResultArticle, - InlineQueryResultAudio, - InlineQueryResultCachedAudio, - InlineQueryResultCachedDocument, - InlineQueryResultCachedGif, - InlineQueryResultCachedMpeg4Gif, - InlineQueryResultCachedPhoto, - InlineQueryResultCachedSticker, - InlineQueryResultCachedVideo, - InlineQueryResultCachedVoice, - InlineQueryResultContact, - InlineQueryResultDocument, - InlineQueryResultGame, - InlineQueryResultGif, - InlineQueryResultLocation, - InlineQueryResultMpeg4Gif, - InlineQueryResultPhoto, - InlineQueryResultVenue, - InlineQueryResultVideo, - InlineQueryResultVoice, - SentWebAppMessage, -) -from .base import TelegramMethod - - -class AnswerWebAppQuery(TelegramMethod[SentWebAppMessage]): - """ - Use this method to set the result of an interaction with a `Web App `_ and send a corresponding message on behalf of the user to the chat from which the query originated. On success, a :class:`aiogram.types.sent_web_app_message.SentWebAppMessage` object is returned. - - Source: https://core.telegram.org/bots/api#answerwebappquery - """ - - __returning__ = SentWebAppMessage - __api_method__ = "answerWebAppQuery" - - web_app_query_id: str - """Unique identifier for the query to be answered""" - result: Union[ - InlineQueryResultCachedAudio, - InlineQueryResultCachedDocument, - InlineQueryResultCachedGif, - InlineQueryResultCachedMpeg4Gif, - InlineQueryResultCachedPhoto, - InlineQueryResultCachedSticker, - InlineQueryResultCachedVideo, - InlineQueryResultCachedVoice, - InlineQueryResultArticle, - InlineQueryResultAudio, - InlineQueryResultContact, - InlineQueryResultGame, - InlineQueryResultDocument, - InlineQueryResultGif, - InlineQueryResultLocation, - InlineQueryResultMpeg4Gif, - InlineQueryResultPhoto, - InlineQueryResultVenue, - InlineQueryResultVideo, - InlineQueryResultVoice, - ] - """A JSON-serialized object describing the message to be sent""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - web_app_query_id: str, - result: Union[ - InlineQueryResultCachedAudio, - InlineQueryResultCachedDocument, - InlineQueryResultCachedGif, - InlineQueryResultCachedMpeg4Gif, - InlineQueryResultCachedPhoto, - InlineQueryResultCachedSticker, - InlineQueryResultCachedVideo, - InlineQueryResultCachedVoice, - InlineQueryResultArticle, - InlineQueryResultAudio, - InlineQueryResultContact, - InlineQueryResultGame, - InlineQueryResultDocument, - InlineQueryResultGif, - InlineQueryResultLocation, - InlineQueryResultMpeg4Gif, - InlineQueryResultPhoto, - InlineQueryResultVenue, - InlineQueryResultVideo, - InlineQueryResultVoice, - ], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(web_app_query_id=web_app_query_id, result=result, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/approve_chat_join_request.py b/env/Lib/site-packages/aiogram/methods/approve_chat_join_request.py deleted file mode 100644 index 2f4995b..0000000 --- a/env/Lib/site-packages/aiogram/methods/approve_chat_join_request.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class ApproveChatJoinRequest(TelegramMethod[bool]): - """ - Use this method to approve a chat join request. The bot must be an administrator in the chat for this to work and must have the *can_invite_users* administrator right. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#approvechatjoinrequest - """ - - __returning__ = bool - __api_method__ = "approveChatJoinRequest" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - user_id: int - """Unique identifier of the target user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], user_id: int, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, user_id=user_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/ban_chat_member.py b/env/Lib/site-packages/aiogram/methods/ban_chat_member.py deleted file mode 100644 index 947fcca..0000000 --- a/env/Lib/site-packages/aiogram/methods/ban_chat_member.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -import datetime -from typing import TYPE_CHECKING, Any, Optional, Union - -from .base import TelegramMethod - - -class BanChatMember(TelegramMethod[bool]): - """ - Use this method to ban a user in a group, a supergroup or a channel. In the case of supergroups and channels, the user will not be able to return to the chat on their own using invite links, etc., unless `unbanned `_ first. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#banchatmember - """ - - __returning__ = bool - __api_method__ = "banChatMember" - - chat_id: Union[int, str] - """Unique identifier for the target group or username of the target supergroup or channel (in the format :code:`@channelusername`)""" - user_id: int - """Unique identifier of the target user""" - until_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None - """Date when the user will be unbanned; Unix time. If user is banned for more than 366 days or less than 30 seconds from the current time they are considered to be banned forever. Applied for supergroups and channels only.""" - revoke_messages: Optional[bool] = None - """Pass :code:`True` to delete all messages from the chat for the user that is being removed. If :code:`False`, the user will be able to see messages in the group that were sent before the user was removed. Always :code:`True` for supergroups and channels.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - user_id: int, - until_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - revoke_messages: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - user_id=user_id, - until_date=until_date, - revoke_messages=revoke_messages, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/ban_chat_sender_chat.py b/env/Lib/site-packages/aiogram/methods/ban_chat_sender_chat.py deleted file mode 100644 index cbe6194..0000000 --- a/env/Lib/site-packages/aiogram/methods/ban_chat_sender_chat.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class BanChatSenderChat(TelegramMethod[bool]): - """ - Use this method to ban a channel chat in a supergroup or a channel. Until the chat is `unbanned `_, the owner of the banned chat won't be able to send messages on behalf of **any of their channels**. The bot must be an administrator in the supergroup or channel for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#banchatsenderchat - """ - - __returning__ = bool - __api_method__ = "banChatSenderChat" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - sender_chat_id: int - """Unique identifier of the target sender chat""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - sender_chat_id: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, sender_chat_id=sender_chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/base.py b/env/Lib/site-packages/aiogram/methods/base.py deleted file mode 100644 index b2d35be..0000000 --- a/env/Lib/site-packages/aiogram/methods/base.py +++ /dev/null @@ -1,95 +0,0 @@ -from __future__ import annotations - -from abc import ABC, abstractmethod -from typing import ( - TYPE_CHECKING, - Any, - ClassVar, - Dict, - Generator, - Generic, - Optional, - TypeVar, -) - -from pydantic import BaseModel, ConfigDict -from pydantic.functional_validators import model_validator - -from aiogram.client.context_controller import BotContextController - -from ..types import InputFile, ResponseParameters -from ..types.base import UNSET_TYPE - -if TYPE_CHECKING: - from ..client.bot import Bot - -TelegramType = TypeVar("TelegramType", bound=Any) - - -class Request(BaseModel): - model_config = ConfigDict(arbitrary_types_allowed=True) - - method: str - - data: Dict[str, Optional[Any]] - files: Optional[Dict[str, InputFile]] - - -class Response(BaseModel, Generic[TelegramType]): - ok: bool - result: Optional[TelegramType] = None - description: Optional[str] = None - error_code: Optional[int] = None - parameters: Optional[ResponseParameters] = None - - -class TelegramMethod(BotContextController, BaseModel, Generic[TelegramType], ABC): - model_config = ConfigDict( - extra="allow", - populate_by_name=True, - arbitrary_types_allowed=True, - ) - - @model_validator(mode="before") - @classmethod - def remove_unset(cls, values: Dict[str, Any]) -> Dict[str, Any]: - """ - Remove UNSET before fields validation. - - We use UNSET as a sentinel value for `parse_mode` and replace it to real value later. - It isn't a problem when it's just default value for a model field, - but UNSET might be passing to a model initialization from `Bot.method_name`, - so we must take care of it and remove it before fields validation. - """ - if not isinstance(values, dict): - return values - return {k: v for k, v in values.items() if not isinstance(v, UNSET_TYPE)} - - if TYPE_CHECKING: - __returning__: ClassVar[type] - __api_method__: ClassVar[str] - else: - - @property - @abstractmethod - def __returning__(self) -> type: - pass - - @property - @abstractmethod - def __api_method__(self) -> str: - pass - - async def emit(self, bot: Bot) -> TelegramType: - return await bot(self) - - def __await__(self) -> Generator[Any, None, TelegramType]: - bot = self._bot - if not bot: - raise RuntimeError( - "This method is not mounted to a any bot instance, please call it explicilty " - "with bot instance `await bot(method)`\n" - "or mount method to a bot instance `method.as_(bot)` " - "and then call it `await method()`" - ) - return self.emit(bot).__await__() diff --git a/env/Lib/site-packages/aiogram/methods/close.py b/env/Lib/site-packages/aiogram/methods/close.py deleted file mode 100644 index 7c33eca..0000000 --- a/env/Lib/site-packages/aiogram/methods/close.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import annotations - -from .base import TelegramMethod - - -class Close(TelegramMethod[bool]): - """ - Use this method to close the bot instance before moving it from one local server to another. You need to delete the webhook before calling this method to ensure that the bot isn't launched again after server restart. The method will return error 429 in the first 10 minutes after the bot is launched. Returns :code:`True` on success. Requires no parameters. - - Source: https://core.telegram.org/bots/api#close - """ - - __returning__ = bool - __api_method__ = "close" diff --git a/env/Lib/site-packages/aiogram/methods/close_forum_topic.py b/env/Lib/site-packages/aiogram/methods/close_forum_topic.py deleted file mode 100644 index 110fbce..0000000 --- a/env/Lib/site-packages/aiogram/methods/close_forum_topic.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class CloseForumTopic(TelegramMethod[bool]): - """ - Use this method to close an open topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights, unless it is the creator of the topic. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#closeforumtopic - """ - - __returning__ = bool - __api_method__ = "closeForumTopic" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - message_thread_id: int - """Unique identifier for the target message thread of the forum topic""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - message_thread_id: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, message_thread_id=message_thread_id, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/methods/close_general_forum_topic.py b/env/Lib/site-packages/aiogram/methods/close_general_forum_topic.py deleted file mode 100644 index 3f1a633..0000000 --- a/env/Lib/site-packages/aiogram/methods/close_general_forum_topic.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class CloseGeneralForumTopic(TelegramMethod[bool]): - """ - Use this method to close an open 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#closegeneralforumtopic - """ - - __returning__ = bool - __api_method__ = "closeGeneralForumTopic" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/copy_message.py b/env/Lib/site-packages/aiogram/methods/copy_message.py deleted file mode 100644 index ca44f93..0000000 --- a/env/Lib/site-packages/aiogram/methods/copy_message.py +++ /dev/null @@ -1,116 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - MessageEntity, - MessageId, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class CopyMessage(TelegramMethod[MessageId]): - """ - Use this method to copy messages of any kind. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz :class:`aiogram.methods.poll.Poll` can be copied only if the value of the field *correct_option_id* is known to the bot. The method is analogous to the method :class:`aiogram.methods.forward_message.ForwardMessage`, but the copied message doesn't have a link to the original message. Returns the :class:`aiogram.types.message_id.MessageId` of the sent message on success. - - Source: https://core.telegram.org/bots/api#copymessage - """ - - __returning__ = MessageId - __api_method__ = "copyMessage" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - from_chat_id: Union[int, str] - """Unique identifier for the chat where the original message was sent (or channel username in the format :code:`@channelusername`)""" - message_id: int - """Message identifier in the chat specified in *from_chat_id*""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - caption: Optional[str] = None - """New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """Mode for parsing entities in the new caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """A JSON-serialized list of special entities that appear in the new caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """Pass :code:`True`, if the caption must be shown above the message media. Ignored if a new caption isn't specified.""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - from_chat_id: Union[int, str], - message_id: int, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - from_chat_id=from_chat_id, - message_id=message_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - disable_notification=disable_notification, - protect_content=protect_content, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/copy_messages.py b/env/Lib/site-packages/aiogram/methods/copy_messages.py deleted file mode 100644 index c734d0a..0000000 --- a/env/Lib/site-packages/aiogram/methods/copy_messages.py +++ /dev/null @@ -1,61 +0,0 @@ -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from ..types import MessageId -from .base import TelegramMethod - - -class CopyMessages(TelegramMethod[List[MessageId]]): - """ - Use this method to copy messages of any kind. If some of the specified messages can't be found or copied, they are skipped. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz :class:`aiogram.methods.poll.Poll` can be copied only if the value of the field *correct_option_id* is known to the bot. The method is analogous to the method :class:`aiogram.methods.forward_messages.ForwardMessages`, but the copied messages don't have a link to the original message. Album grouping is kept for copied messages. On success, an array of :class:`aiogram.types.message_id.MessageId` of the sent messages is returned. - - Source: https://core.telegram.org/bots/api#copymessages - """ - - __returning__ = List[MessageId] - __api_method__ = "copyMessages" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - from_chat_id: Union[int, str] - """Unique identifier for the chat where the original messages were sent (or channel username in the format :code:`@channelusername`)""" - message_ids: List[int] - """A JSON-serialized list of 1-100 identifiers of messages in the chat *from_chat_id* to copy. The identifiers must be specified in a strictly increasing order.""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - disable_notification: Optional[bool] = None - """Sends the messages `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[bool] = None - """Protects the contents of the sent messages from forwarding and saving""" - remove_caption: Optional[bool] = None - """Pass :code:`True` to copy the messages without their captions""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - from_chat_id: Union[int, str], - message_ids: List[int], - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - remove_caption: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - from_chat_id=from_chat_id, - message_ids=message_ids, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - remove_caption=remove_caption, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/create_chat_invite_link.py b/env/Lib/site-packages/aiogram/methods/create_chat_invite_link.py deleted file mode 100644 index ff0b386..0000000 --- a/env/Lib/site-packages/aiogram/methods/create_chat_invite_link.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import annotations - -import datetime -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import ChatInviteLink -from .base import TelegramMethod - - -class CreateChatInviteLink(TelegramMethod[ChatInviteLink]): - """ - Use this method to create an additional invite link for a chat. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. The link can be revoked using the method :class:`aiogram.methods.revoke_chat_invite_link.RevokeChatInviteLink`. Returns the new invite link as :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - - Source: https://core.telegram.org/bots/api#createchatinvitelink - """ - - __returning__ = ChatInviteLink - __api_method__ = "createChatInviteLink" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - name: Optional[str] = None - """Invite link name; 0-32 characters""" - expire_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None - """Point in time (Unix timestamp) when the link will expire""" - member_limit: Optional[int] = None - """The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999""" - creates_join_request: Optional[bool] = None - """:code:`True`, if users joining the chat via the link need to be approved by chat administrators. If :code:`True`, *member_limit* can't be specified""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - name: Optional[str] = None, - expire_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - member_limit: Optional[int] = None, - creates_join_request: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - name=name, - expire_date=expire_date, - member_limit=member_limit, - creates_join_request=creates_join_request, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/create_chat_subscription_invite_link.py b/env/Lib/site-packages/aiogram/methods/create_chat_subscription_invite_link.py deleted file mode 100644 index 1301eb2..0000000 --- a/env/Lib/site-packages/aiogram/methods/create_chat_subscription_invite_link.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import annotations - -import datetime -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import ChatInviteLink -from .base import TelegramMethod - - -class CreateChatSubscriptionInviteLink(TelegramMethod[ChatInviteLink]): - """ - Use this method to create a `subscription invite link `_ for a channel chat. The bot must have the *can_invite_users* administrator rights. The link can be edited using the method :class:`aiogram.methods.edit_chat_subscription_invite_link.EditChatSubscriptionInviteLink` or revoked using the method :class:`aiogram.methods.revoke_chat_invite_link.RevokeChatInviteLink`. Returns the new invite link as a :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - - Source: https://core.telegram.org/bots/api#createchatsubscriptioninvitelink - """ - - __returning__ = ChatInviteLink - __api_method__ = "createChatSubscriptionInviteLink" - - chat_id: Union[int, str] - """Unique identifier for the target channel chat or username of the target channel (in the format :code:`@channelusername`)""" - subscription_period: Union[datetime.datetime, datetime.timedelta, int] - """The number of seconds the subscription will be active for before the next payment. Currently, it must always be 2592000 (30 days).""" - subscription_price: int - """The amount of Telegram Stars a user must pay initially and after each subsequent subscription period to be a member of the chat; 1-2500""" - name: Optional[str] = None - """Invite link name; 0-32 characters""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - subscription_period: Union[datetime.datetime, datetime.timedelta, int], - subscription_price: int, - name: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - subscription_period=subscription_period, - subscription_price=subscription_price, - name=name, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/create_forum_topic.py b/env/Lib/site-packages/aiogram/methods/create_forum_topic.py deleted file mode 100644 index 8b0f692..0000000 --- a/env/Lib/site-packages/aiogram/methods/create_forum_topic.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import ForumTopic -from .base import TelegramMethod - - -class CreateForumTopic(TelegramMethod[ForumTopic]): - """ - Use this method to create a topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights. Returns information about the created topic as a :class:`aiogram.types.forum_topic.ForumTopic` object. - - Source: https://core.telegram.org/bots/api#createforumtopic - """ - - __returning__ = ForumTopic - __api_method__ = "createForumTopic" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - name: str - """Topic name, 1-128 characters""" - icon_color: Optional[int] = None - """Color of the topic icon in RGB format. Currently, must be one of 7322096 (0x6FB9F0), 16766590 (0xFFD67E), 13338331 (0xCB86DB), 9367192 (0x8EEE98), 16749490 (0xFF93B2), or 16478047 (0xFB6F5F)""" - icon_custom_emoji_id: Optional[str] = None - """Unique identifier of the custom emoji shown as the topic icon. Use :class:`aiogram.methods.get_forum_topic_icon_stickers.GetForumTopicIconStickers` to get all allowed custom emoji identifiers.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - name: str, - icon_color: Optional[int] = None, - icon_custom_emoji_id: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - name=name, - icon_color=icon_color, - icon_custom_emoji_id=icon_custom_emoji_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/create_invoice_link.py b/env/Lib/site-packages/aiogram/methods/create_invoice_link.py deleted file mode 100644 index 2068f75..0000000 --- a/env/Lib/site-packages/aiogram/methods/create_invoice_link.py +++ /dev/null @@ -1,115 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from ..types import LabeledPrice -from .base import TelegramMethod - - -class CreateInvoiceLink(TelegramMethod[str]): - """ - Use this method to create a link for an invoice. Returns the created invoice link as *String* on success. - - Source: https://core.telegram.org/bots/api#createinvoicelink - """ - - __returning__ = str - __api_method__ = "createInvoiceLink" - - title: str - """Product name, 1-32 characters""" - description: str - """Product description, 1-255 characters""" - payload: str - """Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes.""" - currency: str - """Three-letter ISO 4217 currency code, see `more on currencies `_. Pass 'XTR' for payments in `Telegram Stars `_.""" - prices: List[LabeledPrice] - """Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in `Telegram Stars `_.""" - provider_token: Optional[str] = None - """Payment provider token, obtained via `@BotFather `_. Pass an empty string for payments in `Telegram Stars `_.""" - max_tip_amount: Optional[int] = None - """The maximum accepted amount for tips in the *smallest units* of the currency (integer, **not** float/double). For example, for a maximum tip of :code:`US$ 1.45` pass :code:`max_tip_amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in `Telegram Stars `_.""" - suggested_tip_amounts: Optional[List[int]] = None - """A JSON-serialized array of suggested amounts of tips in the *smallest units* of the currency (integer, **not** float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed *max_tip_amount*.""" - provider_data: Optional[str] = None - """JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider.""" - photo_url: Optional[str] = None - """URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service.""" - photo_size: Optional[int] = None - """Photo size in bytes""" - photo_width: Optional[int] = None - """Photo width""" - photo_height: Optional[int] = None - """Photo height""" - need_name: Optional[bool] = None - """Pass :code:`True` if you require the user's full name to complete the order. Ignored for payments in `Telegram Stars `_.""" - need_phone_number: Optional[bool] = None - """Pass :code:`True` if you require the user's phone number to complete the order. Ignored for payments in `Telegram Stars `_.""" - need_email: Optional[bool] = None - """Pass :code:`True` if you require the user's email address to complete the order. Ignored for payments in `Telegram Stars `_.""" - need_shipping_address: Optional[bool] = None - """Pass :code:`True` if you require the user's shipping address to complete the order. Ignored for payments in `Telegram Stars `_.""" - send_phone_number_to_provider: Optional[bool] = None - """Pass :code:`True` if the user's phone number should be sent to the provider. Ignored for payments in `Telegram Stars `_.""" - send_email_to_provider: Optional[bool] = None - """Pass :code:`True` if the user's email address should be sent to the provider. Ignored for payments in `Telegram Stars `_.""" - is_flexible: Optional[bool] = None - """Pass :code:`True` if the final price depends on the shipping method. Ignored for payments in `Telegram Stars `_.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - title: str, - description: str, - payload: str, - currency: str, - prices: List[LabeledPrice], - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[List[int]] = None, - provider_data: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - title=title, - description=description, - payload=payload, - currency=currency, - prices=prices, - provider_token=provider_token, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - provider_data=provider_data, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - is_flexible=is_flexible, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/create_new_sticker_set.py b/env/Lib/site-packages/aiogram/methods/create_new_sticker_set.py deleted file mode 100644 index c304d85..0000000 --- a/env/Lib/site-packages/aiogram/methods/create_new_sticker_set.py +++ /dev/null @@ -1,68 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from pydantic import Field - -from ..types import InputSticker -from .base import TelegramMethod - - -class CreateNewStickerSet(TelegramMethod[bool]): - """ - Use this method to create a new sticker set owned by a user. The bot will be able to edit the sticker set thus created. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#createnewstickerset - """ - - __returning__ = bool - __api_method__ = "createNewStickerSet" - - user_id: int - """User identifier of created sticker set owner""" - name: str - """Short name of sticker set, to be used in :code:`t.me/addstickers/` URLs (e.g., *animals*). Can contain only English letters, digits and underscores. Must begin with a letter, can't contain consecutive underscores and must end in :code:`"_by_"`. :code:`` is case insensitive. 1-64 characters.""" - title: str - """Sticker set title, 1-64 characters""" - stickers: List[InputSticker] - """A JSON-serialized list of 1-50 initial stickers to be added to the sticker set""" - sticker_type: Optional[str] = None - """Type of stickers in the set, pass 'regular', 'mask', or 'custom_emoji'. By default, a regular sticker set is created.""" - needs_repainting: Optional[bool] = None - """Pass :code:`True` if stickers in the sticker set must be repainted to the color of text when used in messages, the accent color if used as emoji status, white on chat photos, or another appropriate color based on context; for custom emoji sticker sets only""" - sticker_format: Optional[str] = Field(None, json_schema_extra={"deprecated": True}) - """Format of stickers in the set, must be one of 'static', 'animated', 'video' - -.. deprecated:: API:7.2 - https://core.telegram.org/bots/api-changelog#march-31-2024""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - user_id: int, - name: str, - title: str, - stickers: List[InputSticker], - sticker_type: Optional[str] = None, - needs_repainting: Optional[bool] = None, - sticker_format: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - user_id=user_id, - name=name, - title=title, - stickers=stickers, - sticker_type=sticker_type, - needs_repainting=needs_repainting, - sticker_format=sticker_format, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/decline_chat_join_request.py b/env/Lib/site-packages/aiogram/methods/decline_chat_join_request.py deleted file mode 100644 index b0fa2c3..0000000 --- a/env/Lib/site-packages/aiogram/methods/decline_chat_join_request.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class DeclineChatJoinRequest(TelegramMethod[bool]): - """ - Use this method to decline a chat join request. The bot must be an administrator in the chat for this to work and must have the *can_invite_users* administrator right. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#declinechatjoinrequest - """ - - __returning__ = bool - __api_method__ = "declineChatJoinRequest" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - user_id: int - """Unique identifier of the target user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], user_id: int, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, user_id=user_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/delete_chat_photo.py b/env/Lib/site-packages/aiogram/methods/delete_chat_photo.py deleted file mode 100644 index 503ace2..0000000 --- a/env/Lib/site-packages/aiogram/methods/delete_chat_photo.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class DeleteChatPhoto(TelegramMethod[bool]): - """ - Use this method to delete a chat photo. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletechatphoto - """ - - __returning__ = bool - __api_method__ = "deleteChatPhoto" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/delete_chat_sticker_set.py b/env/Lib/site-packages/aiogram/methods/delete_chat_sticker_set.py deleted file mode 100644 index 50d705f..0000000 --- a/env/Lib/site-packages/aiogram/methods/delete_chat_sticker_set.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class DeleteChatStickerSet(TelegramMethod[bool]): - """ - Use this method to delete a group sticker set from a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field *can_set_sticker_set* optionally returned in :class:`aiogram.methods.get_chat.GetChat` requests to check if the bot can use this method. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletechatstickerset - """ - - __returning__ = bool - __api_method__ = "deleteChatStickerSet" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/delete_forum_topic.py b/env/Lib/site-packages/aiogram/methods/delete_forum_topic.py deleted file mode 100644 index 7d23856..0000000 --- a/env/Lib/site-packages/aiogram/methods/delete_forum_topic.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class DeleteForumTopic(TelegramMethod[bool]): - """ - Use this method to delete a forum topic along with all its messages in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_delete_messages* administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deleteforumtopic - """ - - __returning__ = bool - __api_method__ = "deleteForumTopic" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - message_thread_id: int - """Unique identifier for the target message thread of the forum topic""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - message_thread_id: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, message_thread_id=message_thread_id, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/methods/delete_message.py b/env/Lib/site-packages/aiogram/methods/delete_message.py deleted file mode 100644 index 59aee04..0000000 --- a/env/Lib/site-packages/aiogram/methods/delete_message.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class DeleteMessage(TelegramMethod[bool]): - """ - Use this method to delete a message, including service messages, with the following limitations: - - - A message can only be deleted if it was sent less than 48 hours ago. - - - Service messages about a supergroup, channel, or forum topic creation can't be deleted. - - - A dice message in a private chat can only be deleted if it was sent more than 24 hours ago. - - - Bots can delete outgoing messages in private chats, groups, and supergroups. - - - Bots can delete incoming messages in private chats. - - - Bots granted *can_post_messages* permissions can delete outgoing messages in channels. - - - If the bot is an administrator of a group, it can delete any message there. - - - If the bot has *can_delete_messages* permission in a supergroup or a channel, it can delete any message there. - - Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletemessage - """ - - __returning__ = bool - __api_method__ = "deleteMessage" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - message_id: int - """Identifier of the message to delete""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - message_id: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, message_id=message_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/delete_messages.py b/env/Lib/site-packages/aiogram/methods/delete_messages.py deleted file mode 100644 index 061d12b..0000000 --- a/env/Lib/site-packages/aiogram/methods/delete_messages.py +++ /dev/null @@ -1,36 +0,0 @@ -from typing import TYPE_CHECKING, Any, List, Union - -from .base import TelegramMethod - - -class DeleteMessages(TelegramMethod[bool]): - """ - Use this method to delete multiple messages simultaneously. If some of the specified messages can't be found, they are skipped. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletemessages - """ - - __returning__ = bool - __api_method__ = "deleteMessages" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - message_ids: List[int] - """A JSON-serialized list of 1-100 identifiers of messages to delete. See :class:`aiogram.methods.delete_message.DeleteMessage` for limitations on which messages can be deleted""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - message_ids: List[int], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, message_ids=message_ids, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/delete_my_commands.py b/env/Lib/site-packages/aiogram/methods/delete_my_commands.py deleted file mode 100644 index e35ef67..0000000 --- a/env/Lib/site-packages/aiogram/methods/delete_my_commands.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import ( - BotCommandScopeAllChatAdministrators, - BotCommandScopeAllGroupChats, - BotCommandScopeAllPrivateChats, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - BotCommandScopeDefault, -) -from .base import TelegramMethod - - -class DeleteMyCommands(TelegramMethod[bool]): - """ - Use this method to delete the list of the bot's commands for the given scope and user language. After deletion, `higher level commands `_ will be shown to affected users. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletemycommands - """ - - __returning__ = bool - __api_method__ = "deleteMyCommands" - - scope: Optional[ - Union[ - BotCommandScopeDefault, - BotCommandScopeAllPrivateChats, - BotCommandScopeAllGroupChats, - BotCommandScopeAllChatAdministrators, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - ] - ] = None - """A JSON-serialized object, describing scope of users for which the commands are relevant. Defaults to :class:`aiogram.types.bot_command_scope_default.BotCommandScopeDefault`.""" - language_code: Optional[str] = None - """A two-letter ISO 639-1 language code. If empty, commands will be applied to all users from the given scope, for whose language there are no dedicated commands""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - scope: Optional[ - Union[ - BotCommandScopeDefault, - BotCommandScopeAllPrivateChats, - BotCommandScopeAllGroupChats, - BotCommandScopeAllChatAdministrators, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - ] - ] = None, - language_code: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(scope=scope, language_code=language_code, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/delete_sticker_from_set.py b/env/Lib/site-packages/aiogram/methods/delete_sticker_from_set.py deleted file mode 100644 index 6aae72b..0000000 --- a/env/Lib/site-packages/aiogram/methods/delete_sticker_from_set.py +++ /dev/null @@ -1,30 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramMethod - - -class DeleteStickerFromSet(TelegramMethod[bool]): - """ - Use this method to delete a sticker from a set created by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletestickerfromset - """ - - __returning__ = bool - __api_method__ = "deleteStickerFromSet" - - sticker: str - """File identifier of the sticker""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__(__pydantic__self__, *, sticker: str, **__pydantic_kwargs: Any) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(sticker=sticker, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/delete_sticker_set.py b/env/Lib/site-packages/aiogram/methods/delete_sticker_set.py deleted file mode 100644 index 519c5db..0000000 --- a/env/Lib/site-packages/aiogram/methods/delete_sticker_set.py +++ /dev/null @@ -1,30 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramMethod - - -class DeleteStickerSet(TelegramMethod[bool]): - """ - Use this method to delete a sticker set that was created by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletestickerset - """ - - __returning__ = bool - __api_method__ = "deleteStickerSet" - - name: str - """Sticker set name""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__(__pydantic__self__, *, name: str, **__pydantic_kwargs: Any) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(name=name, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/delete_webhook.py b/env/Lib/site-packages/aiogram/methods/delete_webhook.py deleted file mode 100644 index 05c39f4..0000000 --- a/env/Lib/site-packages/aiogram/methods/delete_webhook.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramMethod - - -class DeleteWebhook(TelegramMethod[bool]): - """ - Use this method to remove webhook integration if you decide to switch back to :class:`aiogram.methods.get_updates.GetUpdates`. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletewebhook - """ - - __returning__ = bool - __api_method__ = "deleteWebhook" - - drop_pending_updates: Optional[bool] = None - """Pass :code:`True` to drop all pending updates""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - drop_pending_updates: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(drop_pending_updates=drop_pending_updates, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/edit_chat_invite_link.py b/env/Lib/site-packages/aiogram/methods/edit_chat_invite_link.py deleted file mode 100644 index 8ec86ca..0000000 --- a/env/Lib/site-packages/aiogram/methods/edit_chat_invite_link.py +++ /dev/null @@ -1,60 +0,0 @@ -from __future__ import annotations - -import datetime -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import ChatInviteLink -from .base import TelegramMethod - - -class EditChatInviteLink(TelegramMethod[ChatInviteLink]): - """ - Use this method to edit a non-primary invite link created by the bot. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the edited invite link as a :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - - Source: https://core.telegram.org/bots/api#editchatinvitelink - """ - - __returning__ = ChatInviteLink - __api_method__ = "editChatInviteLink" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - invite_link: str - """The invite link to edit""" - name: Optional[str] = None - """Invite link name; 0-32 characters""" - expire_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None - """Point in time (Unix timestamp) when the link will expire""" - member_limit: Optional[int] = None - """The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999""" - creates_join_request: Optional[bool] = None - """:code:`True`, if users joining the chat via the link need to be approved by chat administrators. If :code:`True`, *member_limit* can't be specified""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - invite_link: str, - name: Optional[str] = None, - expire_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - member_limit: Optional[int] = None, - creates_join_request: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - invite_link=invite_link, - name=name, - expire_date=expire_date, - member_limit=member_limit, - creates_join_request=creates_join_request, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/edit_chat_subscription_invite_link.py b/env/Lib/site-packages/aiogram/methods/edit_chat_subscription_invite_link.py deleted file mode 100644 index ffb37d8..0000000 --- a/env/Lib/site-packages/aiogram/methods/edit_chat_subscription_invite_link.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import ChatInviteLink -from .base import TelegramMethod - - -class EditChatSubscriptionInviteLink(TelegramMethod[ChatInviteLink]): - """ - Use this method to edit a subscription invite link created by the bot. The bot must have the *can_invite_users* administrator rights. Returns the edited invite link as a :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - - Source: https://core.telegram.org/bots/api#editchatsubscriptioninvitelink - """ - - __returning__ = ChatInviteLink - __api_method__ = "editChatSubscriptionInviteLink" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - invite_link: str - """The invite link to edit""" - name: Optional[str] = None - """Invite link name; 0-32 characters""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - invite_link: str, - name: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, invite_link=invite_link, name=name, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/methods/edit_forum_topic.py b/env/Lib/site-packages/aiogram/methods/edit_forum_topic.py deleted file mode 100644 index 233e9cb..0000000 --- a/env/Lib/site-packages/aiogram/methods/edit_forum_topic.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from .base import TelegramMethod - - -class EditForumTopic(TelegramMethod[bool]): - """ - Use this method to edit name and icon of a topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights, unless it is the creator of the topic. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#editforumtopic - """ - - __returning__ = bool - __api_method__ = "editForumTopic" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - message_thread_id: int - """Unique identifier for the target message thread of the forum topic""" - name: Optional[str] = None - """New topic name, 0-128 characters. If not specified or empty, the current name of the topic will be kept""" - icon_custom_emoji_id: Optional[str] = None - """New unique identifier of the custom emoji shown as the topic icon. Use :class:`aiogram.methods.get_forum_topic_icon_stickers.GetForumTopicIconStickers` to get all allowed custom emoji identifiers. Pass an empty string to remove the icon. If not specified, the current icon will be kept""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - message_thread_id: int, - name: Optional[str] = None, - icon_custom_emoji_id: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - message_thread_id=message_thread_id, - name=name, - icon_custom_emoji_id=icon_custom_emoji_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/edit_general_forum_topic.py b/env/Lib/site-packages/aiogram/methods/edit_general_forum_topic.py deleted file mode 100644 index f0be56e..0000000 --- a/env/Lib/site-packages/aiogram/methods/edit_general_forum_topic.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class EditGeneralForumTopic(TelegramMethod[bool]): - """ - Use this method to edit the name of the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#editgeneralforumtopic - """ - - __returning__ = bool - __api_method__ = "editGeneralForumTopic" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - name: str - """New topic name, 1-128 characters""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], name: str, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, name=name, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/edit_message_caption.py b/env/Lib/site-packages/aiogram/methods/edit_message_caption.py deleted file mode 100644 index 8a759d4..0000000 --- a/env/Lib/site-packages/aiogram/methods/edit_message_caption.py +++ /dev/null @@ -1,74 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from ..client.default import Default -from ..types import UNSET_PARSE_MODE, InlineKeyboardMarkup, Message, MessageEntity -from .base import TelegramMethod - - -class EditMessageCaption(TelegramMethod[Union[Message, bool]]): - """ - Use this method to edit captions of messages. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - - Source: https://core.telegram.org/bots/api#editmessagecaption - """ - - __returning__ = Union[Message, bool] - __api_method__ = "editMessageCaption" - - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message to be edited was sent""" - chat_id: Optional[Union[int, str]] = None - """Required if *inline_message_id* is not specified. Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - message_id: Optional[int] = None - """Required if *inline_message_id* is not specified. Identifier of the message to edit""" - inline_message_id: Optional[str] = None - """Required if *chat_id* and *message_id* are not specified. Identifier of the inline message""" - caption: Optional[str] = None - """New caption of the message, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """Mode for parsing entities in the message caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """Pass :code:`True`, if the caption must be shown above the message media. Supported only for animation, photo and video messages.""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """A JSON-serialized object for an `inline keyboard `_.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - reply_markup: Optional[InlineKeyboardMarkup] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - business_connection_id=business_connection_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - reply_markup=reply_markup, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/edit_message_live_location.py b/env/Lib/site-packages/aiogram/methods/edit_message_live_location.py deleted file mode 100644 index 6bc5569..0000000 --- a/env/Lib/site-packages/aiogram/methods/edit_message_live_location.py +++ /dev/null @@ -1,79 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import InlineKeyboardMarkup, Message -from .base import TelegramMethod - - -class EditMessageLiveLocation(TelegramMethod[Union[Message, bool]]): - """ - Use this method to edit live location messages. A location can be edited until its *live_period* expires or editing is explicitly disabled by a call to :class:`aiogram.methods.stop_message_live_location.StopMessageLiveLocation`. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. - - Source: https://core.telegram.org/bots/api#editmessagelivelocation - """ - - __returning__ = Union[Message, bool] - __api_method__ = "editMessageLiveLocation" - - latitude: float - """Latitude of new location""" - longitude: float - """Longitude of new location""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message to be edited was sent""" - chat_id: Optional[Union[int, str]] = None - """Required if *inline_message_id* is not specified. Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - message_id: Optional[int] = None - """Required if *inline_message_id* is not specified. Identifier of the message to edit""" - inline_message_id: Optional[str] = None - """Required if *chat_id* and *message_id* are not specified. Identifier of the inline message""" - live_period: Optional[int] = None - """New period in seconds during which the location can be updated, starting from the message send date. If 0x7FFFFFFF is specified, then the location can be updated forever. Otherwise, the new value must not exceed the current *live_period* by more than a day, and the live location expiration date must remain within the next 90 days. If not specified, then *live_period* remains unchanged""" - horizontal_accuracy: Optional[float] = None - """The radius of uncertainty for the location, measured in meters; 0-1500""" - heading: Optional[int] = None - """Direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.""" - proximity_alert_radius: Optional[int] = None - """The maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """A JSON-serialized object for a new `inline keyboard `_.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - latitude: float, - longitude: float, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - live_period: Optional[int] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - latitude=latitude, - longitude=longitude, - business_connection_id=business_connection_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - live_period=live_period, - horizontal_accuracy=horizontal_accuracy, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - reply_markup=reply_markup, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/edit_message_media.py b/env/Lib/site-packages/aiogram/methods/edit_message_media.py deleted file mode 100644 index b898be7..0000000 --- a/env/Lib/site-packages/aiogram/methods/edit_message_media.py +++ /dev/null @@ -1,75 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import ( - InlineKeyboardMarkup, - InputMediaAnimation, - InputMediaAudio, - InputMediaDocument, - InputMediaPhoto, - InputMediaVideo, - Message, -) -from .base import TelegramMethod - - -class EditMessageMedia(TelegramMethod[Union[Message, bool]]): - """ - Use this method to edit animation, audio, document, photo, or video messages. If a message is part of a message album, then it can be edited only to an audio for audio albums, only to a document for document albums and to a photo or a video otherwise. When an inline message is edited, a new file can't be uploaded; use a previously uploaded file via its file_id or specify a URL. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - - Source: https://core.telegram.org/bots/api#editmessagemedia - """ - - __returning__ = Union[Message, bool] - __api_method__ = "editMessageMedia" - - media: Union[ - InputMediaAnimation, InputMediaDocument, InputMediaAudio, InputMediaPhoto, InputMediaVideo - ] - """A JSON-serialized object for a new media content of the message""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message to be edited was sent""" - chat_id: Optional[Union[int, str]] = None - """Required if *inline_message_id* is not specified. Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - message_id: Optional[int] = None - """Required if *inline_message_id* is not specified. Identifier of the message to edit""" - inline_message_id: Optional[str] = None - """Required if *chat_id* and *message_id* are not specified. Identifier of the inline message""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """A JSON-serialized object for a new `inline keyboard `_.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - media: Union[ - InputMediaAnimation, - InputMediaDocument, - InputMediaAudio, - InputMediaPhoto, - InputMediaVideo, - ], - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - media=media, - business_connection_id=business_connection_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - reply_markup=reply_markup, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/edit_message_reply_markup.py b/env/Lib/site-packages/aiogram/methods/edit_message_reply_markup.py deleted file mode 100644 index 49052f3..0000000 --- a/env/Lib/site-packages/aiogram/methods/edit_message_reply_markup.py +++ /dev/null @@ -1,55 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import InlineKeyboardMarkup, Message -from .base import TelegramMethod - - -class EditMessageReplyMarkup(TelegramMethod[Union[Message, bool]]): - """ - Use this method to edit only the reply markup of messages. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - - Source: https://core.telegram.org/bots/api#editmessagereplymarkup - """ - - __returning__ = Union[Message, bool] - __api_method__ = "editMessageReplyMarkup" - - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message to be edited was sent""" - chat_id: Optional[Union[int, str]] = None - """Required if *inline_message_id* is not specified. Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - message_id: Optional[int] = None - """Required if *inline_message_id* is not specified. Identifier of the message to edit""" - inline_message_id: Optional[str] = None - """Required if *chat_id* and *message_id* are not specified. Identifier of the inline message""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """A JSON-serialized object for an `inline keyboard `_.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - business_connection_id=business_connection_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - reply_markup=reply_markup, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/edit_message_text.py b/env/Lib/site-packages/aiogram/methods/edit_message_text.py deleted file mode 100644 index cfaaa94..0000000 --- a/env/Lib/site-packages/aiogram/methods/edit_message_text.py +++ /dev/null @@ -1,91 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - UNSET_PARSE_MODE, - InlineKeyboardMarkup, - LinkPreviewOptions, - Message, - MessageEntity, -) -from .base import TelegramMethod - - -class EditMessageText(TelegramMethod[Union[Message, bool]]): - """ - Use this method to edit text and `game `_ messages. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - - Source: https://core.telegram.org/bots/api#editmessagetext - """ - - __returning__ = Union[Message, bool] - __api_method__ = "editMessageText" - - text: str - """New text of the message, 1-4096 characters after entities parsing""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message to be edited was sent""" - chat_id: Optional[Union[int, str]] = None - """Required if *inline_message_id* is not specified. Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - message_id: Optional[int] = None - """Required if *inline_message_id* is not specified. Identifier of the message to edit""" - inline_message_id: Optional[str] = None - """Required if *chat_id* and *message_id* are not specified. Identifier of the inline message""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """Mode for parsing entities in the message text. See `formatting options `_ for more details.""" - entities: Optional[List[MessageEntity]] = None - """A JSON-serialized list of special entities that appear in message text, which can be specified instead of *parse_mode*""" - link_preview_options: Optional[LinkPreviewOptions] = None - """Link preview generation options for the message""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """A JSON-serialized object for an `inline keyboard `_.""" - disable_web_page_preview: Optional[Union[bool, Default]] = Field( - Default("link_preview_is_disabled"), json_schema_extra={"deprecated": True} - ) - """Disables link previews for links in this message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - text: str, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - entities: Optional[List[MessageEntity]] = None, - link_preview_options: Optional[LinkPreviewOptions] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - disable_web_page_preview: Optional[Union[bool, Default]] = Default( - "link_preview_is_disabled" - ), - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - text=text, - business_connection_id=business_connection_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - parse_mode=parse_mode, - entities=entities, - link_preview_options=link_preview_options, - reply_markup=reply_markup, - disable_web_page_preview=disable_web_page_preview, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/export_chat_invite_link.py b/env/Lib/site-packages/aiogram/methods/export_chat_invite_link.py deleted file mode 100644 index 271e35d..0000000 --- a/env/Lib/site-packages/aiogram/methods/export_chat_invite_link.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class ExportChatInviteLink(TelegramMethod[str]): - """ - Use this method to generate a new primary invite link for a chat; any previously generated primary link is revoked. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the new invite link as *String* on success. - - Note: Each administrator in a chat generates their own invite links. Bots can't use invite links generated by other administrators. If you want your bot to work with invite links, it will need to generate its own link using :class:`aiogram.methods.export_chat_invite_link.ExportChatInviteLink` or by calling the :class:`aiogram.methods.get_chat.GetChat` method. If your bot needs to generate a new primary invite link replacing its previous one, use :class:`aiogram.methods.export_chat_invite_link.ExportChatInviteLink` again. - - Source: https://core.telegram.org/bots/api#exportchatinvitelink - """ - - __returning__ = str - __api_method__ = "exportChatInviteLink" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/forward_message.py b/env/Lib/site-packages/aiogram/methods/forward_message.py deleted file mode 100644 index 01d764a..0000000 --- a/env/Lib/site-packages/aiogram/methods/forward_message.py +++ /dev/null @@ -1,61 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..client.default import Default -from ..types import Message -from ..types.base import UNSET_PROTECT_CONTENT -from .base import TelegramMethod - - -class ForwardMessage(TelegramMethod[Message]): - """ - Use this method to forward messages of any kind. Service messages and messages with protected content can't be forwarded. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#forwardmessage - """ - - __returning__ = Message - __api_method__ = "forwardMessage" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - from_chat_id: Union[int, str] - """Unique identifier for the chat where the original message was sent (or channel username in the format :code:`@channelusername`)""" - message_id: int - """Message identifier in the chat specified in *from_chat_id*""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the forwarded message from forwarding and saving""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - from_chat_id: Union[int, str], - message_id: int, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - from_chat_id=from_chat_id, - message_id=message_id, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/forward_messages.py b/env/Lib/site-packages/aiogram/methods/forward_messages.py deleted file mode 100644 index 829545f..0000000 --- a/env/Lib/site-packages/aiogram/methods/forward_messages.py +++ /dev/null @@ -1,57 +0,0 @@ -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from ..types import MessageId -from .base import TelegramMethod - - -class ForwardMessages(TelegramMethod[List[MessageId]]): - """ - Use this method to forward multiple messages of any kind. If some of the specified messages can't be found or forwarded, they are skipped. Service messages and messages with protected content can't be forwarded. Album grouping is kept for forwarded messages. On success, an array of :class:`aiogram.types.message_id.MessageId` of the sent messages is returned. - - Source: https://core.telegram.org/bots/api#forwardmessages - """ - - __returning__ = List[MessageId] - __api_method__ = "forwardMessages" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - from_chat_id: Union[int, str] - """Unique identifier for the chat where the original messages were sent (or channel username in the format :code:`@channelusername`)""" - message_ids: List[int] - """A JSON-serialized list of 1-100 identifiers of messages in the chat *from_chat_id* to forward. The identifiers must be specified in a strictly increasing order.""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - disable_notification: Optional[bool] = None - """Sends the messages `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[bool] = None - """Protects the contents of the forwarded messages from forwarding and saving""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - from_chat_id: Union[int, str], - message_ids: List[int], - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - from_chat_id=from_chat_id, - message_ids=message_ids, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/get_business_connection.py b/env/Lib/site-packages/aiogram/methods/get_business_connection.py deleted file mode 100644 index 97cb9ca..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_business_connection.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from aiogram.types import BusinessConnection - -from .base import TelegramMethod - - -class GetBusinessConnection(TelegramMethod[BusinessConnection]): - """ - Use this method to get information about the connection of the bot with a business account. Returns a :class:`aiogram.types.business_connection.BusinessConnection` object on success. - - Source: https://core.telegram.org/bots/api#getbusinessconnection - """ - - __returning__ = BusinessConnection - __api_method__ = "getBusinessConnection" - - business_connection_id: str - """Unique identifier of the business connection""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, business_connection_id: str, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(business_connection_id=business_connection_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_chat.py b/env/Lib/site-packages/aiogram/methods/get_chat.py deleted file mode 100644 index 6b6b977..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_chat.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from ..types import ChatFullInfo -from .base import TelegramMethod - - -class GetChat(TelegramMethod[ChatFullInfo]): - """ - Use this method to get up-to-date information about the chat. Returns a :class:`aiogram.types.chat_full_info.ChatFullInfo` object on success. - - Source: https://core.telegram.org/bots/api#getchat - """ - - __returning__ = ChatFullInfo - __api_method__ = "getChat" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup or channel (in the format :code:`@channelusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_chat_administrators.py b/env/Lib/site-packages/aiogram/methods/get_chat_administrators.py deleted file mode 100644 index 99e403e..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_chat_administrators.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Union - -from ..types import ( - ChatMemberAdministrator, - ChatMemberBanned, - ChatMemberLeft, - ChatMemberMember, - ChatMemberOwner, - ChatMemberRestricted, -) -from .base import TelegramMethod - - -class GetChatAdministrators( - TelegramMethod[ - List[ - Union[ - ChatMemberOwner, - ChatMemberAdministrator, - ChatMemberMember, - ChatMemberRestricted, - ChatMemberLeft, - ChatMemberBanned, - ] - ] - ] -): - """ - Use this method to get a list of administrators in a chat, which aren't bots. Returns an Array of :class:`aiogram.types.chat_member.ChatMember` objects. - - Source: https://core.telegram.org/bots/api#getchatadministrators - """ - - __returning__ = List[ - Union[ - ChatMemberOwner, - ChatMemberAdministrator, - ChatMemberMember, - ChatMemberRestricted, - ChatMemberLeft, - ChatMemberBanned, - ] - ] - __api_method__ = "getChatAdministrators" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup or channel (in the format :code:`@channelusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_chat_member.py b/env/Lib/site-packages/aiogram/methods/get_chat_member.py deleted file mode 100644 index 495f628..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_chat_member.py +++ /dev/null @@ -1,60 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from ..types import ( - ChatMemberAdministrator, - ChatMemberBanned, - ChatMemberLeft, - ChatMemberMember, - ChatMemberOwner, - ChatMemberRestricted, -) -from .base import TelegramMethod - - -class GetChatMember( - TelegramMethod[ - Union[ - ChatMemberOwner, - ChatMemberAdministrator, - ChatMemberMember, - ChatMemberRestricted, - ChatMemberLeft, - ChatMemberBanned, - ] - ] -): - """ - Use this method to get information about a member of a chat. The method is only guaranteed to work for other users if the bot is an administrator in the chat. Returns a :class:`aiogram.types.chat_member.ChatMember` object on success. - - Source: https://core.telegram.org/bots/api#getchatmember - """ - - __returning__ = Union[ - ChatMemberOwner, - ChatMemberAdministrator, - ChatMemberMember, - ChatMemberRestricted, - ChatMemberLeft, - ChatMemberBanned, - ] - __api_method__ = "getChatMember" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup or channel (in the format :code:`@channelusername`)""" - user_id: int - """Unique identifier of the target user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], user_id: int, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, user_id=user_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_chat_member_count.py b/env/Lib/site-packages/aiogram/methods/get_chat_member_count.py deleted file mode 100644 index fc33c23..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_chat_member_count.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class GetChatMemberCount(TelegramMethod[int]): - """ - Use this method to get the number of members in a chat. Returns *Int* on success. - - Source: https://core.telegram.org/bots/api#getchatmembercount - """ - - __returning__ = int - __api_method__ = "getChatMemberCount" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup or channel (in the format :code:`@channelusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_chat_menu_button.py b/env/Lib/site-packages/aiogram/methods/get_chat_menu_button.py deleted file mode 100644 index ee1248d..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_chat_menu_button.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import MenuButtonCommands, MenuButtonDefault, MenuButtonWebApp -from .base import TelegramMethod - - -class GetChatMenuButton( - TelegramMethod[Union[MenuButtonDefault, MenuButtonWebApp, MenuButtonCommands]] -): - """ - Use this method to get the current value of the bot's menu button in a private chat, or the default menu button. Returns :class:`aiogram.types.menu_button.MenuButton` on success. - - Source: https://core.telegram.org/bots/api#getchatmenubutton - """ - - __returning__ = Union[MenuButtonDefault, MenuButtonWebApp, MenuButtonCommands] - __api_method__ = "getChatMenuButton" - - chat_id: Optional[int] = None - """Unique identifier for the target private chat. If not specified, default bot's menu button will be returned""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Optional[int] = None, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_custom_emoji_stickers.py b/env/Lib/site-packages/aiogram/methods/get_custom_emoji_stickers.py deleted file mode 100644 index 3235d97..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_custom_emoji_stickers.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List - -from ..types import Sticker -from .base import TelegramMethod - - -class GetCustomEmojiStickers(TelegramMethod[List[Sticker]]): - """ - Use this method to get information about custom emoji stickers by their identifiers. Returns an Array of :class:`aiogram.types.sticker.Sticker` objects. - - Source: https://core.telegram.org/bots/api#getcustomemojistickers - """ - - __returning__ = List[Sticker] - __api_method__ = "getCustomEmojiStickers" - - custom_emoji_ids: List[str] - """A JSON-serialized list of custom emoji identifiers. At most 200 custom emoji identifiers can be specified.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, custom_emoji_ids: List[str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(custom_emoji_ids=custom_emoji_ids, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_file.py b/env/Lib/site-packages/aiogram/methods/get_file.py deleted file mode 100644 index c96ff31..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_file.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from ..types import File -from .base import TelegramMethod - - -class GetFile(TelegramMethod[File]): - """ - Use this method to get basic information about a file and prepare it for downloading. For the moment, bots can download files of up to 20MB in size. On success, a :class:`aiogram.types.file.File` object is returned. The file can then be downloaded via the link :code:`https://api.telegram.org/file/bot/`, where :code:`` is taken from the response. It is guaranteed that the link will be valid for at least 1 hour. When the link expires, a new one can be requested by calling :class:`aiogram.methods.get_file.GetFile` again. - **Note:** This function may not preserve the original file name and MIME type. You should save the file's MIME type and name (if available) when the File object is received. - - Source: https://core.telegram.org/bots/api#getfile - """ - - __returning__ = File - __api_method__ = "getFile" - - file_id: str - """File identifier to get information about""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__(__pydantic__self__, *, file_id: str, **__pydantic_kwargs: Any) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(file_id=file_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_forum_topic_icon_stickers.py b/env/Lib/site-packages/aiogram/methods/get_forum_topic_icon_stickers.py deleted file mode 100644 index 5c23321..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_forum_topic_icon_stickers.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import annotations - -from typing import List - -from ..types import Sticker -from .base import TelegramMethod - - -class GetForumTopicIconStickers(TelegramMethod[List[Sticker]]): - """ - Use this method to get custom emoji stickers, which can be used as a forum topic icon by any user. Requires no parameters. Returns an Array of :class:`aiogram.types.sticker.Sticker` objects. - - Source: https://core.telegram.org/bots/api#getforumtopiciconstickers - """ - - __returning__ = List[Sticker] - __api_method__ = "getForumTopicIconStickers" diff --git a/env/Lib/site-packages/aiogram/methods/get_game_high_scores.py b/env/Lib/site-packages/aiogram/methods/get_game_high_scores.py deleted file mode 100644 index cac9d61..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_game_high_scores.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from ..types import GameHighScore -from .base import TelegramMethod - - -class GetGameHighScores(TelegramMethod[List[GameHighScore]]): - """ - Use this method to get data for high score tables. Will return the score of the specified user and several of their neighbors in a game. Returns an Array of :class:`aiogram.types.game_high_score.GameHighScore` objects. - - This method will currently return scores for the target user, plus two of their closest neighbors on each side. Will also return the top three users if the user and their neighbors are not among them. Please note that this behavior is subject to change. - - Source: https://core.telegram.org/bots/api#getgamehighscores - """ - - __returning__ = List[GameHighScore] - __api_method__ = "getGameHighScores" - - user_id: int - """Target user id""" - chat_id: Optional[int] = None - """Required if *inline_message_id* is not specified. Unique identifier for the target chat""" - message_id: Optional[int] = None - """Required if *inline_message_id* is not specified. Identifier of the sent message""" - inline_message_id: Optional[str] = None - """Required if *chat_id* and *message_id* are not specified. Identifier of the inline message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - user_id: int, - chat_id: Optional[int] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - user_id=user_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/get_me.py b/env/Lib/site-packages/aiogram/methods/get_me.py deleted file mode 100644 index c2cc52f..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_me.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import annotations - -from ..types import User -from .base import TelegramMethod - - -class GetMe(TelegramMethod[User]): - """ - A simple method for testing your bot's authentication token. Requires no parameters. Returns basic information about the bot in form of a :class:`aiogram.types.user.User` object. - - Source: https://core.telegram.org/bots/api#getme - """ - - __returning__ = User - __api_method__ = "getMe" diff --git a/env/Lib/site-packages/aiogram/methods/get_my_commands.py b/env/Lib/site-packages/aiogram/methods/get_my_commands.py deleted file mode 100644 index b3386b6..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_my_commands.py +++ /dev/null @@ -1,68 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from ..types import ( - BotCommand, - BotCommandScopeAllChatAdministrators, - BotCommandScopeAllGroupChats, - BotCommandScopeAllPrivateChats, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - BotCommandScopeDefault, -) -from .base import TelegramMethod - - -class GetMyCommands(TelegramMethod[List[BotCommand]]): - """ - Use this method to get the current list of the bot's commands for the given scope and user language. Returns an Array of :class:`aiogram.types.bot_command.BotCommand` objects. If commands aren't set, an empty list is returned. - - Source: https://core.telegram.org/bots/api#getmycommands - """ - - __returning__ = List[BotCommand] - __api_method__ = "getMyCommands" - - scope: Optional[ - Union[ - BotCommandScopeDefault, - BotCommandScopeAllPrivateChats, - BotCommandScopeAllGroupChats, - BotCommandScopeAllChatAdministrators, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - ] - ] = None - """A JSON-serialized object, describing scope of users. Defaults to :class:`aiogram.types.bot_command_scope_default.BotCommandScopeDefault`.""" - language_code: Optional[str] = None - """A two-letter ISO 639-1 language code or an empty string""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - scope: Optional[ - Union[ - BotCommandScopeDefault, - BotCommandScopeAllPrivateChats, - BotCommandScopeAllGroupChats, - BotCommandScopeAllChatAdministrators, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - ] - ] = None, - language_code: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(scope=scope, language_code=language_code, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_my_default_administrator_rights.py b/env/Lib/site-packages/aiogram/methods/get_my_default_administrator_rights.py deleted file mode 100644 index 4f9ad9a..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_my_default_administrator_rights.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from ..types import ChatAdministratorRights -from .base import TelegramMethod - - -class GetMyDefaultAdministratorRights(TelegramMethod[ChatAdministratorRights]): - """ - Use this method to get the current default administrator rights of the bot. Returns :class:`aiogram.types.chat_administrator_rights.ChatAdministratorRights` on success. - - Source: https://core.telegram.org/bots/api#getmydefaultadministratorrights - """ - - __returning__ = ChatAdministratorRights - __api_method__ = "getMyDefaultAdministratorRights" - - for_channels: Optional[bool] = None - """Pass :code:`True` to get default administrator rights of the bot in channels. Otherwise, default administrator rights of the bot for groups and supergroups will be returned.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, for_channels: Optional[bool] = None, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(for_channels=for_channels, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_my_description.py b/env/Lib/site-packages/aiogram/methods/get_my_description.py deleted file mode 100644 index f967faf..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_my_description.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from ..types import BotDescription -from .base import TelegramMethod - - -class GetMyDescription(TelegramMethod[BotDescription]): - """ - Use this method to get the current bot description for the given user language. Returns :class:`aiogram.types.bot_description.BotDescription` on success. - - Source: https://core.telegram.org/bots/api#getmydescription - """ - - __returning__ = BotDescription - __api_method__ = "getMyDescription" - - language_code: Optional[str] = None - """A two-letter ISO 639-1 language code or an empty string""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, language_code: Optional[str] = None, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(language_code=language_code, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_my_name.py b/env/Lib/site-packages/aiogram/methods/get_my_name.py deleted file mode 100644 index 909ac3f..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_my_name.py +++ /dev/null @@ -1,31 +0,0 @@ -from typing import TYPE_CHECKING, Any, Optional - -from ..types import BotName -from .base import TelegramMethod - - -class GetMyName(TelegramMethod[BotName]): - """ - Use this method to get the current bot name for the given user language. Returns :class:`aiogram.types.bot_name.BotName` on success. - - Source: https://core.telegram.org/bots/api#getmyname - """ - - __returning__ = BotName - __api_method__ = "getMyName" - - language_code: Optional[str] = None - """A two-letter ISO 639-1 language code or an empty string""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, language_code: Optional[str] = None, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(language_code=language_code, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_my_short_description.py b/env/Lib/site-packages/aiogram/methods/get_my_short_description.py deleted file mode 100644 index a9a5666..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_my_short_description.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from ..types import BotShortDescription -from .base import TelegramMethod - - -class GetMyShortDescription(TelegramMethod[BotShortDescription]): - """ - Use this method to get the current bot short description for the given user language. Returns :class:`aiogram.types.bot_short_description.BotShortDescription` on success. - - Source: https://core.telegram.org/bots/api#getmyshortdescription - """ - - __returning__ = BotShortDescription - __api_method__ = "getMyShortDescription" - - language_code: Optional[str] = None - """A two-letter ISO 639-1 language code or an empty string""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, language_code: Optional[str] = None, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(language_code=language_code, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_star_transactions.py b/env/Lib/site-packages/aiogram/methods/get_star_transactions.py deleted file mode 100644 index ee0ea2e..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_star_transactions.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from ..types import StarTransactions -from .base import TelegramMethod - - -class GetStarTransactions(TelegramMethod[StarTransactions]): - """ - Returns the bot's Telegram Star transactions in chronological order. On success, returns a :class:`aiogram.types.star_transactions.StarTransactions` object. - - Source: https://core.telegram.org/bots/api#getstartransactions - """ - - __returning__ = StarTransactions - __api_method__ = "getStarTransactions" - - offset: Optional[int] = None - """Number of transactions to skip in the response""" - limit: Optional[int] = None - """The maximum number of transactions to be retrieved. Values between 1-100 are accepted. Defaults to 100.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - offset: Optional[int] = None, - limit: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(offset=offset, limit=limit, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_sticker_set.py b/env/Lib/site-packages/aiogram/methods/get_sticker_set.py deleted file mode 100644 index 2700e17..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_sticker_set.py +++ /dev/null @@ -1,31 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from ..types import StickerSet -from .base import TelegramMethod - - -class GetStickerSet(TelegramMethod[StickerSet]): - """ - Use this method to get a sticker set. On success, a :class:`aiogram.types.sticker_set.StickerSet` object is returned. - - Source: https://core.telegram.org/bots/api#getstickerset - """ - - __returning__ = StickerSet - __api_method__ = "getStickerSet" - - name: str - """Name of the sticker set""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__(__pydantic__self__, *, name: str, **__pydantic_kwargs: Any) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(name=name, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_updates.py b/env/Lib/site-packages/aiogram/methods/get_updates.py deleted file mode 100644 index d1f6371..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_updates.py +++ /dev/null @@ -1,57 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from ..types import Update -from .base import TelegramMethod - - -class GetUpdates(TelegramMethod[List[Update]]): - """ - Use this method to receive incoming updates using long polling (`wiki `_). Returns an Array of :class:`aiogram.types.update.Update` objects. - - **Notes** - - **1.** This method will not work if an outgoing webhook is set up. - - **2.** In order to avoid getting duplicate updates, recalculate *offset* after each server response. - - Source: https://core.telegram.org/bots/api#getupdates - """ - - __returning__ = List[Update] - __api_method__ = "getUpdates" - - offset: Optional[int] = None - """Identifier of the first update to be returned. Must be greater by one than the highest among the identifiers of previously received updates. By default, updates starting with the earliest unconfirmed update are returned. An update is considered confirmed as soon as :class:`aiogram.methods.get_updates.GetUpdates` is called with an *offset* higher than its *update_id*. The negative offset can be specified to retrieve updates starting from *-offset* update from the end of the updates queue. All previous updates will be forgotten.""" - limit: Optional[int] = None - """Limits the number of updates to be retrieved. Values between 1-100 are accepted. Defaults to 100.""" - timeout: Optional[int] = None - """Timeout in seconds for long polling. Defaults to 0, i.e. usual short polling. Should be positive, short polling should be used for testing purposes only.""" - allowed_updates: Optional[List[str]] = None - """A JSON-serialized list of the update types you want your bot to receive. For example, specify :code:`["message", "edited_channel_post", "callback_query"]` to only receive updates of these types. See :class:`aiogram.types.update.Update` for a complete list of available update types. Specify an empty list to receive all update types except *chat_member*, *message_reaction*, and *message_reaction_count* (default). If not specified, the previous setting will be used.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - offset: Optional[int] = None, - limit: Optional[int] = None, - timeout: Optional[int] = None, - allowed_updates: Optional[List[str]] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - offset=offset, - limit=limit, - timeout=timeout, - allowed_updates=allowed_updates, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/get_user_chat_boosts.py b/env/Lib/site-packages/aiogram/methods/get_user_chat_boosts.py deleted file mode 100644 index f3eae26..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_user_chat_boosts.py +++ /dev/null @@ -1,33 +0,0 @@ -from typing import TYPE_CHECKING, Any, Union - -from ..types import UserChatBoosts -from .base import TelegramMethod - - -class GetUserChatBoosts(TelegramMethod[UserChatBoosts]): - """ - Use this method to get the list of boosts added to a chat by a user. Requires administrator rights in the chat. Returns a :class:`aiogram.types.user_chat_boosts.UserChatBoosts` object. - - Source: https://core.telegram.org/bots/api#getuserchatboosts - """ - - __returning__ = UserChatBoosts - __api_method__ = "getUserChatBoosts" - - chat_id: Union[int, str] - """Unique identifier for the chat or username of the channel (in the format :code:`@channelusername`)""" - user_id: int - """Unique identifier of the target user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], user_id: int, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, user_id=user_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_user_profile_photos.py b/env/Lib/site-packages/aiogram/methods/get_user_profile_photos.py deleted file mode 100644 index 488885e..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_user_profile_photos.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from ..types import UserProfilePhotos -from .base import TelegramMethod - - -class GetUserProfilePhotos(TelegramMethod[UserProfilePhotos]): - """ - Use this method to get a list of profile pictures for a user. Returns a :class:`aiogram.types.user_profile_photos.UserProfilePhotos` object. - - Source: https://core.telegram.org/bots/api#getuserprofilephotos - """ - - __returning__ = UserProfilePhotos - __api_method__ = "getUserProfilePhotos" - - user_id: int - """Unique identifier of the target user""" - offset: Optional[int] = None - """Sequential number of the first photo to be returned. By default, all photos are returned.""" - limit: Optional[int] = None - """Limits the number of photos to be retrieved. Values between 1-100 are accepted. Defaults to 100.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - user_id: int, - offset: Optional[int] = None, - limit: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(user_id=user_id, offset=offset, limit=limit, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/get_webhook_info.py b/env/Lib/site-packages/aiogram/methods/get_webhook_info.py deleted file mode 100644 index c9f0e46..0000000 --- a/env/Lib/site-packages/aiogram/methods/get_webhook_info.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import annotations - -from ..types import WebhookInfo -from .base import TelegramMethod - - -class GetWebhookInfo(TelegramMethod[WebhookInfo]): - """ - Use this method to get current webhook status. Requires no parameters. On success, returns a :class:`aiogram.types.webhook_info.WebhookInfo` object. If the bot is using :class:`aiogram.methods.get_updates.GetUpdates`, will return an object with the *url* field empty. - - Source: https://core.telegram.org/bots/api#getwebhookinfo - """ - - __returning__ = WebhookInfo - __api_method__ = "getWebhookInfo" diff --git a/env/Lib/site-packages/aiogram/methods/hide_general_forum_topic.py b/env/Lib/site-packages/aiogram/methods/hide_general_forum_topic.py deleted file mode 100644 index a3b6ee3..0000000 --- a/env/Lib/site-packages/aiogram/methods/hide_general_forum_topic.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class HideGeneralForumTopic(TelegramMethod[bool]): - """ - Use this method to hide the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights. The topic will be automatically closed if it was open. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#hidegeneralforumtopic - """ - - __returning__ = bool - __api_method__ = "hideGeneralForumTopic" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/leave_chat.py b/env/Lib/site-packages/aiogram/methods/leave_chat.py deleted file mode 100644 index f9d4312..0000000 --- a/env/Lib/site-packages/aiogram/methods/leave_chat.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class LeaveChat(TelegramMethod[bool]): - """ - Use this method for your bot to leave a group, supergroup or channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#leavechat - """ - - __returning__ = bool - __api_method__ = "leaveChat" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup or channel (in the format :code:`@channelusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/log_out.py b/env/Lib/site-packages/aiogram/methods/log_out.py deleted file mode 100644 index 2a62653..0000000 --- a/env/Lib/site-packages/aiogram/methods/log_out.py +++ /dev/null @@ -1,14 +0,0 @@ -from __future__ import annotations - -from .base import TelegramMethod - - -class LogOut(TelegramMethod[bool]): - """ - Use this method to log out from the cloud Bot API server before launching the bot locally. You **must** log out the bot before running it locally, otherwise there is no guarantee that the bot will receive updates. After a successful call, you can immediately log in on a local server, but will not be able to log in back to the cloud Bot API server for 10 minutes. Returns :code:`True` on success. Requires no parameters. - - Source: https://core.telegram.org/bots/api#logout - """ - - __returning__ = bool - __api_method__ = "logOut" diff --git a/env/Lib/site-packages/aiogram/methods/pin_chat_message.py b/env/Lib/site-packages/aiogram/methods/pin_chat_message.py deleted file mode 100644 index 47c28f1..0000000 --- a/env/Lib/site-packages/aiogram/methods/pin_chat_message.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from .base import TelegramMethod - - -class PinChatMessage(TelegramMethod[bool]): - """ - Use this method to add a message to the list of pinned messages in a chat. If the chat is not a private chat, the bot must be an administrator in the chat for this to work and must have the 'can_pin_messages' administrator right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#pinchatmessage - """ - - __returning__ = bool - __api_method__ = "pinChatMessage" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - message_id: int - """Identifier of a message to pin""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be pinned""" - disable_notification: Optional[bool] = None - """Pass :code:`True` if it is not necessary to send a notification to all chat members about the new pinned message. Notifications are always disabled in channels and private chats.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - message_id: int, - business_connection_id: Optional[str] = None, - disable_notification: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - message_id=message_id, - business_connection_id=business_connection_id, - disable_notification=disable_notification, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/promote_chat_member.py b/env/Lib/site-packages/aiogram/methods/promote_chat_member.py deleted file mode 100644 index 2ca410f..0000000 --- a/env/Lib/site-packages/aiogram/methods/promote_chat_member.py +++ /dev/null @@ -1,102 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from .base import TelegramMethod - - -class PromoteChatMember(TelegramMethod[bool]): - """ - Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Pass :code:`False` for all boolean parameters to demote a user. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#promotechatmember - """ - - __returning__ = bool - __api_method__ = "promoteChatMember" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - user_id: int - """Unique identifier of the target user""" - is_anonymous: Optional[bool] = None - """Pass :code:`True` if the administrator's presence in the chat is hidden""" - can_manage_chat: Optional[bool] = None - """Pass :code:`True` if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report spam messages and ignore slow mode. Implied by any other administrator privilege.""" - can_delete_messages: Optional[bool] = None - """Pass :code:`True` if the administrator can delete messages of other users""" - can_manage_video_chats: Optional[bool] = None - """Pass :code:`True` if the administrator can manage video chats""" - can_restrict_members: Optional[bool] = None - """Pass :code:`True` if the administrator can restrict, ban or unban chat members, or access supergroup statistics""" - can_promote_members: Optional[bool] = None - """Pass :code:`True` if the administrator can add new administrators with a subset of their own privileges or demote administrators that they have promoted, directly or indirectly (promoted by administrators that were appointed by him)""" - can_change_info: Optional[bool] = None - """Pass :code:`True` if the administrator can change chat title, photo and other settings""" - can_invite_users: Optional[bool] = None - """Pass :code:`True` if the administrator can invite new users to the chat""" - can_post_stories: Optional[bool] = None - """Pass :code:`True` if the administrator can post stories to the chat""" - can_edit_stories: Optional[bool] = None - """Pass :code:`True` if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access the chat's story archive""" - can_delete_stories: Optional[bool] = None - """Pass :code:`True` if the administrator can delete stories posted by other users""" - can_post_messages: Optional[bool] = None - """Pass :code:`True` if the administrator can post messages in the channel, or access channel statistics; for channels only""" - can_edit_messages: Optional[bool] = None - """Pass :code:`True` if the administrator can edit messages of other users and can pin messages; for channels only""" - can_pin_messages: Optional[bool] = None - """Pass :code:`True` if the administrator can pin messages; for supergroups only""" - can_manage_topics: Optional[bool] = None - """Pass :code:`True` if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - user_id: int, - is_anonymous: Optional[bool] = None, - can_manage_chat: Optional[bool] = None, - can_delete_messages: Optional[bool] = None, - can_manage_video_chats: Optional[bool] = None, - can_restrict_members: Optional[bool] = None, - can_promote_members: Optional[bool] = None, - can_change_info: Optional[bool] = None, - can_invite_users: Optional[bool] = None, - can_post_stories: Optional[bool] = None, - can_edit_stories: Optional[bool] = None, - can_delete_stories: Optional[bool] = None, - can_post_messages: Optional[bool] = None, - can_edit_messages: Optional[bool] = None, - can_pin_messages: Optional[bool] = None, - can_manage_topics: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - user_id=user_id, - is_anonymous=is_anonymous, - can_manage_chat=can_manage_chat, - can_delete_messages=can_delete_messages, - can_manage_video_chats=can_manage_video_chats, - can_restrict_members=can_restrict_members, - can_promote_members=can_promote_members, - can_change_info=can_change_info, - can_invite_users=can_invite_users, - can_post_stories=can_post_stories, - can_edit_stories=can_edit_stories, - can_delete_stories=can_delete_stories, - can_post_messages=can_post_messages, - can_edit_messages=can_edit_messages, - can_pin_messages=can_pin_messages, - can_manage_topics=can_manage_topics, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/refund_star_payment.py b/env/Lib/site-packages/aiogram/methods/refund_star_payment.py deleted file mode 100644 index 495cc9e..0000000 --- a/env/Lib/site-packages/aiogram/methods/refund_star_payment.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramMethod - - -class RefundStarPayment(TelegramMethod[bool]): - """ - Refunds a successful payment in `Telegram Stars `_. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#refundstarpayment - """ - - __returning__ = bool - __api_method__ = "refundStarPayment" - - user_id: int - """Identifier of the user whose payment will be refunded""" - telegram_payment_charge_id: str - """Telegram payment identifier""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - user_id: int, - telegram_payment_charge_id: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - user_id=user_id, - telegram_payment_charge_id=telegram_payment_charge_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/reopen_forum_topic.py b/env/Lib/site-packages/aiogram/methods/reopen_forum_topic.py deleted file mode 100644 index 45eb18d..0000000 --- a/env/Lib/site-packages/aiogram/methods/reopen_forum_topic.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class ReopenForumTopic(TelegramMethod[bool]): - """ - Use this method to reopen a closed topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights, unless it is the creator of the topic. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#reopenforumtopic - """ - - __returning__ = bool - __api_method__ = "reopenForumTopic" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - message_thread_id: int - """Unique identifier for the target message thread of the forum topic""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - message_thread_id: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, message_thread_id=message_thread_id, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/methods/reopen_general_forum_topic.py b/env/Lib/site-packages/aiogram/methods/reopen_general_forum_topic.py deleted file mode 100644 index a6dc04e..0000000 --- a/env/Lib/site-packages/aiogram/methods/reopen_general_forum_topic.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class ReopenGeneralForumTopic(TelegramMethod[bool]): - """ - Use this method to reopen a closed 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights. The topic will be automatically unhidden if it was hidden. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#reopengeneralforumtopic - """ - - __returning__ = bool - __api_method__ = "reopenGeneralForumTopic" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/replace_sticker_in_set.py b/env/Lib/site-packages/aiogram/methods/replace_sticker_in_set.py deleted file mode 100644 index f46eef2..0000000 --- a/env/Lib/site-packages/aiogram/methods/replace_sticker_in_set.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from ..types import InputSticker -from .base import TelegramMethod - - -class ReplaceStickerInSet(TelegramMethod[bool]): - """ - Use this method to replace an existing sticker in a sticker set with a new one. The method is equivalent to calling :class:`aiogram.methods.delete_sticker_from_set.DeleteStickerFromSet`, then :class:`aiogram.methods.add_sticker_to_set.AddStickerToSet`, then :class:`aiogram.methods.set_sticker_position_in_set.SetStickerPositionInSet`. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#replacestickerinset - """ - - __returning__ = bool - __api_method__ = "replaceStickerInSet" - - user_id: int - """User identifier of the sticker set owner""" - name: str - """Sticker set name""" - old_sticker: str - """File identifier of the replaced sticker""" - sticker: InputSticker - """A JSON-serialized object with information about the added sticker. If exactly the same sticker had already been added to the set, then the set remains unchanged.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - user_id: int, - name: str, - old_sticker: str, - sticker: InputSticker, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - user_id=user_id, - name=name, - old_sticker=old_sticker, - sticker=sticker, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/restrict_chat_member.py b/env/Lib/site-packages/aiogram/methods/restrict_chat_member.py deleted file mode 100644 index 5dfbd01..0000000 --- a/env/Lib/site-packages/aiogram/methods/restrict_chat_member.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import annotations - -import datetime -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import ChatPermissions -from .base import TelegramMethod - - -class RestrictChatMember(TelegramMethod[bool]): - """ - Use this method to restrict a user in a supergroup. The bot must be an administrator in the supergroup for this to work and must have the appropriate administrator rights. Pass :code:`True` for all permissions to lift restrictions from a user. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#restrictchatmember - """ - - __returning__ = bool - __api_method__ = "restrictChatMember" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - user_id: int - """Unique identifier of the target user""" - permissions: ChatPermissions - """A JSON-serialized object for new user permissions""" - use_independent_chat_permissions: Optional[bool] = None - """Pass :code:`True` if chat permissions are set independently. Otherwise, the *can_send_other_messages* and *can_add_web_page_previews* permissions will imply the *can_send_messages*, *can_send_audios*, *can_send_documents*, *can_send_photos*, *can_send_videos*, *can_send_video_notes*, and *can_send_voice_notes* permissions; the *can_send_polls* permission will imply the *can_send_messages* permission.""" - until_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None - """Date when restrictions will be lifted for the user; Unix time. If user is restricted for more than 366 days or less than 30 seconds from the current time, they are considered to be restricted forever""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - user_id: int, - permissions: ChatPermissions, - use_independent_chat_permissions: Optional[bool] = None, - until_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - user_id=user_id, - permissions=permissions, - use_independent_chat_permissions=use_independent_chat_permissions, - until_date=until_date, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/revoke_chat_invite_link.py b/env/Lib/site-packages/aiogram/methods/revoke_chat_invite_link.py deleted file mode 100644 index 414feb3..0000000 --- a/env/Lib/site-packages/aiogram/methods/revoke_chat_invite_link.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from ..types import ChatInviteLink -from .base import TelegramMethod - - -class RevokeChatInviteLink(TelegramMethod[ChatInviteLink]): - """ - Use this method to revoke an invite link created by the bot. If the primary link is revoked, a new link is automatically generated. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the revoked invite link as :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - - Source: https://core.telegram.org/bots/api#revokechatinvitelink - """ - - __returning__ = ChatInviteLink - __api_method__ = "revokeChatInviteLink" - - chat_id: Union[int, str] - """Unique identifier of the target chat or username of the target channel (in the format :code:`@channelusername`)""" - invite_link: str - """The invite link to revoke""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - invite_link: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, invite_link=invite_link, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/send_animation.py b/env/Lib/site-packages/aiogram/methods/send_animation.py deleted file mode 100644 index 0baab73..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_animation.py +++ /dev/null @@ -1,141 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - InputFile, - Message, - MessageEntity, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendAnimation(TelegramMethod[Message]): - """ - Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendanimation - """ - - __returning__ = Message - __api_method__ = "sendAnimation" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - animation: Union[InputFile, str] - """Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. :ref:`More information on Sending Files » `""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - duration: Optional[int] = None - """Duration of sent animation in seconds""" - width: Optional[int] = None - """Animation width""" - height: Optional[int] = None - """Animation height""" - thumbnail: Optional[InputFile] = None - """Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » `""" - caption: Optional[str] = None - """Animation caption (may also be used when resending animation by *file_id*), 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """Mode for parsing entities in the animation caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """Pass :code:`True`, if the caption must be shown above the message media""" - has_spoiler: Optional[bool] = None - """Pass :code:`True` if the animation needs to be covered with a spoiler animation""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - animation: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - animation=animation, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_audio.py b/env/Lib/site-packages/aiogram/methods/send_audio.py deleted file mode 100644 index b15824a..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_audio.py +++ /dev/null @@ -1,132 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - InputFile, - Message, - MessageEntity, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendAudio(TelegramMethod[Message]): - """ - Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future. - For sending voice messages, use the :class:`aiogram.methods.send_voice.SendVoice` method instead. - - Source: https://core.telegram.org/bots/api#sendaudio - """ - - __returning__ = Message - __api_method__ = "sendAudio" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - audio: Union[InputFile, str] - """Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » `""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - caption: Optional[str] = None - """Audio caption, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """Mode for parsing entities in the audio caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - duration: Optional[int] = None - """Duration of the audio in seconds""" - performer: Optional[str] = None - """Performer""" - title: Optional[str] = None - """Track name""" - thumbnail: Optional[InputFile] = None - """Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » `""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - audio: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - audio=audio, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - performer=performer, - title=title, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_chat_action.py b/env/Lib/site-packages/aiogram/methods/send_chat_action.py deleted file mode 100644 index a9f452a..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_chat_action.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from .base import TelegramMethod - - -class SendChatAction(TelegramMethod[bool]): - """ - Use this method when you need to tell the user that something is happening on the bot's side. The status is set for 5 seconds or less (when a message arrives from your bot, Telegram clients clear its typing status). Returns :code:`True` on success. - - Example: The `ImageBot `_ needs some time to process a request and upload the image. Instead of sending a text message along the lines of 'Retrieving image, please wait…', the bot may use :class:`aiogram.methods.send_chat_action.SendChatAction` with *action* = *upload_photo*. The user will see a 'sending photo' status for the bot. - - We only recommend using this method when a response from the bot will take a **noticeable** amount of time to arrive. - - Source: https://core.telegram.org/bots/api#sendchataction - """ - - __returning__ = bool - __api_method__ = "sendChatAction" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - action: str - """Type of action to broadcast. Choose one, depending on what the user is about to receive: *typing* for `text messages `_, *upload_photo* for `photos `_, *record_video* or *upload_video* for `videos `_, *record_voice* or *upload_voice* for `voice notes `_, *upload_document* for `general files `_, *choose_sticker* for `stickers `_, *find_location* for `location data `_, *record_video_note* or *upload_video_note* for `video notes `_.""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the action will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread; for supergroups only""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - action: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - action=action, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_contact.py b/env/Lib/site-packages/aiogram/methods/send_contact.py deleted file mode 100644 index 6c14d56..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_contact.py +++ /dev/null @@ -1,113 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - Message, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendContact(TelegramMethod[Message]): - """ - Use this method to send phone contacts. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendcontact - """ - - __returning__ = Message - __api_method__ = "sendContact" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - phone_number: str - """Contact's phone number""" - first_name: str - """Contact's first name""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - last_name: Optional[str] = None - """Contact's last name""" - vcard: Optional[str] = None - """Additional data about the contact in the form of a `vCard `_, 0-2048 bytes""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - phone_number: str, - first_name: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - last_name: Optional[str] = None, - vcard: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - phone_number=phone_number, - first_name=first_name, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - last_name=last_name, - vcard=vcard, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_dice.py b/env/Lib/site-packages/aiogram/methods/send_dice.py deleted file mode 100644 index 42d2bf5..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_dice.py +++ /dev/null @@ -1,101 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - Message, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendDice(TelegramMethod[Message]): - """ - Use this method to send an animated emoji that will display a random value. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#senddice - """ - - __returning__ = Message - __api_method__ = "sendDice" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - emoji: Optional[str] = None - """Emoji on which the dice throw animation is based. Currently, must be one of '🎲', '🎯', '🏀', '⚽', '🎳', or '🎰'. Dice can have values 1-6 for '🎲', '🎯' and '🎳', values 1-5 for '🏀' and '⚽', and values 1-64 for '🎰'. Defaults to '🎲'""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_document.py b/env/Lib/site-packages/aiogram/methods/send_document.py deleted file mode 100644 index 411165d..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_document.py +++ /dev/null @@ -1,123 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - InputFile, - Message, - MessageEntity, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendDocument(TelegramMethod[Message]): - """ - Use this method to send general files. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#senddocument - """ - - __returning__ = Message - __api_method__ = "sendDocument" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - document: Union[InputFile, str] - """File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » `""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - thumbnail: Optional[InputFile] = None - """Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » `""" - caption: Optional[str] = None - """Document caption (may also be used when resending documents by *file_id*), 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """Mode for parsing entities in the document caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - disable_content_type_detection: Optional[bool] = None - """Disables automatic server-side content type detection for files uploaded using multipart/form-data""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - document: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - disable_content_type_detection: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - document=document, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_content_type_detection=disable_content_type_detection, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_game.py b/env/Lib/site-packages/aiogram/methods/send_game.py deleted file mode 100644 index eb96330..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_game.py +++ /dev/null @@ -1,90 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import InlineKeyboardMarkup, Message, ReplyParameters -from .base import TelegramMethod - - -class SendGame(TelegramMethod[Message]): - """ - Use this method to send a game. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendgame - """ - - __returning__ = Message - __api_method__ = "sendGame" - - chat_id: int - """Unique identifier for the target chat""" - game_short_name: str - """Short name of the game, serves as the unique identifier for the game. Set up your games via `@BotFather `_.""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """A JSON-serialized object for an `inline keyboard `_. If empty, one 'Play game_title' button will be shown. If not empty, the first button must launch the game.""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: int, - game_short_name: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - game_short_name=game_short_name, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_invoice.py b/env/Lib/site-packages/aiogram/methods/send_invoice.py deleted file mode 100644 index 108219e..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_invoice.py +++ /dev/null @@ -1,166 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import InlineKeyboardMarkup, LabeledPrice, Message, ReplyParameters -from .base import TelegramMethod - - -class SendInvoice(TelegramMethod[Message]): - """ - Use this method to send invoices. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendinvoice - """ - - __returning__ = Message - __api_method__ = "sendInvoice" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - title: str - """Product name, 1-32 characters""" - description: str - """Product description, 1-255 characters""" - payload: str - """Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes.""" - currency: str - """Three-letter ISO 4217 currency code, see `more on currencies `_. Pass 'XTR' for payments in `Telegram Stars `_.""" - prices: List[LabeledPrice] - """Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in `Telegram Stars `_.""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - provider_token: Optional[str] = None - """Payment provider token, obtained via `@BotFather `_. Pass an empty string for payments in `Telegram Stars `_.""" - max_tip_amount: Optional[int] = None - """The maximum accepted amount for tips in the *smallest units* of the currency (integer, **not** float/double). For example, for a maximum tip of :code:`US$ 1.45` pass :code:`max_tip_amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in `Telegram Stars `_.""" - suggested_tip_amounts: Optional[List[int]] = None - """A JSON-serialized array of suggested amounts of tips in the *smallest units* of the currency (integer, **not** float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed *max_tip_amount*.""" - start_parameter: Optional[str] = None - """Unique deep-linking parameter. If left empty, **forwarded copies** of the sent message will have a *Pay* button, allowing multiple users to pay directly from the forwarded message, using the same invoice. If non-empty, forwarded copies of the sent message will have a *URL* button with a deep link to the bot (instead of a *Pay* button), with the value used as the start parameter""" - provider_data: Optional[str] = None - """JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider.""" - photo_url: Optional[str] = None - """URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for.""" - photo_size: Optional[int] = None - """Photo size in bytes""" - photo_width: Optional[int] = None - """Photo width""" - photo_height: Optional[int] = None - """Photo height""" - need_name: Optional[bool] = None - """Pass :code:`True` if you require the user's full name to complete the order. Ignored for payments in `Telegram Stars `_.""" - need_phone_number: Optional[bool] = None - """Pass :code:`True` if you require the user's phone number to complete the order. Ignored for payments in `Telegram Stars `_.""" - need_email: Optional[bool] = None - """Pass :code:`True` if you require the user's email address to complete the order. Ignored for payments in `Telegram Stars `_.""" - need_shipping_address: Optional[bool] = None - """Pass :code:`True` if you require the user's shipping address to complete the order. Ignored for payments in `Telegram Stars `_.""" - send_phone_number_to_provider: Optional[bool] = None - """Pass :code:`True` if the user's phone number should be sent to the provider. Ignored for payments in `Telegram Stars `_.""" - send_email_to_provider: Optional[bool] = None - """Pass :code:`True` if the user's email address should be sent to the provider. Ignored for payments in `Telegram Stars `_.""" - is_flexible: Optional[bool] = None - """Pass :code:`True` if the final price depends on the shipping method. Ignored for payments in `Telegram Stars `_.""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """A JSON-serialized object for an `inline keyboard `_. If empty, one 'Pay :code:`total price`' button will be shown. If not empty, the first button must be a Pay button.""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - title: str, - description: str, - payload: str, - currency: str, - prices: List[LabeledPrice], - message_thread_id: Optional[int] = None, - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[List[int]] = None, - start_parameter: Optional[str] = None, - provider_data: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - title=title, - description=description, - payload=payload, - currency=currency, - prices=prices, - message_thread_id=message_thread_id, - provider_token=provider_token, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - start_parameter=start_parameter, - provider_data=provider_data, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - is_flexible=is_flexible, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_location.py b/env/Lib/site-packages/aiogram/methods/send_location.py deleted file mode 100644 index d33f676..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_location.py +++ /dev/null @@ -1,121 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - Message, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendLocation(TelegramMethod[Message]): - """ - Use this method to send point on the map. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendlocation - """ - - __returning__ = Message - __api_method__ = "sendLocation" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - latitude: float - """Latitude of the location""" - longitude: float - """Longitude of the location""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - horizontal_accuracy: Optional[float] = None - """The radius of uncertainty for the location, measured in meters; 0-1500""" - live_period: Optional[int] = None - """Period in seconds during which the location will be updated (see `Live Locations `_, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely.""" - heading: Optional[int] = None - """For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.""" - proximity_alert_radius: Optional[int] = None - """For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - latitude: float, - longitude: float, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - horizontal_accuracy: Optional[float] = None, - live_period: Optional[int] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - latitude=latitude, - longitude=longitude, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - horizontal_accuracy=horizontal_accuracy, - live_period=live_period, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_media_group.py b/env/Lib/site-packages/aiogram/methods/send_media_group.py deleted file mode 100644 index f8c081a..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_media_group.py +++ /dev/null @@ -1,99 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - InputMediaAudio, - InputMediaDocument, - InputMediaPhoto, - InputMediaVideo, - Message, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendMediaGroup(TelegramMethod[List[Message]]): - """ - Use this method to send a group of photos, videos, documents or audios as an album. Documents and audio files can be only grouped in an album with messages of the same type. On success, an array of `Messages `_ that were sent is returned. - - Source: https://core.telegram.org/bots/api#sendmediagroup - """ - - __returning__ = List[Message] - __api_method__ = "sendMediaGroup" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - media: List[Union[InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo]] - """A JSON-serialized array describing messages to be sent, must include 2-10 items""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - disable_notification: Optional[bool] = None - """Sends messages `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent messages from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the messages are a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - media: List[ - Union[InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo] - ], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - media=media, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_message.py b/env/Lib/site-packages/aiogram/methods/send_message.py deleted file mode 100644 index caf2852..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_message.py +++ /dev/null @@ -1,128 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - LinkPreviewOptions, - Message, - MessageEntity, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendMessage(TelegramMethod[Message]): - """ - Use this method to send text messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendmessage - """ - - __returning__ = Message - __api_method__ = "sendMessage" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - text: str - """Text of the message to be sent, 1-4096 characters after entities parsing""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """Mode for parsing entities in the message text. See `formatting options `_ for more details.""" - entities: Optional[List[MessageEntity]] = None - """A JSON-serialized list of special entities that appear in message text, which can be specified instead of *parse_mode*""" - link_preview_options: Optional[Union[LinkPreviewOptions, Default]] = Default("link_preview") - """Link preview generation options for the message""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - disable_web_page_preview: Optional[Union[bool, Default]] = Field( - Default("link_preview_is_disabled"), json_schema_extra={"deprecated": True} - ) - """Disables link previews for links in this message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - text: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - entities: Optional[List[MessageEntity]] = None, - link_preview_options: Optional[Union[LinkPreviewOptions, Default]] = Default( - "link_preview" - ), - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - disable_web_page_preview: Optional[Union[bool, Default]] = Default( - "link_preview_is_disabled" - ), - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - text=text, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - parse_mode=parse_mode, - entities=entities, - link_preview_options=link_preview_options, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - disable_web_page_preview=disable_web_page_preview, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_paid_media.py b/env/Lib/site-packages/aiogram/methods/send_paid_media.py deleted file mode 100644 index dd847f5..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_paid_media.py +++ /dev/null @@ -1,97 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - InputPaidMediaPhoto, - InputPaidMediaVideo, - Message, - MessageEntity, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendPaidMedia(TelegramMethod[Message]): - """ - Use this method to send paid media. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendpaidmedia - """ - - __returning__ = Message - __api_method__ = "sendPaidMedia" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`). If the chat is a channel, all Telegram Star proceeds from this media will be credited to the chat's balance. Otherwise, they will be credited to the bot's balance.""" - star_count: int - """The number of Telegram Stars that must be paid to buy access to the media""" - media: List[Union[InputPaidMediaPhoto, InputPaidMediaVideo]] - """A JSON-serialized array describing the media to be sent; up to 10 items""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - caption: Optional[str] = None - """Media caption, 0-1024 characters after entities parsing""" - parse_mode: Optional[str] = None - """Mode for parsing entities in the media caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[bool] = None - """Pass :code:`True`, if the caption must be shown above the message media""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[bool] = None - """Protects the contents of the sent message from forwarding and saving""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - star_count: int, - media: List[Union[InputPaidMediaPhoto, InputPaidMediaVideo]], - business_connection_id: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[str] = None, - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - star_count=star_count, - media=media, - business_connection_id=business_connection_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - disable_notification=disable_notification, - protect_content=protect_content, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_photo.py b/env/Lib/site-packages/aiogram/methods/send_photo.py deleted file mode 100644 index 3ba7da1..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_photo.py +++ /dev/null @@ -1,125 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - InputFile, - Message, - MessageEntity, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendPhoto(TelegramMethod[Message]): - """ - Use this method to send photos. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendphoto - """ - - __returning__ = Message - __api_method__ = "sendPhoto" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - photo: Union[InputFile, str] - """Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. :ref:`More information on Sending Files » `""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - caption: Optional[str] = None - """Photo caption (may also be used when resending photos by *file_id*), 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """Mode for parsing entities in the photo caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """Pass :code:`True`, if the caption must be shown above the message media""" - has_spoiler: Optional[bool] = None - """Pass :code:`True` if the photo needs to be covered with a spoiler animation""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - photo: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - photo=photo, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_poll.py b/env/Lib/site-packages/aiogram/methods/send_poll.py deleted file mode 100644 index e791b70..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_poll.py +++ /dev/null @@ -1,156 +0,0 @@ -from __future__ import annotations - -import datetime -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - InputPollOption, - Message, - MessageEntity, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendPoll(TelegramMethod[Message]): - """ - Use this method to send a native poll. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendpoll - """ - - __returning__ = Message - __api_method__ = "sendPoll" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - question: str - """Poll question, 1-300 characters""" - options: List[Union[InputPollOption, str]] - """A JSON-serialized list of 2-10 answer options""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - question_parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """Mode for parsing entities in the question. See `formatting options `_ for more details. Currently, only custom emoji entities are allowed""" - question_entities: Optional[List[MessageEntity]] = None - """A JSON-serialized list of special entities that appear in the poll question. It can be specified instead of *question_parse_mode*""" - is_anonymous: Optional[bool] = None - """:code:`True`, if the poll needs to be anonymous, defaults to :code:`True`""" - type: Optional[str] = None - """Poll type, 'quiz' or 'regular', defaults to 'regular'""" - allows_multiple_answers: Optional[bool] = None - """:code:`True`, if the poll allows multiple answers, ignored for polls in quiz mode, defaults to :code:`False`""" - correct_option_id: Optional[int] = None - """0-based identifier of the correct answer option, required for polls in quiz mode""" - explanation: Optional[str] = None - """Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters with at most 2 line feeds after entities parsing""" - explanation_parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """Mode for parsing entities in the explanation. See `formatting options `_ for more details.""" - explanation_entities: Optional[List[MessageEntity]] = None - """A JSON-serialized list of special entities that appear in the poll explanation. It can be specified instead of *explanation_parse_mode*""" - open_period: Optional[int] = None - """Amount of time in seconds the poll will be active after creation, 5-600. Can't be used together with *close_date*.""" - close_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None - """Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 600 seconds in the future. Can't be used together with *open_period*.""" - is_closed: Optional[bool] = None - """Pass :code:`True` if the poll needs to be immediately closed. This can be useful for poll preview.""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - question: str, - options: List[Union[InputPollOption, str]], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - question_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - question_entities: Optional[List[MessageEntity]] = None, - is_anonymous: Optional[bool] = None, - type: Optional[str] = None, - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[int] = None, - explanation: Optional[str] = None, - explanation_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - explanation_entities: Optional[List[MessageEntity]] = None, - open_period: Optional[int] = None, - close_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - is_closed: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - question=question, - options=options, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - question_parse_mode=question_parse_mode, - question_entities=question_entities, - is_anonymous=is_anonymous, - type=type, - allows_multiple_answers=allows_multiple_answers, - correct_option_id=correct_option_id, - explanation=explanation, - explanation_parse_mode=explanation_parse_mode, - explanation_entities=explanation_entities, - open_period=open_period, - close_date=close_date, - is_closed=is_closed, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_sticker.py b/env/Lib/site-packages/aiogram/methods/send_sticker.py deleted file mode 100644 index 236792b..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_sticker.py +++ /dev/null @@ -1,106 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - InputFile, - Message, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendSticker(TelegramMethod[Message]): - """ - Use this method to send static .WEBP, `animated `_ .TGS, or `video `_ .WEBM stickers. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendsticker - """ - - __returning__ = Message - __api_method__ = "sendSticker" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - sticker: Union[InputFile, str] - """Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. :ref:`More information on Sending Files » `. Video and animated stickers can't be sent via an HTTP URL.""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - emoji: Optional[str] = None - """Emoji associated with the sticker; only for just uploaded stickers""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - sticker: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - sticker=sticker, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_venue.py b/env/Lib/site-packages/aiogram/methods/send_venue.py deleted file mode 100644 index 04ebcee..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_venue.py +++ /dev/null @@ -1,129 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - Message, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendVenue(TelegramMethod[Message]): - """ - Use this method to send information about a venue. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvenue - """ - - __returning__ = Message - __api_method__ = "sendVenue" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - latitude: float - """Latitude of the venue""" - longitude: float - """Longitude of the venue""" - title: str - """Name of the venue""" - address: str - """Address of the venue""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - foursquare_id: Optional[str] = None - """Foursquare identifier of the venue""" - foursquare_type: Optional[str] = None - """Foursquare type of the venue, if known. (For example, 'arts_entertainment/default', 'arts_entertainment/aquarium' or 'food/icecream'.)""" - google_place_id: Optional[str] = None - """Google Places identifier of the venue""" - google_place_type: Optional[str] = None - """Google Places type of the venue. (See `supported types `_.)""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - latitude: float, - longitude: float, - title: str, - address: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - latitude=latitude, - longitude=longitude, - title=title, - address=address, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - foursquare_id=foursquare_id, - foursquare_type=foursquare_type, - google_place_id=google_place_id, - google_place_type=google_place_type, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_video.py b/env/Lib/site-packages/aiogram/methods/send_video.py deleted file mode 100644 index 33fb7aa..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_video.py +++ /dev/null @@ -1,145 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - InputFile, - Message, - MessageEntity, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendVideo(TelegramMethod[Message]): - """ - Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvideo - """ - - __returning__ = Message - __api_method__ = "sendVideo" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - video: Union[InputFile, str] - """Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. :ref:`More information on Sending Files » `""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - duration: Optional[int] = None - """Duration of sent video in seconds""" - width: Optional[int] = None - """Video width""" - height: Optional[int] = None - """Video height""" - thumbnail: Optional[InputFile] = None - """Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » `""" - caption: Optional[str] = None - """Video caption (may also be used when resending videos by *file_id*), 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """Mode for parsing entities in the video caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """Pass :code:`True`, if the caption must be shown above the message media""" - has_spoiler: Optional[bool] = None - """Pass :code:`True` if the video needs to be covered with a spoiler animation""" - supports_streaming: Optional[bool] = None - """Pass :code:`True` if the uploaded video is suitable for streaming""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - video: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - supports_streaming: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - video=video, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - supports_streaming=supports_streaming, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_video_note.py b/env/Lib/site-packages/aiogram/methods/send_video_note.py deleted file mode 100644 index 43d685b..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_video_note.py +++ /dev/null @@ -1,114 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - InputFile, - Message, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendVideoNote(TelegramMethod[Message]): - """ - As of `v.4.0 `_, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvideonote - """ - - __returning__ = Message - __api_method__ = "sendVideoNote" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - video_note: Union[InputFile, str] - """Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. :ref:`More information on Sending Files » `. Sending video notes by a URL is currently unsupported""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - duration: Optional[int] = None - """Duration of sent video in seconds""" - length: Optional[int] = None - """Video width and height, i.e. diameter of the video message""" - thumbnail: Optional[InputFile] = None - """Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » `""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - video_note: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - length: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - video_note=video_note, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - length=length, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/send_voice.py b/env/Lib/site-packages/aiogram/methods/send_voice.py deleted file mode 100644 index ccb27d3..0000000 --- a/env/Lib/site-packages/aiogram/methods/send_voice.py +++ /dev/null @@ -1,119 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from ..types import ( - ForceReply, - InlineKeyboardMarkup, - InputFile, - Message, - MessageEntity, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ReplyParameters, -) -from .base import TelegramMethod - - -class SendVoice(TelegramMethod[Message]): - """ - Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as :class:`aiogram.types.audio.Audio` or :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvoice - """ - - __returning__ = Message - __api_method__ = "sendVoice" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - voice: Union[InputFile, str] - """Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » `""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be sent""" - message_thread_id: Optional[int] = None - """Unique identifier for the target message thread (topic) of the forum; for forum supergroups only""" - caption: Optional[str] = None - """Voice message caption, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """Mode for parsing entities in the voice message caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - duration: Optional[int] = None - """Duration of the voice message in seconds""" - disable_notification: Optional[bool] = None - """Sends the message `silently `_. Users will receive a notification with no sound.""" - protect_content: Optional[Union[bool, Default]] = Default("protect_content") - """Protects the contents of the sent message from forwarding and saving""" - message_effect_id: Optional[str] = None - """Unique identifier of the message effect to be added to the message; for private chats only""" - reply_parameters: Optional[ReplyParameters] = None - """Description of the message to reply to""" - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None - """Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user""" - allow_sending_without_reply: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - reply_to_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """If the message is a reply, ID of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - voice: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - voice=voice, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/set_chat_administrator_custom_title.py b/env/Lib/site-packages/aiogram/methods/set_chat_administrator_custom_title.py deleted file mode 100644 index a7953c1..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_chat_administrator_custom_title.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class SetChatAdministratorCustomTitle(TelegramMethod[bool]): - """ - Use this method to set a custom title for an administrator in a supergroup promoted by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatadministratorcustomtitle - """ - - __returning__ = bool - __api_method__ = "setChatAdministratorCustomTitle" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - user_id: int - """Unique identifier of the target user""" - custom_title: str - """New custom title for the administrator; 0-16 characters, emoji are not allowed""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - user_id: int, - custom_title: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, user_id=user_id, custom_title=custom_title, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/methods/set_chat_description.py b/env/Lib/site-packages/aiogram/methods/set_chat_description.py deleted file mode 100644 index 0f8a4a4..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_chat_description.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from .base import TelegramMethod - - -class SetChatDescription(TelegramMethod[bool]): - """ - Use this method to change the description of a group, a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatdescription - """ - - __returning__ = bool - __api_method__ = "setChatDescription" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - description: Optional[str] = None - """New chat description, 0-255 characters""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - description: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, description=description, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/set_chat_menu_button.py b/env/Lib/site-packages/aiogram/methods/set_chat_menu_button.py deleted file mode 100644 index 97515d5..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_chat_menu_button.py +++ /dev/null @@ -1,41 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import MenuButtonCommands, MenuButtonDefault, MenuButtonWebApp -from .base import TelegramMethod - - -class SetChatMenuButton(TelegramMethod[bool]): - """ - Use this method to change the bot's menu button in a private chat, or the default menu button. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatmenubutton - """ - - __returning__ = bool - __api_method__ = "setChatMenuButton" - - chat_id: Optional[int] = None - """Unique identifier for the target private chat. If not specified, default bot's menu button will be changed""" - menu_button: Optional[Union[MenuButtonCommands, MenuButtonWebApp, MenuButtonDefault]] = None - """A JSON-serialized object for the bot's new menu button. Defaults to :class:`aiogram.types.menu_button_default.MenuButtonDefault`""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Optional[int] = None, - menu_button: Optional[ - Union[MenuButtonCommands, MenuButtonWebApp, MenuButtonDefault] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, menu_button=menu_button, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/set_chat_permissions.py b/env/Lib/site-packages/aiogram/methods/set_chat_permissions.py deleted file mode 100644 index 232af08..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_chat_permissions.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import ChatPermissions -from .base import TelegramMethod - - -class SetChatPermissions(TelegramMethod[bool]): - """ - Use this method to set default chat permissions for all members. The bot must be an administrator in the group or a supergroup for this to work and must have the *can_restrict_members* administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatpermissions - """ - - __returning__ = bool - __api_method__ = "setChatPermissions" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - permissions: ChatPermissions - """A JSON-serialized object for new default chat permissions""" - use_independent_chat_permissions: Optional[bool] = None - """Pass :code:`True` if chat permissions are set independently. Otherwise, the *can_send_other_messages* and *can_add_web_page_previews* permissions will imply the *can_send_messages*, *can_send_audios*, *can_send_documents*, *can_send_photos*, *can_send_videos*, *can_send_video_notes*, and *can_send_voice_notes* permissions; the *can_send_polls* permission will imply the *can_send_messages* permission.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - permissions: ChatPermissions, - use_independent_chat_permissions: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - permissions=permissions, - use_independent_chat_permissions=use_independent_chat_permissions, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/set_chat_photo.py b/env/Lib/site-packages/aiogram/methods/set_chat_photo.py deleted file mode 100644 index 105f8f8..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_chat_photo.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from ..types import InputFile -from .base import TelegramMethod - - -class SetChatPhoto(TelegramMethod[bool]): - """ - Use this method to set a new profile photo for the chat. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatphoto - """ - - __returning__ = bool - __api_method__ = "setChatPhoto" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - photo: InputFile - """New chat photo, uploaded using multipart/form-data""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - photo: InputFile, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, photo=photo, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/set_chat_sticker_set.py b/env/Lib/site-packages/aiogram/methods/set_chat_sticker_set.py deleted file mode 100644 index 62ed5d1..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_chat_sticker_set.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class SetChatStickerSet(TelegramMethod[bool]): - """ - Use this method to set a new group sticker set for a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field *can_set_sticker_set* optionally returned in :class:`aiogram.methods.get_chat.GetChat` requests to check if the bot can use this method. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatstickerset - """ - - __returning__ = bool - __api_method__ = "setChatStickerSet" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - sticker_set_name: str - """Name of the sticker set to be set as the group sticker set""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - sticker_set_name: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, sticker_set_name=sticker_set_name, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/methods/set_chat_title.py b/env/Lib/site-packages/aiogram/methods/set_chat_title.py deleted file mode 100644 index 04b52e0..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_chat_title.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class SetChatTitle(TelegramMethod[bool]): - """ - Use this method to change the title of a chat. Titles can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchattitle - """ - - __returning__ = bool - __api_method__ = "setChatTitle" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - title: str - """New chat title, 1-128 characters""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], title: str, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, title=title, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/set_custom_emoji_sticker_set_thumbnail.py b/env/Lib/site-packages/aiogram/methods/set_custom_emoji_sticker_set_thumbnail.py deleted file mode 100644 index 47e9c03..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_custom_emoji_sticker_set_thumbnail.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramMethod - - -class SetCustomEmojiStickerSetThumbnail(TelegramMethod[bool]): - """ - Use this method to set the thumbnail of a custom emoji sticker set. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setcustomemojistickersetthumbnail - """ - - __returning__ = bool - __api_method__ = "setCustomEmojiStickerSetThumbnail" - - name: str - """Sticker set name""" - custom_emoji_id: Optional[str] = None - """Custom emoji identifier of a sticker from the sticker set; pass an empty string to drop the thumbnail and use the first sticker as the thumbnail.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - name: str, - custom_emoji_id: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(name=name, custom_emoji_id=custom_emoji_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/set_game_score.py b/env/Lib/site-packages/aiogram/methods/set_game_score.py deleted file mode 100644 index 38e5374..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_game_score.py +++ /dev/null @@ -1,63 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import Message -from .base import TelegramMethod - - -class SetGameScore(TelegramMethod[Union[Message, bool]]): - """ - Use this method to set the score of the specified user in a game message. On success, if the message is not an inline message, the :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Returns an error, if the new score is not greater than the user's current score in the chat and *force* is :code:`False`. - - Source: https://core.telegram.org/bots/api#setgamescore - """ - - __returning__ = Union[Message, bool] - __api_method__ = "setGameScore" - - user_id: int - """User identifier""" - score: int - """New score, must be non-negative""" - force: Optional[bool] = None - """Pass :code:`True` if the high score is allowed to decrease. This can be useful when fixing mistakes or banning cheaters""" - disable_edit_message: Optional[bool] = None - """Pass :code:`True` if the game message should not be automatically edited to include the current scoreboard""" - chat_id: Optional[int] = None - """Required if *inline_message_id* is not specified. Unique identifier for the target chat""" - message_id: Optional[int] = None - """Required if *inline_message_id* is not specified. Identifier of the sent message""" - inline_message_id: Optional[str] = None - """Required if *chat_id* and *message_id* are not specified. Identifier of the inline message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - user_id: int, - score: int, - force: Optional[bool] = None, - disable_edit_message: Optional[bool] = None, - chat_id: Optional[int] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - user_id=user_id, - score=score, - force=force, - disable_edit_message=disable_edit_message, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/set_message_reaction.py b/env/Lib/site-packages/aiogram/methods/set_message_reaction.py deleted file mode 100644 index d1c061c..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_message_reaction.py +++ /dev/null @@ -1,53 +0,0 @@ -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from ..types import ReactionTypeCustomEmoji, ReactionTypeEmoji, ReactionTypePaid -from .base import TelegramMethod - - -class SetMessageReaction(TelegramMethod[bool]): - """ - Use this method to change the chosen reactions on a message. Service messages can't be reacted to. Automatically forwarded messages from a channel to its discussion group have the same available reactions as messages in the channel. Bots can't use paid reactions. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setmessagereaction - """ - - __returning__ = bool - __api_method__ = "setMessageReaction" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - message_id: int - """Identifier of the target message. If the message belongs to a media group, the reaction is set to the first non-deleted message in the group instead.""" - reaction: Optional[ - List[Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid]] - ] = None - """A JSON-serialized list of reaction types to set on the message. Currently, as non-premium users, bots can set up to one reaction per message. A custom emoji reaction can be used if it is either already present on the message or explicitly allowed by chat administrators. Paid reactions can't be used by bots.""" - is_big: Optional[bool] = None - """Pass :code:`True` to set the reaction with a big animation""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - message_id: int, - reaction: Optional[ - List[Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid]] - ] = None, - is_big: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - message_id=message_id, - reaction=reaction, - is_big=is_big, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/set_my_commands.py b/env/Lib/site-packages/aiogram/methods/set_my_commands.py deleted file mode 100644 index 2e52771..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_my_commands.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from ..types import ( - BotCommand, - BotCommandScopeAllChatAdministrators, - BotCommandScopeAllGroupChats, - BotCommandScopeAllPrivateChats, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - BotCommandScopeDefault, -) -from .base import TelegramMethod - - -class SetMyCommands(TelegramMethod[bool]): - """ - Use this method to change the list of the bot's commands. See `this manual `_ for more details about bot commands. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setmycommands - """ - - __returning__ = bool - __api_method__ = "setMyCommands" - - commands: List[BotCommand] - """A JSON-serialized list of bot commands to be set as the list of the bot's commands. At most 100 commands can be specified.""" - scope: Optional[ - Union[ - BotCommandScopeDefault, - BotCommandScopeAllPrivateChats, - BotCommandScopeAllGroupChats, - BotCommandScopeAllChatAdministrators, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - ] - ] = None - """A JSON-serialized object, describing scope of users for which the commands are relevant. Defaults to :class:`aiogram.types.bot_command_scope_default.BotCommandScopeDefault`.""" - language_code: Optional[str] = None - """A two-letter ISO 639-1 language code. If empty, commands will be applied to all users from the given scope, for whose language there are no dedicated commands""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - commands: List[BotCommand], - scope: Optional[ - Union[ - BotCommandScopeDefault, - BotCommandScopeAllPrivateChats, - BotCommandScopeAllGroupChats, - BotCommandScopeAllChatAdministrators, - BotCommandScopeChat, - BotCommandScopeChatAdministrators, - BotCommandScopeChatMember, - ] - ] = None, - language_code: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - commands=commands, scope=scope, language_code=language_code, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/methods/set_my_default_administrator_rights.py b/env/Lib/site-packages/aiogram/methods/set_my_default_administrator_rights.py deleted file mode 100644 index 02aa7ad..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_my_default_administrator_rights.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from ..types import ChatAdministratorRights -from .base import TelegramMethod - - -class SetMyDefaultAdministratorRights(TelegramMethod[bool]): - """ - Use this method to change the default administrator rights requested by the bot when it's added as an administrator to groups or channels. These rights will be suggested to users, but they are free to modify the list before adding the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setmydefaultadministratorrights - """ - - __returning__ = bool - __api_method__ = "setMyDefaultAdministratorRights" - - rights: Optional[ChatAdministratorRights] = None - """A JSON-serialized object describing new default administrator rights. If not specified, the default administrator rights will be cleared.""" - for_channels: Optional[bool] = None - """Pass :code:`True` to change the default administrator rights of the bot in channels. Otherwise, the default administrator rights of the bot for groups and supergroups will be changed.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - rights: Optional[ChatAdministratorRights] = None, - for_channels: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(rights=rights, for_channels=for_channels, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/set_my_description.py b/env/Lib/site-packages/aiogram/methods/set_my_description.py deleted file mode 100644 index ee192c8..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_my_description.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramMethod - - -class SetMyDescription(TelegramMethod[bool]): - """ - Use this method to change the bot's description, which is shown in the chat with the bot if the chat is empty. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setmydescription - """ - - __returning__ = bool - __api_method__ = "setMyDescription" - - description: Optional[str] = None - """New bot description; 0-512 characters. Pass an empty string to remove the dedicated description for the given language.""" - language_code: Optional[str] = None - """A two-letter ISO 639-1 language code. If empty, the description will be applied to all users for whose language there is no dedicated description.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - description: Optional[str] = None, - language_code: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - description=description, language_code=language_code, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/methods/set_my_name.py b/env/Lib/site-packages/aiogram/methods/set_my_name.py deleted file mode 100644 index 3633fdc..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_my_name.py +++ /dev/null @@ -1,36 +0,0 @@ -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramMethod - - -class SetMyName(TelegramMethod[bool]): - """ - Use this method to change the bot's name. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setmyname - """ - - __returning__ = bool - __api_method__ = "setMyName" - - name: Optional[str] = None - """New bot name; 0-64 characters. Pass an empty string to remove the dedicated name for the given language.""" - language_code: Optional[str] = None - """A two-letter ISO 639-1 language code. If empty, the name will be shown to all users for whose language there is no dedicated name.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - name: Optional[str] = None, - language_code: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(name=name, language_code=language_code, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/set_my_short_description.py b/env/Lib/site-packages/aiogram/methods/set_my_short_description.py deleted file mode 100644 index 22fa581..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_my_short_description.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramMethod - - -class SetMyShortDescription(TelegramMethod[bool]): - """ - Use this method to change the bot's short description, which is shown on the bot's profile page and is sent together with the link when users share the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setmyshortdescription - """ - - __returning__ = bool - __api_method__ = "setMyShortDescription" - - short_description: Optional[str] = None - """New short description for the bot; 0-120 characters. Pass an empty string to remove the dedicated short description for the given language.""" - language_code: Optional[str] = None - """A two-letter ISO 639-1 language code. If empty, the short description will be applied to all users for whose language there is no dedicated short description.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - short_description: Optional[str] = None, - language_code: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - short_description=short_description, - language_code=language_code, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/set_passport_data_errors.py b/env/Lib/site-packages/aiogram/methods/set_passport_data_errors.py deleted file mode 100644 index 0ad7e8b..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_passport_data_errors.py +++ /dev/null @@ -1,74 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Union - -from ..types import ( - PassportElementErrorDataField, - PassportElementErrorFile, - PassportElementErrorFiles, - PassportElementErrorFrontSide, - PassportElementErrorReverseSide, - PassportElementErrorSelfie, - PassportElementErrorTranslationFile, - PassportElementErrorTranslationFiles, - PassportElementErrorUnspecified, -) -from .base import TelegramMethod - - -class SetPassportDataErrors(TelegramMethod[bool]): - """ - Informs a user that some of the Telegram Passport elements they provided contains errors. The user will not be able to re-submit their Passport to you until the errors are fixed (the contents of the field for which you returned the error must change). Returns :code:`True` on success. - Use this if the data submitted by the user doesn't satisfy the standards your service requires for any reason. For example, if a birthday date seems invalid, a submitted document is blurry, a scan shows evidence of tampering, etc. Supply some details in the error message to make sure the user knows how to correct the issues. - - Source: https://core.telegram.org/bots/api#setpassportdataerrors - """ - - __returning__ = bool - __api_method__ = "setPassportDataErrors" - - user_id: int - """User identifier""" - errors: List[ - Union[ - PassportElementErrorDataField, - PassportElementErrorFrontSide, - PassportElementErrorReverseSide, - PassportElementErrorSelfie, - PassportElementErrorFile, - PassportElementErrorFiles, - PassportElementErrorTranslationFile, - PassportElementErrorTranslationFiles, - PassportElementErrorUnspecified, - ] - ] - """A JSON-serialized array describing the errors""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - user_id: int, - errors: List[ - Union[ - PassportElementErrorDataField, - PassportElementErrorFrontSide, - PassportElementErrorReverseSide, - PassportElementErrorSelfie, - PassportElementErrorFile, - PassportElementErrorFiles, - PassportElementErrorTranslationFile, - PassportElementErrorTranslationFiles, - PassportElementErrorUnspecified, - ] - ], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(user_id=user_id, errors=errors, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/set_sticker_emoji_list.py b/env/Lib/site-packages/aiogram/methods/set_sticker_emoji_list.py deleted file mode 100644 index ac268c1..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_sticker_emoji_list.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List - -from .base import TelegramMethod - - -class SetStickerEmojiList(TelegramMethod[bool]): - """ - Use this method to change the list of emoji assigned to a regular or custom emoji sticker. The sticker must belong to a sticker set created by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setstickeremojilist - """ - - __returning__ = bool - __api_method__ = "setStickerEmojiList" - - sticker: str - """File identifier of the sticker""" - emoji_list: List[str] - """A JSON-serialized list of 1-20 emoji associated with the sticker""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, sticker: str, emoji_list: List[str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(sticker=sticker, emoji_list=emoji_list, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/set_sticker_keywords.py b/env/Lib/site-packages/aiogram/methods/set_sticker_keywords.py deleted file mode 100644 index 49e68f8..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_sticker_keywords.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from .base import TelegramMethod - - -class SetStickerKeywords(TelegramMethod[bool]): - """ - Use this method to change search keywords assigned to a regular or custom emoji sticker. The sticker must belong to a sticker set created by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setstickerkeywords - """ - - __returning__ = bool - __api_method__ = "setStickerKeywords" - - sticker: str - """File identifier of the sticker""" - keywords: Optional[List[str]] = None - """A JSON-serialized list of 0-20 search keywords for the sticker with total length of up to 64 characters""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - sticker: str, - keywords: Optional[List[str]] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(sticker=sticker, keywords=keywords, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/set_sticker_mask_position.py b/env/Lib/site-packages/aiogram/methods/set_sticker_mask_position.py deleted file mode 100644 index 617e48b..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_sticker_mask_position.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from ..types import MaskPosition -from .base import TelegramMethod - - -class SetStickerMaskPosition(TelegramMethod[bool]): - """ - Use this method to change the `mask position `_ of a mask sticker. The sticker must belong to a sticker set that was created by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setstickermaskposition - """ - - __returning__ = bool - __api_method__ = "setStickerMaskPosition" - - sticker: str - """File identifier of the sticker""" - mask_position: Optional[MaskPosition] = None - """A JSON-serialized object with the position where the mask should be placed on faces. Omit the parameter to remove the mask position.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - sticker: str, - mask_position: Optional[MaskPosition] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(sticker=sticker, mask_position=mask_position, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/set_sticker_position_in_set.py b/env/Lib/site-packages/aiogram/methods/set_sticker_position_in_set.py deleted file mode 100644 index 8d30eab..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_sticker_position_in_set.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramMethod - - -class SetStickerPositionInSet(TelegramMethod[bool]): - """ - Use this method to move a sticker in a set created by the bot to a specific position. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setstickerpositioninset - """ - - __returning__ = bool - __api_method__ = "setStickerPositionInSet" - - sticker: str - """File identifier of the sticker""" - position: int - """New sticker position in the set, zero-based""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, sticker: str, position: int, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(sticker=sticker, position=position, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/set_sticker_set_thumbnail.py b/env/Lib/site-packages/aiogram/methods/set_sticker_set_thumbnail.py deleted file mode 100644 index ef83f70..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_sticker_set_thumbnail.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import InputFile -from .base import TelegramMethod - - -class SetStickerSetThumbnail(TelegramMethod[bool]): - """ - Use this method to set the thumbnail of a regular or mask sticker set. The format of the thumbnail file must match the format of the stickers in the set. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setstickersetthumbnail - """ - - __returning__ = bool - __api_method__ = "setStickerSetThumbnail" - - name: str - """Sticker set name""" - user_id: int - """User identifier of the sticker set owner""" - format: str - """Format of the thumbnail, must be one of 'static' for a **.WEBP** or **.PNG** image, 'animated' for a **.TGS** animation, or 'video' for a **WEBM** video""" - thumbnail: Optional[Union[InputFile, str]] = None - """A **.WEBP** or **.PNG** image with the thumbnail, must be up to 128 kilobytes in size and have a width and height of exactly 100px, or a **.TGS** animation with a thumbnail up to 32 kilobytes in size (see `https://core.telegram.org/stickers#animation-requirements `_`https://core.telegram.org/stickers#animation-requirements `_ for animated sticker technical requirements), or a **WEBM** video with the thumbnail up to 32 kilobytes in size; see `https://core.telegram.org/stickers#video-requirements `_`https://core.telegram.org/stickers#video-requirements `_ for video sticker technical requirements. Pass a *file_id* as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » `. Animated and video sticker set thumbnails can't be uploaded via HTTP URL. If omitted, then the thumbnail is dropped and the first sticker is used as the thumbnail.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - name: str, - user_id: int, - format: str, - thumbnail: Optional[Union[InputFile, str]] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - name=name, user_id=user_id, format=format, thumbnail=thumbnail, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/methods/set_sticker_set_title.py b/env/Lib/site-packages/aiogram/methods/set_sticker_set_title.py deleted file mode 100644 index ec25473..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_sticker_set_title.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramMethod - - -class SetStickerSetTitle(TelegramMethod[bool]): - """ - Use this method to set the title of a created sticker set. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setstickersettitle - """ - - __returning__ = bool - __api_method__ = "setStickerSetTitle" - - name: str - """Sticker set name""" - title: str - """Sticker set title, 1-64 characters""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, name: str, title: str, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(name=name, title=title, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/set_webhook.py b/env/Lib/site-packages/aiogram/methods/set_webhook.py deleted file mode 100644 index 998e51b..0000000 --- a/env/Lib/site-packages/aiogram/methods/set_webhook.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from ..types import InputFile -from .base import TelegramMethod - - -class SetWebhook(TelegramMethod[bool]): - """ - Use this method to specify a URL and receive incoming updates via an outgoing webhook. Whenever there is an update for the bot, we will send an HTTPS POST request to the specified URL, containing a JSON-serialized :class:`aiogram.types.update.Update`. In case of an unsuccessful request, we will give up after a reasonable amount of attempts. Returns :code:`True` on success. - If you'd like to make sure that the webhook was set by you, you can specify secret data in the parameter *secret_token*. If specified, the request will contain a header 'X-Telegram-Bot-Api-Secret-Token' with the secret token as content. - - **Notes** - - **1.** You will not be able to receive updates using :class:`aiogram.methods.get_updates.GetUpdates` for as long as an outgoing webhook is set up. - - **2.** To use a self-signed certificate, you need to upload your `public key certificate `_ using *certificate* parameter. Please upload as InputFile, sending a String will not work. - - **3.** Ports currently supported *for webhooks*: **443, 80, 88, 8443**. - If you're having any trouble setting up webhooks, please check out this `amazing guide to webhooks `_. - - Source: https://core.telegram.org/bots/api#setwebhook - """ - - __returning__ = bool - __api_method__ = "setWebhook" - - url: str - """HTTPS URL to send updates to. Use an empty string to remove webhook integration""" - certificate: Optional[InputFile] = None - """Upload your public key certificate so that the root certificate in use can be checked. See our `self-signed guide `_ for details.""" - ip_address: Optional[str] = None - """The fixed IP address which will be used to send webhook requests instead of the IP address resolved through DNS""" - max_connections: Optional[int] = None - """The maximum allowed number of simultaneous HTTPS connections to the webhook for update delivery, 1-100. Defaults to *40*. Use lower values to limit the load on your bot's server, and higher values to increase your bot's throughput.""" - allowed_updates: Optional[List[str]] = None - """A JSON-serialized list of the update types you want your bot to receive. For example, specify :code:`["message", "edited_channel_post", "callback_query"]` to only receive updates of these types. See :class:`aiogram.types.update.Update` for a complete list of available update types. Specify an empty list to receive all update types except *chat_member*, *message_reaction*, and *message_reaction_count* (default). If not specified, the previous setting will be used.""" - drop_pending_updates: Optional[bool] = None - """Pass :code:`True` to drop all pending updates""" - secret_token: Optional[str] = None - """A secret token to be sent in a header 'X-Telegram-Bot-Api-Secret-Token' in every webhook request, 1-256 characters. Only characters :code:`A-Z`, :code:`a-z`, :code:`0-9`, :code:`_` and :code:`-` are allowed. The header is useful to ensure that the request comes from a webhook set by you.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - url: str, - certificate: Optional[InputFile] = None, - ip_address: Optional[str] = None, - max_connections: Optional[int] = None, - allowed_updates: Optional[List[str]] = None, - drop_pending_updates: Optional[bool] = None, - secret_token: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - url=url, - certificate=certificate, - ip_address=ip_address, - max_connections=max_connections, - allowed_updates=allowed_updates, - drop_pending_updates=drop_pending_updates, - secret_token=secret_token, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/stop_message_live_location.py b/env/Lib/site-packages/aiogram/methods/stop_message_live_location.py deleted file mode 100644 index f5fe335..0000000 --- a/env/Lib/site-packages/aiogram/methods/stop_message_live_location.py +++ /dev/null @@ -1,55 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import InlineKeyboardMarkup, Message -from .base import TelegramMethod - - -class StopMessageLiveLocation(TelegramMethod[Union[Message, bool]]): - """ - Use this method to stop updating a live location message before *live_period* expires. On success, if the message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. - - Source: https://core.telegram.org/bots/api#stopmessagelivelocation - """ - - __returning__ = Union[Message, bool] - __api_method__ = "stopMessageLiveLocation" - - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message to be edited was sent""" - chat_id: Optional[Union[int, str]] = None - """Required if *inline_message_id* is not specified. Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - message_id: Optional[int] = None - """Required if *inline_message_id* is not specified. Identifier of the message with live location to stop""" - inline_message_id: Optional[str] = None - """Required if *chat_id* and *message_id* are not specified. Identifier of the inline message""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """A JSON-serialized object for a new `inline keyboard `_.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - business_connection_id=business_connection_id, - chat_id=chat_id, - message_id=message_id, - inline_message_id=inline_message_id, - reply_markup=reply_markup, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/stop_poll.py b/env/Lib/site-packages/aiogram/methods/stop_poll.py deleted file mode 100644 index 8393a52..0000000 --- a/env/Lib/site-packages/aiogram/methods/stop_poll.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..types import InlineKeyboardMarkup, Poll -from .base import TelegramMethod - - -class StopPoll(TelegramMethod[Poll]): - """ - Use this method to stop a poll which was sent by the bot. On success, the stopped :class:`aiogram.types.poll.Poll` is returned. - - Source: https://core.telegram.org/bots/api#stoppoll - """ - - __returning__ = Poll - __api_method__ = "stopPoll" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - message_id: int - """Identifier of the original message with the poll""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message to be edited was sent""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """A JSON-serialized object for a new message `inline keyboard `_.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - message_id: int, - business_connection_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - message_id=message_id, - business_connection_id=business_connection_id, - reply_markup=reply_markup, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/unban_chat_member.py b/env/Lib/site-packages/aiogram/methods/unban_chat_member.py deleted file mode 100644 index 1094db5..0000000 --- a/env/Lib/site-packages/aiogram/methods/unban_chat_member.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from .base import TelegramMethod - - -class UnbanChatMember(TelegramMethod[bool]): - """ - Use this method to unban a previously banned user in a supergroup or channel. The user will **not** return to the group or channel automatically, but will be able to join via link, etc. The bot must be an administrator for this to work. By default, this method guarantees that after the call the user is not a member of the chat, but will be able to join it. So if the user is a member of the chat they will also be **removed** from the chat. If you don't want this, use the parameter *only_if_banned*. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unbanchatmember - """ - - __returning__ = bool - __api_method__ = "unbanChatMember" - - chat_id: Union[int, str] - """Unique identifier for the target group or username of the target supergroup or channel (in the format :code:`@channelusername`)""" - user_id: int - """Unique identifier of the target user""" - only_if_banned: Optional[bool] = None - """Do nothing if the user is not banned""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - user_id: int, - only_if_banned: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - user_id=user_id, - only_if_banned=only_if_banned, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/unban_chat_sender_chat.py b/env/Lib/site-packages/aiogram/methods/unban_chat_sender_chat.py deleted file mode 100644 index b981698..0000000 --- a/env/Lib/site-packages/aiogram/methods/unban_chat_sender_chat.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class UnbanChatSenderChat(TelegramMethod[bool]): - """ - Use this method to unban a previously banned channel chat in a supergroup or channel. The bot must be an administrator for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unbanchatsenderchat - """ - - __returning__ = bool - __api_method__ = "unbanChatSenderChat" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - sender_chat_id: int - """Unique identifier of the target sender chat""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - sender_chat_id: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, sender_chat_id=sender_chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/unhide_general_forum_topic.py b/env/Lib/site-packages/aiogram/methods/unhide_general_forum_topic.py deleted file mode 100644 index a9149bc..0000000 --- a/env/Lib/site-packages/aiogram/methods/unhide_general_forum_topic.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class UnhideGeneralForumTopic(TelegramMethod[bool]): - """ - Use this method to unhide the 'General' topic in a forum supergroup chat. The bot must be an administrator in the chat for this to work and must have the *can_manage_topics* administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unhidegeneralforumtopic - """ - - __returning__ = bool - __api_method__ = "unhideGeneralForumTopic" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/unpin_all_chat_messages.py b/env/Lib/site-packages/aiogram/methods/unpin_all_chat_messages.py deleted file mode 100644 index aca090f..0000000 --- a/env/Lib/site-packages/aiogram/methods/unpin_all_chat_messages.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class UnpinAllChatMessages(TelegramMethod[bool]): - """ - Use this method to clear the list of pinned messages in a chat. If the chat is not a private chat, the bot must be an administrator in the chat for this to work and must have the 'can_pin_messages' administrator right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unpinallchatmessages - """ - - __returning__ = bool - __api_method__ = "unpinAllChatMessages" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/unpin_all_forum_topic_messages.py b/env/Lib/site-packages/aiogram/methods/unpin_all_forum_topic_messages.py deleted file mode 100644 index f1350ec..0000000 --- a/env/Lib/site-packages/aiogram/methods/unpin_all_forum_topic_messages.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramMethod - - -class UnpinAllForumTopicMessages(TelegramMethod[bool]): - """ - Use this method to clear the list of pinned messages in a forum topic. The bot must be an administrator in the chat for this to work and must have the *can_pin_messages* administrator right in the supergroup. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unpinallforumtopicmessages - """ - - __returning__ = bool - __api_method__ = "unpinAllForumTopicMessages" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - message_thread_id: int - """Unique identifier for the target message thread of the forum topic""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - message_thread_id: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, message_thread_id=message_thread_id, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/methods/unpin_all_general_forum_topic_messages.py b/env/Lib/site-packages/aiogram/methods/unpin_all_general_forum_topic_messages.py deleted file mode 100644 index be76c19..0000000 --- a/env/Lib/site-packages/aiogram/methods/unpin_all_general_forum_topic_messages.py +++ /dev/null @@ -1,30 +0,0 @@ -from typing import TYPE_CHECKING, Any, Union - -from aiogram.methods import TelegramMethod - - -class UnpinAllGeneralForumTopicMessages(TelegramMethod[bool]): - """ - Use this method to clear the list of pinned messages in a General forum topic. The bot must be an administrator in the chat for this to work and must have the *can_pin_messages* administrator right in the supergroup. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unpinallgeneralforumtopicmessages - """ - - __returning__ = bool - __api_method__ = "unpinAllGeneralForumTopicMessages" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat_id: Union[int, str], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/methods/unpin_chat_message.py b/env/Lib/site-packages/aiogram/methods/unpin_chat_message.py deleted file mode 100644 index 249aee6..0000000 --- a/env/Lib/site-packages/aiogram/methods/unpin_chat_message.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from .base import TelegramMethod - - -class UnpinChatMessage(TelegramMethod[bool]): - """ - Use this method to remove a message from the list of pinned messages in a chat. If the chat is not a private chat, the bot must be an administrator in the chat for this to work and must have the 'can_pin_messages' administrator right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unpinchatmessage - """ - - __returning__ = bool - __api_method__ = "unpinChatMessage" - - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`)""" - business_connection_id: Optional[str] = None - """Unique identifier of the business connection on behalf of which the message will be unpinned""" - message_id: Optional[int] = None - """Identifier of the message to unpin. Required if *business_connection_id* is specified. If not specified, the most recent pinned message (by sending date) will be unpinned.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat_id: Union[int, str], - business_connection_id: Optional[str] = None, - message_id: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat_id=chat_id, - business_connection_id=business_connection_id, - message_id=message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/methods/upload_sticker_file.py b/env/Lib/site-packages/aiogram/methods/upload_sticker_file.py deleted file mode 100644 index 600f83a..0000000 --- a/env/Lib/site-packages/aiogram/methods/upload_sticker_file.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from ..types import File, InputFile -from .base import TelegramMethod - - -class UploadStickerFile(TelegramMethod[File]): - """ - Use this method to upload a file with a sticker for later use in the :class:`aiogram.methods.create_new_sticker_set.CreateNewStickerSet`, :class:`aiogram.methods.add_sticker_to_set.AddStickerToSet`, or :class:`aiogram.methods.replace_sticker_in_set.ReplaceStickerInSet` methods (the file can be used multiple times). Returns the uploaded :class:`aiogram.types.file.File` on success. - - Source: https://core.telegram.org/bots/api#uploadstickerfile - """ - - __returning__ = File - __api_method__ = "uploadStickerFile" - - user_id: int - """User identifier of sticker file owner""" - sticker: InputFile - """A file with the sticker in .WEBP, .PNG, .TGS, or .WEBM format. See `https://core.telegram.org/stickers `_`https://core.telegram.org/stickers `_ for technical requirements. :ref:`More information on Sending Files » `""" - sticker_format: str - """Format of the sticker, must be one of 'static', 'animated', 'video'""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - user_id: int, - sticker: InputFile, - sticker_format: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - user_id=user_id, - sticker=sticker, - sticker_format=sticker_format, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/py.typed b/env/Lib/site-packages/aiogram/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/env/Lib/site-packages/aiogram/types/__init__.py b/env/Lib/site-packages/aiogram/types/__init__.py deleted file mode 100644 index 97442b3..0000000 --- a/env/Lib/site-packages/aiogram/types/__init__.py +++ /dev/null @@ -1,490 +0,0 @@ -from typing import List, Literal, Optional, Union - -from .animation import Animation -from .audio import Audio -from .background_fill import BackgroundFill -from .background_fill_freeform_gradient import BackgroundFillFreeformGradient -from .background_fill_gradient import BackgroundFillGradient -from .background_fill_solid import BackgroundFillSolid -from .background_type import BackgroundType -from .background_type_chat_theme import BackgroundTypeChatTheme -from .background_type_fill import BackgroundTypeFill -from .background_type_pattern import BackgroundTypePattern -from .background_type_wallpaper import BackgroundTypeWallpaper -from .base import UNSET_PARSE_MODE, TelegramObject -from .birthdate import Birthdate -from .bot_command import BotCommand -from .bot_command_scope import BotCommandScope -from .bot_command_scope_all_chat_administrators import ( - BotCommandScopeAllChatAdministrators, -) -from .bot_command_scope_all_group_chats import BotCommandScopeAllGroupChats -from .bot_command_scope_all_private_chats import BotCommandScopeAllPrivateChats -from .bot_command_scope_chat import BotCommandScopeChat -from .bot_command_scope_chat_administrators import BotCommandScopeChatAdministrators -from .bot_command_scope_chat_member import BotCommandScopeChatMember -from .bot_command_scope_default import BotCommandScopeDefault -from .bot_description import BotDescription -from .bot_name import BotName -from .bot_short_description import BotShortDescription -from .business_connection import BusinessConnection -from .business_intro import BusinessIntro -from .business_location import BusinessLocation -from .business_messages_deleted import BusinessMessagesDeleted -from .business_opening_hours import BusinessOpeningHours -from .business_opening_hours_interval import BusinessOpeningHoursInterval -from .callback_game import CallbackGame -from .callback_query import CallbackQuery -from .chat import Chat -from .chat_administrator_rights import ChatAdministratorRights -from .chat_background import ChatBackground -from .chat_boost import ChatBoost -from .chat_boost_added import ChatBoostAdded -from .chat_boost_removed import ChatBoostRemoved -from .chat_boost_source import ChatBoostSource -from .chat_boost_source_gift_code import ChatBoostSourceGiftCode -from .chat_boost_source_giveaway import ChatBoostSourceGiveaway -from .chat_boost_source_premium import ChatBoostSourcePremium -from .chat_boost_updated import ChatBoostUpdated -from .chat_full_info import ChatFullInfo -from .chat_invite_link import ChatInviteLink -from .chat_join_request import ChatJoinRequest -from .chat_location import ChatLocation -from .chat_member import ChatMember -from .chat_member_administrator import ChatMemberAdministrator -from .chat_member_banned import ChatMemberBanned -from .chat_member_left import ChatMemberLeft -from .chat_member_member import ChatMemberMember -from .chat_member_owner import ChatMemberOwner -from .chat_member_restricted import ChatMemberRestricted -from .chat_member_updated import ChatMemberUpdated -from .chat_permissions import ChatPermissions -from .chat_photo import ChatPhoto -from .chat_shared import ChatShared -from .chosen_inline_result import ChosenInlineResult -from .contact import Contact -from .custom import DateTime -from .dice import Dice -from .document import Document -from .downloadable import Downloadable -from .encrypted_credentials import EncryptedCredentials -from .encrypted_passport_element import EncryptedPassportElement -from .error_event import ErrorEvent -from .external_reply_info import ExternalReplyInfo -from .file import File -from .force_reply import ForceReply -from .forum_topic import ForumTopic -from .forum_topic_closed import ForumTopicClosed -from .forum_topic_created import ForumTopicCreated -from .forum_topic_edited import ForumTopicEdited -from .forum_topic_reopened import ForumTopicReopened -from .game import Game -from .game_high_score import GameHighScore -from .general_forum_topic_hidden import GeneralForumTopicHidden -from .general_forum_topic_unhidden import GeneralForumTopicUnhidden -from .giveaway import Giveaway -from .giveaway_completed import GiveawayCompleted -from .giveaway_created import GiveawayCreated -from .giveaway_winners import GiveawayWinners -from .inaccessible_message import InaccessibleMessage -from .inline_keyboard_button import InlineKeyboardButton -from .inline_keyboard_markup import InlineKeyboardMarkup -from .inline_query import InlineQuery -from .inline_query_result import InlineQueryResult -from .inline_query_result_article import InlineQueryResultArticle -from .inline_query_result_audio import InlineQueryResultAudio -from .inline_query_result_cached_audio import InlineQueryResultCachedAudio -from .inline_query_result_cached_document import InlineQueryResultCachedDocument -from .inline_query_result_cached_gif import InlineQueryResultCachedGif -from .inline_query_result_cached_mpeg4_gif import InlineQueryResultCachedMpeg4Gif -from .inline_query_result_cached_photo import InlineQueryResultCachedPhoto -from .inline_query_result_cached_sticker import InlineQueryResultCachedSticker -from .inline_query_result_cached_video import InlineQueryResultCachedVideo -from .inline_query_result_cached_voice import InlineQueryResultCachedVoice -from .inline_query_result_contact import InlineQueryResultContact -from .inline_query_result_document import InlineQueryResultDocument -from .inline_query_result_game import InlineQueryResultGame -from .inline_query_result_gif import InlineQueryResultGif -from .inline_query_result_location import InlineQueryResultLocation -from .inline_query_result_mpeg4_gif import InlineQueryResultMpeg4Gif -from .inline_query_result_photo import InlineQueryResultPhoto -from .inline_query_result_venue import InlineQueryResultVenue -from .inline_query_result_video import InlineQueryResultVideo -from .inline_query_result_voice import InlineQueryResultVoice -from .inline_query_results_button import InlineQueryResultsButton -from .input_contact_message_content import InputContactMessageContent -from .input_file import BufferedInputFile, FSInputFile, InputFile, URLInputFile -from .input_invoice_message_content import InputInvoiceMessageContent -from .input_location_message_content import InputLocationMessageContent -from .input_media import InputMedia -from .input_media_animation import InputMediaAnimation -from .input_media_audio import InputMediaAudio -from .input_media_document import InputMediaDocument -from .input_media_photo import InputMediaPhoto -from .input_media_video import InputMediaVideo -from .input_message_content import InputMessageContent -from .input_paid_media import InputPaidMedia -from .input_paid_media_photo import InputPaidMediaPhoto -from .input_paid_media_video import InputPaidMediaVideo -from .input_poll_option import InputPollOption -from .input_sticker import InputSticker -from .input_text_message_content import InputTextMessageContent -from .input_venue_message_content import InputVenueMessageContent -from .invoice import Invoice -from .keyboard_button import KeyboardButton -from .keyboard_button_poll_type import KeyboardButtonPollType -from .keyboard_button_request_chat import KeyboardButtonRequestChat -from .keyboard_button_request_user import KeyboardButtonRequestUser -from .keyboard_button_request_users import KeyboardButtonRequestUsers -from .labeled_price import LabeledPrice -from .link_preview_options import LinkPreviewOptions -from .location import Location -from .login_url import LoginUrl -from .mask_position import MaskPosition -from .maybe_inaccessible_message import MaybeInaccessibleMessage -from .menu_button import MenuButton -from .menu_button_commands import MenuButtonCommands -from .menu_button_default import MenuButtonDefault -from .menu_button_web_app import MenuButtonWebApp -from .message import ContentType, Message -from .message_auto_delete_timer_changed import MessageAutoDeleteTimerChanged -from .message_entity import MessageEntity -from .message_id import MessageId -from .message_origin import MessageOrigin -from .message_origin_channel import MessageOriginChannel -from .message_origin_chat import MessageOriginChat -from .message_origin_hidden_user import MessageOriginHiddenUser -from .message_origin_user import MessageOriginUser -from .message_reaction_count_updated import MessageReactionCountUpdated -from .message_reaction_updated import MessageReactionUpdated -from .order_info import OrderInfo -from .paid_media import PaidMedia -from .paid_media_info import PaidMediaInfo -from .paid_media_photo import PaidMediaPhoto -from .paid_media_preview import PaidMediaPreview -from .paid_media_video import PaidMediaVideo -from .passport_data import PassportData -from .passport_element_error import PassportElementError -from .passport_element_error_data_field import PassportElementErrorDataField -from .passport_element_error_file import PassportElementErrorFile -from .passport_element_error_files import PassportElementErrorFiles -from .passport_element_error_front_side import PassportElementErrorFrontSide -from .passport_element_error_reverse_side import PassportElementErrorReverseSide -from .passport_element_error_selfie import PassportElementErrorSelfie -from .passport_element_error_translation_file import PassportElementErrorTranslationFile -from .passport_element_error_translation_files import ( - PassportElementErrorTranslationFiles, -) -from .passport_element_error_unspecified import PassportElementErrorUnspecified -from .passport_file import PassportFile -from .photo_size import PhotoSize -from .poll import Poll -from .poll_answer import PollAnswer -from .poll_option import PollOption -from .pre_checkout_query import PreCheckoutQuery -from .proximity_alert_triggered import ProximityAlertTriggered -from .reaction_count import ReactionCount -from .reaction_type import ReactionType -from .reaction_type_custom_emoji import ReactionTypeCustomEmoji -from .reaction_type_emoji import ReactionTypeEmoji -from .reaction_type_paid import ReactionTypePaid -from .refunded_payment import RefundedPayment -from .reply_keyboard_markup import ReplyKeyboardMarkup -from .reply_keyboard_remove import ReplyKeyboardRemove -from .reply_parameters import ReplyParameters -from .response_parameters import ResponseParameters -from .revenue_withdrawal_state import RevenueWithdrawalState -from .revenue_withdrawal_state_failed import RevenueWithdrawalStateFailed -from .revenue_withdrawal_state_pending import RevenueWithdrawalStatePending -from .revenue_withdrawal_state_succeeded import RevenueWithdrawalStateSucceeded -from .sent_web_app_message import SentWebAppMessage -from .shared_user import SharedUser -from .shipping_address import ShippingAddress -from .shipping_option import ShippingOption -from .shipping_query import ShippingQuery -from .star_transaction import StarTransaction -from .star_transactions import StarTransactions -from .sticker import Sticker -from .sticker_set import StickerSet -from .story import Story -from .successful_payment import SuccessfulPayment -from .switch_inline_query_chosen_chat import SwitchInlineQueryChosenChat -from .text_quote import TextQuote -from .transaction_partner import TransactionPartner -from .transaction_partner_fragment import TransactionPartnerFragment -from .transaction_partner_other import TransactionPartnerOther -from .transaction_partner_telegram_ads import TransactionPartnerTelegramAds -from .transaction_partner_user import TransactionPartnerUser -from .update import Update -from .user import User -from .user_chat_boosts import UserChatBoosts -from .user_profile_photos import UserProfilePhotos -from .user_shared import UserShared -from .users_shared import UsersShared -from .venue import Venue -from .video import Video -from .video_chat_ended import VideoChatEnded -from .video_chat_participants_invited import VideoChatParticipantsInvited -from .video_chat_scheduled import VideoChatScheduled -from .video_chat_started import VideoChatStarted -from .video_note import VideoNote -from .voice import Voice -from .web_app_data import WebAppData -from .web_app_info import WebAppInfo -from .webhook_info import WebhookInfo -from .write_access_allowed import WriteAccessAllowed - -__all__ = ( - "Animation", - "Audio", - "BackgroundFill", - "BackgroundFillFreeformGradient", - "BackgroundFillGradient", - "BackgroundFillSolid", - "BackgroundType", - "BackgroundTypeChatTheme", - "BackgroundTypeFill", - "BackgroundTypePattern", - "BackgroundTypeWallpaper", - "Birthdate", - "BotCommand", - "BotCommandScope", - "BotCommandScopeAllChatAdministrators", - "BotCommandScopeAllGroupChats", - "BotCommandScopeAllPrivateChats", - "BotCommandScopeChat", - "BotCommandScopeChatAdministrators", - "BotCommandScopeChatMember", - "BotCommandScopeDefault", - "BotDescription", - "BotName", - "BotShortDescription", - "BufferedInputFile", - "BusinessConnection", - "BusinessIntro", - "BusinessLocation", - "BusinessMessagesDeleted", - "BusinessOpeningHours", - "BusinessOpeningHoursInterval", - "CallbackGame", - "CallbackQuery", - "Chat", - "ChatAdministratorRights", - "ChatBackground", - "ChatBoost", - "ChatBoostAdded", - "ChatBoostRemoved", - "ChatBoostSource", - "ChatBoostSourceGiftCode", - "ChatBoostSourceGiveaway", - "ChatBoostSourcePremium", - "ChatBoostUpdated", - "ChatFullInfo", - "ChatInviteLink", - "ChatJoinRequest", - "ChatLocation", - "ChatMember", - "ChatMemberAdministrator", - "ChatMemberBanned", - "ChatMemberLeft", - "ChatMemberMember", - "ChatMemberOwner", - "ChatMemberRestricted", - "ChatMemberUpdated", - "ChatPermissions", - "ChatPhoto", - "ChatShared", - "ChosenInlineResult", - "Contact", - "ContentType", - "DateTime", - "Dice", - "Document", - "Downloadable", - "EncryptedCredentials", - "EncryptedPassportElement", - "ErrorEvent", - "ExternalReplyInfo", - "FSInputFile", - "File", - "ForceReply", - "ForumTopic", - "ForumTopicClosed", - "ForumTopicCreated", - "ForumTopicEdited", - "ForumTopicReopened", - "Game", - "GameHighScore", - "GeneralForumTopicHidden", - "GeneralForumTopicUnhidden", - "Giveaway", - "GiveawayCompleted", - "GiveawayCreated", - "GiveawayWinners", - "InaccessibleMessage", - "InlineKeyboardButton", - "InlineKeyboardMarkup", - "InlineQuery", - "InlineQueryResult", - "InlineQueryResultArticle", - "InlineQueryResultAudio", - "InlineQueryResultCachedAudio", - "InlineQueryResultCachedDocument", - "InlineQueryResultCachedGif", - "InlineQueryResultCachedMpeg4Gif", - "InlineQueryResultCachedPhoto", - "InlineQueryResultCachedSticker", - "InlineQueryResultCachedVideo", - "InlineQueryResultCachedVoice", - "InlineQueryResultContact", - "InlineQueryResultDocument", - "InlineQueryResultGame", - "InlineQueryResultGif", - "InlineQueryResultLocation", - "InlineQueryResultMpeg4Gif", - "InlineQueryResultPhoto", - "InlineQueryResultVenue", - "InlineQueryResultVideo", - "InlineQueryResultVoice", - "InlineQueryResultsButton", - "InputContactMessageContent", - "InputFile", - "InputInvoiceMessageContent", - "InputLocationMessageContent", - "InputMedia", - "InputMediaAnimation", - "InputMediaAudio", - "InputMediaDocument", - "InputMediaPhoto", - "InputMediaVideo", - "InputMessageContent", - "InputPaidMedia", - "InputPaidMediaPhoto", - "InputPaidMediaVideo", - "InputPollOption", - "InputSticker", - "InputTextMessageContent", - "InputVenueMessageContent", - "Invoice", - "KeyboardButton", - "KeyboardButtonPollType", - "KeyboardButtonRequestChat", - "KeyboardButtonRequestUser", - "KeyboardButtonRequestUsers", - "LabeledPrice", - "LinkPreviewOptions", - "Location", - "LoginUrl", - "MaskPosition", - "MaybeInaccessibleMessage", - "MenuButton", - "MenuButtonCommands", - "MenuButtonDefault", - "MenuButtonWebApp", - "Message", - "MessageAutoDeleteTimerChanged", - "MessageEntity", - "MessageId", - "MessageOrigin", - "MessageOriginChannel", - "MessageOriginChat", - "MessageOriginHiddenUser", - "MessageOriginUser", - "MessageReactionCountUpdated", - "MessageReactionUpdated", - "OrderInfo", - "PaidMedia", - "PaidMediaInfo", - "PaidMediaPhoto", - "PaidMediaPreview", - "PaidMediaVideo", - "PassportData", - "PassportElementError", - "PassportElementErrorDataField", - "PassportElementErrorFile", - "PassportElementErrorFiles", - "PassportElementErrorFrontSide", - "PassportElementErrorReverseSide", - "PassportElementErrorSelfie", - "PassportElementErrorTranslationFile", - "PassportElementErrorTranslationFiles", - "PassportElementErrorUnspecified", - "PassportFile", - "PhotoSize", - "Poll", - "PollAnswer", - "PollOption", - "PreCheckoutQuery", - "ProximityAlertTriggered", - "ReactionCount", - "ReactionType", - "ReactionTypeCustomEmoji", - "ReactionTypeEmoji", - "ReactionTypePaid", - "RefundedPayment", - "ReplyKeyboardMarkup", - "ReplyKeyboardRemove", - "ReplyParameters", - "ResponseParameters", - "RevenueWithdrawalState", - "RevenueWithdrawalStateFailed", - "RevenueWithdrawalStatePending", - "RevenueWithdrawalStateSucceeded", - "SentWebAppMessage", - "SharedUser", - "ShippingAddress", - "ShippingOption", - "ShippingQuery", - "StarTransaction", - "StarTransactions", - "Sticker", - "StickerSet", - "Story", - "SuccessfulPayment", - "SwitchInlineQueryChosenChat", - "TelegramObject", - "TextQuote", - "TransactionPartner", - "TransactionPartnerFragment", - "TransactionPartnerOther", - "TransactionPartnerTelegramAds", - "TransactionPartnerUser", - "UNSET_PARSE_MODE", - "URLInputFile", - "Update", - "User", - "UserChatBoosts", - "UserProfilePhotos", - "UserShared", - "UsersShared", - "Venue", - "Video", - "VideoChatEnded", - "VideoChatParticipantsInvited", - "VideoChatScheduled", - "VideoChatStarted", - "VideoNote", - "Voice", - "WebAppData", - "WebAppInfo", - "WebhookInfo", - "WriteAccessAllowed", -) - -# Load typing forward refs for every TelegramObject -for _entity_name in __all__: - _entity = globals()[_entity_name] - if not hasattr(_entity, "model_rebuild"): - continue - _entity.model_rebuild( - _types_namespace={ - "List": List, - "Optional": Optional, - "Union": Union, - "Literal": Literal, - **{k: v for k, v in globals().items() if k in __all__}, - } - ) - -del _entity -del _entity_name diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index a2b9a113fe31a23eef63758b87fc3a8abcd62471..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20805 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/animation.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/animation.cpython-311.pyc deleted file mode 100644 index a9479f97bc8b6d07db2ceaf020f06322ee3788ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2127 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/background_fill_freeform_gradient.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/background_fill_freeform_gradient.cpython-311.pyc deleted file mode 100644 index f375c71575837b836104ce7aaff64c76a91319eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1671 zcma)6&2Jk;6rb5$uRmg^G$BPTAKC(?GN^WixDW-@k|ri3ijY!-SXqoVJ7Z_bewdkc zz*P=8R3bfgkb#q?XRt04215hO*V2v=3o(+8;Bx`eH36D2b!$~x~&I>ZD2$-s{6UXv`vgO z)Iij@ifE3Rw{?W>z#0rYPt7${%|B4vsv#?vKX`Y6%)h-bzr3{Ckov{2CyfiN_4;tK|9t-0uKb0&Pmp7QTewe7`3CposLshFi)V1ObC$@MLJ23-= z7T{#DEyjCRz=Uwx%<@9eVU`PewNmPME$VWY%~~6A+!3?&x*Ks;ic|1EN*|{|0UWZB3jr@puqI#~TmbSlz5$1ECWn*Tu&WSNAMGcKlvNdwN8&u!*y5AJ|5dzmdpuI7UzNdv4fHmsPgO=3!gWxHTKHS^vlb) zUi@JTK5D-H&X5^w%gYB~gQ^t;OXviQ5LqH5h-lYWe3_7syN*AU2k)7O^z#th86#>~DE-pfCk zpkuieoJ^uu7jTlFC<2d0sEMXe^-rDKo2m_k1vGQ=o9XLINio$bq36#e6DeCplT%4$ z#CFur|KW>iB!hTHD1RzTezjVVCUgn3)d+$LRXzaxFTKMHnI%82xYUut^HE`LP{ud; sY1k^DMGr`#V~qFFYyJP4_s}c-@tK%UV};#6(_0_@mP&sA7kL`mpB~`7;s5{u diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/background_fill_gradient.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/background_fill_gradient.cpython-311.pyc deleted file mode 100644 index 2444fa83fd0e45011c765997128d42e15f843bbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1644 zcma)6&2Jk;6rb6h-Sv0CNt!k#WZO~|r>cG60E#LEO@e_|7E)RvRu-d;XY4Ln@0!^) zkje)mRU$}$xS&>$BPv3@^H*?iq#Razs>G?cMd1KF@y1_CAV`d7-o7{Q?elxT_p^V> z=Q9Y_FF*X+{9Z%oH)%{3*u!;r10D|$Lkzp9jV;_(ETyelDn?9Us!Q6MrD3F?Dq`e5 zVj9;TsR%uWGg_9;^i5PUo=UT%#`)VHythHu-riWd`A)4Gt8aQcv2n`@xv<@*SjOPE zaKmnFw}jvI*jtY4Hb$97GCwvB_dxjqO5@1F3|Yz@DA7`xViB$}<=pfgt~2#ISZTx! z(8)1fJErSnJtdZ*F=G!i^<*AKxB=}MOox-=X_jW0W^NZXG0WaBSeae)8Md;UX!0!O z;xi}vs0y1o+zamo857p+yWHHGHflP7X`8Kah}nd`%b8)^rr#9}zG~hL!%nbTsWg1S z%OQ6;1h>n+XjQiSFsRra=h9I+`Tiu?FiV`8m@x@=Iy_E?eup-E*B5aP5`=zxY!!qb z+M(ln)b?5~FJX}d_~Mu8>D^G;*rHA z`(nGk<}=4@)wjFC4t+rZz&iInso!$8>H(1XS_cMew|G#u9be9=A~6ptM+2gALUb~d za%V@(!S~!-J{{!pq>n`i3f=|rXCEbtD8Kae#+TKvst36j5~Sw~(fqk+@lv!@ik7b> zX}B2PCK)vQQj(pTGIHdQ+96~^z*fM@v)i1~I74aMXI)q7IZ8k7+V0q6P|Ezq1UUI8 z5zkQIi8rPU;1#Qm7Yh0N7jo{yw&MI4&IX63DNyPRxB@xlH^hRBN>79?9e;s<29G|8 zLbOzZq{yKQSNrR`SH4|2$Se)W3haHd5|P)UnPR`zuYF#N$g5Ften8~jC-V_mjph~x zMDBgE5RsctjJX6YXoaMJO0OiwY#Pv*3LVWZK3q8{ULHA8=3CKwH#V9 zlf2Xl=;GyMMrzNYLNR$>YDcO5hnALQ3~QMRadv`54OpuKae!&Z03D(J4<-r8(h-V9 zsSR^TWS^z3k7oJ0xCo|%Ja9lHD#kcM<-vdNC+OOSuX<*7XJrMet6slX@1x)Qz1P2$ z%LN4M&!7Kl{--1KN(sYd4w&tWz&t?|Q5>Q+c5z#CwYKi+7*UPtq0u&76C(}HA!^)5 z)MVy!i1h+af4LU5mXKq=R-&WJ^40IYoh37uXJ@{dU!0TrSJA4puLKF>Uica-8!Rgq zJ%6Re<8DO14#LpyN9xo3K-gXb<^iO}kc%mDwQG=~t5eN2m`SxycYK&d^>ZNQ5wn3e z27Hbmg96NFnCg4&sljY&u{^bDu9;g$O-%FmD{f&O-N9~g2@T&)K_1+j=TaO7^lqUiV|p zY6)1jxYw@5yj5S06H)g%!O7k5Dzs1^&q7EuG+VG0UA;dqJ*pekQ<7q%w>51md~Il0#h*#w?g&m0zagz)bEuM)ot+)5GZ5! zNj1aFrAUzy`h2o?X?^O)sm;RC4PyfK-^Rq2ab~Mn=`HjY?k#K?=U>|6DLP;-;Ix9i zIF;JPJg{hlTIk@>r&F6_CkDD48b6ZeGlK#;F_{)KwuCBUX?etLG{nd7`7DQiCL@%q zW@Y6rI<~Z+_b@CYnDv2uZy2~ebmE^VE{mbSdzU-cZ`XNV1yP|Y1dvq67;mB4#)tPy a^yS9hom$7R!fJo|wDu;`y#0VaOX`1hR){+Q diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/background_type.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/background_type.cpython-311.pyc deleted file mode 100644 index 153c9610de8eb8958a5f1e9737880bd1a5985ead..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 971 zcmb7@F^|(Q6oBodg%a*MFe7A%sS=m$6=I+W2G9YzN+(qjt`oayXd35i2h@#$AHa44 zI|#A!8yFZEQCB9mqB7mYbJAYb!qS)I<@x#fv-94|$HPMpfqZ%YZFJK?=%*d5rMWVe zJ{aeSBaSmP#RH6ygB~I7yhYp<_=AhkXLxEEIJ|L!I?Z1g#vMFw_eCZW#imcAmm)Ut zI?ldrh?V6HQ0GXX0p4(tCW|(SRj!UZjd_dGoJ|F#bC1%g z6zY{P1wXpOvJ`0p-D26OAyu|NjA$WhFx(sh|NIJ+f_5$nf@57 zYt#vQ7$M*a8oWpX=HNjhl8Yz*3J)vnVJSQWJmuE1IY>^v>Y3S@6&HL{_4@bf)qDNw z_p0ZoTFpivzkdH)`-*|kpURksIR^VT06ahxQ5>NddpOoSE!I69BdSq7GGfy+G1AZq zqQ*T$O=dpU5qbi1BwmS@n#i@DDbv+uZT;g9mdVn)%S-RSx4I(r>&ZY`w?e_VA3eir z50>*c{Gi+6X+NRsgB}Y;nMS%YHukpwdW3+K@2NV{VG@$ z#4NzZ7?=4OIDq*GQ~mIMYA}nIScO`&+%9jUHl~$(^PatpKF8i%6HT73Enhxd=hCJx z);C$q?%uZ@5WvpH!AYDjbA;bzi9q-s0?+x$k0st zJYb8?rVzbsvC#-p&gz0iti%1dp7Ks(BNbW0?}g{4FA|C}$W$aM(nwp`q*#!K@=Log zNaDxL#e5Fs1y|A_BnxL61-jK1n>MP0lK5kDhWlV;ZMF)qu5gh?m} zaZR}}Qya-x)Fxya#A^^KD})4*pJjw(>Qbx53}3WvF19{OdAGHc(lF_?x_$18loOz{ z#gb23x5AB92AA?u5BleKSl05xRFU3L>}8E9+e9spDZlmJfG@y%?m9=XS)Y`D3U+0e zLH#{M`6*O;^_%6dR=!@@t)AVfHh*~ImqmD}as9(F7@5`PKExoms)$hiBShMS#3}7Z z3RemFr0+*#k3|Sgg9$5&0C|iMKS@&Ii!e=q7O7`~bM?V;_!mG$^|Cf*EnrauOk;i$ zT$yUxHU5&?rM|;LskUc-fP!O8f4OFuK! zK3BjhnqSCkGhwqS{tvDcHH<2m(OfmFIPR)z$rAJ&Zp{p5BVzw`E4VcY;>Q&#awzg% xl&_B3^$vHyRIFwhs9eVw@1gq6(c>w)uyc6ir88J@_22qo@>k(`euTd$>K_ACna}_L diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/background_type_fill.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/background_type_fill.cpython-311.pyc deleted file mode 100644 index 2b6a97d069451753580eb5d7499f12c7eadfd2d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1994 zcmbVN&2Jk;6rb50f5smnO$t?-U{X-EYKc!A2o);L7tktvBn7c`HQnrt-6i{BX4lX} zIpk1@A^{QyR3v)ffC{MhUik+&I1&eIPLVkEW)u!6C*JJZaqJ=?F`j+<=DoMG^M1eg z);|@Cc?9F}_rKNeq!Ic3MwhF#=g6Jw=ouIA~c?h%uCDKq7z%{16` zM%;{-HM1CTT};3_<>tJ+nU8&Gcg!o8g;>wHMXzL*Fw)Q}V%fWh<#_g?j?g2xl3|uv zejOQOPt?-Da?JAmAhIGS@I!;h;>JhsF4M&~mlvF zPM$1XvFxpe2wFbd*lu#zYj$8+aa?yra9$6Dw<;{=a6f{G)58%bJg0^|>w)VqJ2`S9 zNpi!7w?O$Eu;a+Y44K+>z|hp0W)i0J6eE|wpF=DKy4KUvpl1@Dr$v!zEc*bn(mhni zta!I%X6~Uo*vzh@{@p0ciNS$XdMcrvZ}Jrw8@G97^Emg46IQHN6nKE4ZMp7tr4FH- zK}ZNP@GB9-hur0M1Zz8R0};;W>Shpy zRjcWo8@w=r)2LU(J4m9`qjHa;8|T&X{7p$z)Y1DfVK)YutbjL$_F`q&*k@wYKFZ-u zsXKloCzvI+C?w`_${f#g{Dy(WGl0B&kq&n514n6dn^`^pM7KV(L?aZc4`f>Ks3m+! z)&if~s;tydrJ8|j3?Y1Y1(a{`eJJRt?+436xE{fkjE|2!Oxwk~+OE#<1AUkLh`)~8 z3d&tyGxYd)q72W7Nf5svLzAhn)#O5EDRq1&qSQ#si4%vVKwF*Cktf9zJT7yT+O8Fb zl!nmcNEJq9@92Z2h1!RK*s3iC3_z)EwS*M~f&z~X)m(7tVH( zRxEX<&ip{yuU_ryut+TL+!`!m%Rn5$KFG)?d5?phz&4>Yg`GI1gn}U^Qk+)WvmlI| z!qT^(EU3&=>IJOjD!oAICoRkEc`}r;!0rJn%aoq@2!U0#dYrK=_CU6|>jFDi%z!IY zd|wu`Dyq~MMdkPz1mr*Xbv2U8c99YVG;?lmsZHjRxliUgq}n01c0BhXy(;7rL4893c1qL{9AzZ*?q$Vk|!YnlY}hs<)sS04t#yK&F9y zD4+xj)h$9*nNW=(%Oh1Ha?1L`39Bj_TJL>-Db!c|0T$|iNj^6kckG6aLvm`=9jZ^U zD1a|P`;5}!!z%`kvX>H)Ul$i)si+Bm1<}t9@Pg8u+$PA-lB diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/background_type_pattern.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/background_type_pattern.cpython-311.pyc deleted file mode 100644 index d05c75e70008bc3ab5c682b880d31d5c6e8aee19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2456 zcmbVN&2Jk;6rc5uzrWIak(9RDCLxK{Hdf&lRkYBiZq?QVk`{IAGFp4b&XWBwv+K60 zd@xca3IfCh6^R~E5$c`4f`fyQSnVki2h^KUkU%-{X4jtqA;kFY^Ka(OzM1#lZ)U$u zrxOU;_h0`|{V|TvFTB%h;Q$Exp8$A*RHO-(#280u`Z4SPIPfnj;JZ^Cq$c5)eJZL`k5N@nCm&_x z_+#`ykP{oI_n({grUt?A)T}EGq|$u&M?!+OxkaUNKXsC3ONz8!EJzlUHVe0;<=R87 zUZ<*LH_A43B&#ZI+$u=-HD^n@arMTURZO|KN;MyRYbaJy>TcCv}nJ zSW=lv70W1VCb;ySIHT)Vp;A(1%d)8{m3Jg=ZP=8pB>c^8SPfR8tJ0R^)a})LzG5-D z;!vH|m}0D0td=iZj-6NP+Wa6UzQgVgd?#MC+dCNVlIqSWP}^cyUnFv^8g^c#!Gw`%c-i^t)bCvx#Qj zqs*ZyOtgt%-P6okPGl3XM|PB}m-%j&$Y3W!WhSJ)qbjDORmk>zh1G1vuLCc_sMBDk zhl`d;EBp-c7J-M~BT0mW{VM>z6rR92c6xRgc?QpOc!KtR-=c<^LNnA9o46TnMpWTx zq#6B2_}sr^;H-B)rL{xtigsAHa7g7xKb(1G4YM2*j*8gyiDh_)rAIrh1i- ze|N-=fnP69NJUp{n-ClBL&T}hTkGKVrPb2A7TYdev{XoBX}iG`$6^GSQ=;a*(siv| zf>O{kbvPADjoKwevpB!z|7AyXL6A4DUSS{zr>NB_*srPeVC7U=6rsz;~bp;l}qw!n2JFO@e%~+r#5ts zQ-plbQ1q@PN(h{mZfU$MAwyR>jP|R{_+{xQ%1d`ERH3>Kl@{0nm~2j{3+xp>Ypkbu z4EC>}AZLSLCxpYX4&o|>q+IJ#8!rd4ixfIP3W*PzP_ZT}3aBMO4xqPg~{?4k4R|0a9rRC`qR#4#X-05yNRJt{7~&>j^R fueL|U#dGaZ=|s*7P^7=BuZq9%(ck~Uw)Dxs)C&?JP05Gp08!r3zN?l`H5KbEn# zCDk4x5s4xJH&mqdh>B3}{VOz&Q8=KScw_Hw5+Fii{O0++c{6Wke(yKl zAB)92g7*CJ&s(cmgnkoFrzxp{kE&oiLJTo%BM0jk3tO@!N7iMB=)_TU#mVRy7?&Bb zvyQ5(7@0E9fUnp&C$Hx*lF%|@nSI2vrutMy=o$31={-zcN9EiL;g)gKW4Nvt7=h)v zewjqYjgN0F(S`Sx7T&+Pwj9atxVuqy)e1~**pd2SUCcA=7dTy9x?$9Iwz=1E*~V_& zgmmhnS8F(?8`RRDOEpPf_-G%DFX4P9(lJB2^bwp>mzks!CYuT)*CC!mOaVL7wzFWX zZ9AuDSRVYIuAfc(Lh73;?`0Cp!Bc!9v;K!@3$woclAe2rKF4}~9d+L2f#~Adz27!$ zyKdA?{@{ze25sZ6sa3nD(=1;zwELYon&oN%Ojx;*nhL{DlxF4!{B3e8fW`7!SxI+%0oL(8 zp}Kqj36-Tt@f!eBq*7|RRzPW4jrvY)o%*J|Md`UY_z2DFq(4YZ3KQdg{XjqusJ{@i9rz ziHhyI)J)rk(qjH9gnU7rxA|*gR-vPSc*y@16u@-y#1c`|7ztHC<5%|jqRp*Fd9vqdITIUtiE`Q$J= z5TjwG6qnHSwK#*OXT#TL;@-g=VE+G9PGn0`b`{q;r(G)-1khUzxQYNY7a#v90~7<2 zrtpai$umO19}$Xr|HecvF6*h9CpcabW13I`+hg^5TFAHfG`IqE|1qdo#u$faymeL% s(VMORl0$T*byg1L3o*iYA|&Ijvl3^nU;yBs>U;NhG5W{9gp$qw1x(8N-2eap diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/base.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/base.cpython-311.pyc deleted file mode 100644 index 8199e4de370c50e3a1ed27e0bd261c976fc60b0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3030 zcmaJ@O>7&-6`o!Gh@vP_vVJ1lqOi6U$&4#HEeZ=s3OH75bYSzo$p}f}q zFf+TdB`5#`_>e;mDq7SEiUMkpC<*LC4oTo+FTM4!1au(w6tt(_Xvn?z)c1BNT2$%| zXWsn0H#6^j^WIy2)!m&WP=5H+Kg$1%6Y?*d92b}e<>;b7$RqLr(TFA(#1x8xDHcTm z=b{lYqs3@2ju0o+d7eGma2v?i~IM(?FtvosZGua>+93nHO?G<^ViK86;S;+cTo)#RtN z)G2;{!0&GHdrt8O0)D#1?>)sI4ETM>*UqevZ2!OU;;iULW~?ngIq~T(nCgFsFrvbJph@!Kn=Ri6!TW;9#x%!A5#p&zMt*z z(=MknwOkV+a4Gj=U^Y|y{w5++Ryfz!EfbLR<7H-VQ_JtI*cI1M94eQ#WJ@ur|C+)| zI_zUxva?m8Tn^5sn%||-GG%hf)eX&$muT5$6tIjU?0&p?XPi;TWtJ+o>>vca620%p z0P=`9E#D$!M{rI^9>DlE%{X{0j5oPg-eQb?1d=rQVAfC?o<>8z#|HGB*oGs zMk|J*Qb~6t$A+0=G^G({mTR59;7B^RCLK7o!t9bkP3it!YQerqF5PpvBLU#(r6(>^ zq`=8Tt$)@!s^mINElqv>t^>A76?kl_p$5l$bW3-12##&V0W&3V08_dH0g^MRbJx~_ z*T3`fOm0i}sbr!aj8jUJc|i?&^sbCzucW(HrIiZ_vpO`E6zm z-uGkSW3kOQ#8>;qx94_*9r5?#XQM0R8%!2So$D5N6icOkGI(IQ@av^KWD7C(rY~&x z!X`%_1eIRAJOB3Ds?9dm=4?&3*4H*%hWSD++0GiZHrHR_s_TMi2y;z%GI-FjD^<822=PijN*g&!oHUga=#oPTDC~9&{m#V?p zYrx?dUm3)i49PRa5|u3}({k!6Ot z(@zDyEUQ5ZX9-;DQVsCi&>t{1{X}mr#+(;(|;?D?>=SZqI8UrLgSe5rKd9krtZ0s;LR*&^I z#ID$~us^=fznDW{L^wM`9hVzs3S%k#<9{vWqaX6z9#SJF~Ld{WM z648Q>M9hFZM^e3kztA4s>BoYgV;LMLU#3LAHw?z5ndOzd zeDl_P-XAt}YeTLux~bFqvd(2q=V*uKkA|}I3oA3TH}djoepX(Zc`q+7E$4r=kYDxF zkS87Z=%LFv_!S#$9=?35ke@5abGH@?`NhIwcF2!Is6uRqo)b7yw+s2tp&as^t!}Uw zDw?QlX$t(WP#I>W5TL*hFEk@Qry4q3lnX9=5MCVqi(vS7!5=y$*UZ=q-7$2|0NXcF zHZ9AFW!X-UemR6h6w^t782bgv{}RbnB<=6>B5^GYqwDNCa50(kBG5)e5QI7z@m^8u zb-uomYF`xOnYQ- P7cPT-x)x9v1b+QrW!xgA diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/birthdate.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/birthdate.cpython-311.pyc deleted file mode 100644 index ca1bfd4f944599946884cd68fd48a2f142dcbeb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1501 zcmbtUL2nyH6rSdhz|P)>cbYnv3&6E8DgzL~f4^xpSo z{JrB;5ZKS({MvC%g#OTrxmh{EM@=Ai5km||sE2)wH7`Vkp5Yrk(>HsTZ^53y%&6Ea z`6Y}BXbUmxHey9yx^E!#0A_B!%}Tq-vmffEht(2|<3v&!CUNQ+%DMLLo10{PdvpEr z>&-1?ycQ3YeWkD6G-S{AQ=(f^G0L5Mi6AuH55pd+v3Uj!WG^%0<1BeYcwoM8MbFJt_O?TB8vpg4gA& zuzDi8jdmi_2JMIE7D2Lu$_Qhr3`U2_>Lszldl2-%@&jiVsRz=h_=mN7A ziKjGM0r1LNrI_|OA*w=1FJXg7^C}@93}`g-ln7x-0NcxioOocMVHRCKlB_J{%;XDr z6oKwooB>y=J9$w&tH07e4;k3n@e=@4`_JFBU|RMRX{aL08EucYZ*5P^^Aoc++8OQK z+L@T%E$YwTq`K=-m0~Qnd^e{ckL1A@jf|Q0P`=RWw0B zkgYR-8xOJxealr5nhv)_WU}ZdA@o&JW}Cuu)ph48oYpLhq?I|gFXZCCDqe!6mMr}Q qU}|8DC+NlT*oMGLJTn+pb)zlYitBYXu4)-xfbkAW(9WWxDG}JnnBFIhnT~i z=MeK1tbDiyR=A8B#rJyKz-fg>QLL!)<487)v^Ib3(lnX+eR}Hr*}0k2JQXd!$GPQ> z3tdIq0iWjq?+6-RY%g+8d3o4e4*w<3_CDmxk&78}jVqA1Ychjd%sc_MCCDAHm1Ay; zGAlno3z(JeRbA%+x{Y1Pa`bIf((>t8O~qkIBX(!8T!%4#!VYx2Whyp&OSvf~&5GQfn@bxTks4!+_<$svv~dPXhQC zKY~Lw(!lY0fna0pXCSf_RCbk+$q6T%<)p z{K!{?H0*TSrYwo%!2%&0PND{$X^9Xopi&Ydbpe{^-j@q!CRMhX@mo4hY`i3;sa>Au1my8;cEQ{?B_|EnX?j}Yl?goWC z2I5l>4Yr`#-oK_F&ipy^e|1m4dj09uH%H*3=UI0M@@@6{I{3hq&Wq7+DWgGTNSBp0 zLu}D#Yi6lwiD<|PNy~(UG3y2zR|&bgoMabi9l492=$GJvP^Rdu{OACAm{hU(=nh0Ibi_UJf)uxh* z!pKXEX_N)gC4VWN$O-*T?1Qc5LiRumOpNg=+TZ_vuAzhdAI&v%xc~heIJ>Z}{l~ID OcIZQ<`uG!rEW@wR2xuDs diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope.cpython-311.pyc deleted file mode 100644 index 4b23afe85ed6bb5d771d6ed189cfd2a88e0c536e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1415 zcmb_cF>ezw6t;6oT7{+vegLvyibO9X(g{^6sni7uQYs-uhg|3EBu9K_*Y>sQ#=s9? z>%a~|?C>WTI-*QSOx=RY)Cv2XBBcbOM!fSqJ^T56?|XNCe&1|1fR#^gzYIPH0DO0o zOR0GSo=4U=0TfWkK?Zve0$QN~uVg_lfS>|)0Ij|Tw8nyW7UQFRz4WTI-UY3dGdFF) z$qka{!Vr^+T%SR|w!X(W8!D1L?Z0G+NqnT&Zi^Loe%tC3z(5aD(5q0`3uwgx2a}tR zgz1PZBRTCRLNc;xlQ)o+y-})>C^3;@QZdbPqmdagq}@(r1Ued}$q4m@L5auEh$x1L zlssiLM4dt@8^w?BmvIBZxj0JmA$s63{B~VPDU@L}YLuDL28t3+w2t;kDqLxyIhIU^ zHW8jB!X*bx*?<(>gjcHA_RIU%g(I9}snSDY7*0mS=&Qh6oImsaj&m=SV5meP{|dk3 zyvu_-)|k*N%~Nd@F+we>!QpSsZMt?PF45Jm<6xHp`Um6xL>Ff)>oc{8^^?-G@6TUX z6e?j68W|&X)NUt2vCz!AEEHSwmJoKN;NM7c3U+^eo&Y~S@OzV zN|S1zXr|n~=8@N&Rfeov>tgkxuXR)1vQu~a=oeN^0|?<)aQAe6d;{ooeoX64Xc_&f O-sC^r>dytPGW{=~W59j@ diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_all_chat_administrators.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_all_chat_administrators.cpython-311.pyc deleted file mode 100644 index 467af53bcb93062d724a6a413b0b032f16b62309..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1801 zcmbVN&2Jk;6rb7kuD$-qS3xaO5Gx2mM$|rl5K7a4aib6sTofB27NhBQXY9D%FJ{(- zR6X=ii6T*Ms0TpefC{L0{t6B`6pR7>@8R?gEb4aQWOb9FCo zaZj369G7h04zAZiAlXZy761R?8eg=`OJzUdP_M;8RASghBbfU{b}T-N8dR||N*el>_h-3|vYf#PIHq-&P15HskRFltVQUjywr;{(5M z+OBK%c`yo1K+Y7SknzlPATZND7Fn&BM%E5S++mC6e-8x?liMEOHQn>zjd49cJpqxd zW392i4&`rjNaNB6Ypu0*XQR=%ywUzF&PCv^Vm<{GiQgnA);djuz-Nvmj%@NR-6hHXWl+Au_khRI#1A9);dua0)~+3Ts6z2gJis@V zpYgZpO#z0htu)l%P*sVw6zsS_2oygeq?(K8js!;pb9;oO^Z7LF9vg%>t}O&1LXs9Z za_eAtX|elpz=z#tK%t!7;V2~$fogY|f4#dtxY`wPQ_hFBGqn3mbnQVPDN~oo2}v3< zW(7&vLZC)O7Kt3MQZ3x#&%&uU&i@;bYm=m&gC(K{;_q81Ifp9G-(C57^_$h5^89vr z3Hnb9^8M44XrN1P>^KFk25*G>a0y=V~UMA%8k?oE> zc|vI50Fnh*6Q6wwm(ru+X+n;CdSHzNI?X$-jL~-(07QUuXTc?8x!>XE5s*u)YOso)^7fp1kGp{lQ}fIurqTZDV2?j z3HpD+kQ=4D9SSZ>lLp-aAOXJK2rdA?$K_`^)`1^Ds0;vk1-LGUHRg{zkwH0oiacEY zhh#vUky?6$1m~czlvQV$zYL~CP22^Ms2Jmi=*8{heHYcXpWb)TE8EBW!&8$JeI7%` Rr^T;tKa!(=J;9ZR`wwo=`M&@F diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_all_group_chats.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_all_group_chats.cpython-311.pyc deleted file mode 100644 index 50c7af2e32fd1185447e37b38f5c33be2098ec6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1719 zcmbVM&2QX96rZuZAKs7VqaX?@k_D~MqOyD7L`VZ+8!d#K52y(B&i{bKAxJqymXIQG%570Npq%<;jDG)Ch`U z$u2=$pv9mZnzo6NhB}Cr?jl-d<|7@U$MEK6SE$)VjmnPEu$aGsl*$a(UZ zu|cuY@V*27GboQC8&hO!SD{Q>XU5G@`3TuXs<9H)=V7LaSeefr%~IoAOe^vY(lusX7qS{_el1NC zG1qE&F=x$`1+35Auo?4y>qeZ4mYeu5Lg3{Hs5J}Mi52%O7`4X37a+RDxF7W`Hwdi0 zJlg`qEHOwJ&%2(yOS7Wx(v1h)V{_JjKODAK+o|2uUI!OOj9r@mK{C}`TwW%fEAL;u z3^XsUc0bCD6owm^p8~A2CYe}s3^+oP4eCaz?~(OST;3O4GL{uNO9wp4jFmWIo|J+# z`IYIaq3{$iM3F&qZj%lEG@N$( z{J(+P92fBnOchOVe{Q1T8B~A%{?g~2FFM<`vs<-!Xb;cH@5`^}y+gkbD^R1D7h8u| zRjiod)3Q4w^Hm8}WFNLkRv}0 zm@5HQb!PPu${qtC2xv-`Bx!w1t^1J-q#zvw3OD zaPszx;p`Z#-O^J-G+nqjoJBL|wx?emR%_To zmp{?02;75M@}i}@c~K4*STqPl4%^HLVQ~4!&x=1TBXxuXfZ t7~>uE!q)M&i<(>i+;-7RTgThZiOIv_a~LW<=^noEyBz)FZ&K>IPXN5M;3WV6 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_all_private_chats.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_all_private_chats.cpython-311.pyc deleted file mode 100644 index bcf8045dc269aa88eb945b8bbd9fadad885670e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1720 zcmbVM&2QX96rZuZAKs7VqaX?bWI?NH5$wW&OS+9%wo#~vLevc)%%WM>GrMu)FJ`=f zR6XQSi6T)X4yXq>^ni*`@B9&n!-8^%e2T;=H=}SsIrWXb8`2FR!Snd}&AgfS=KbDJ z{=Ql*A&?)x`MLj-hR|6UF2aCV`(d{;;E+UX{P4o%p9z#RCDuQ z!7PBCqj|UJ>86g6f|e02+(xv>^amL(A`F;>tkrVi$rpDFv z57w4Q`>mz++gDeYW3}aP$AuLqV%%~MllT){K&D%<|h^(2rioy=Q)dp+>f=@z-P8(ffV_b?y~Im zA{bxedqB!);)j(7@IHh$lN-k#s!)6jJNTCJ9sV+cuYh+uA?kaRzvf#|VLi0xWJ5F#W4q3t_I?8-v-{eW+F+X00RbvK9HiULlc zfnDZrbyuA0T>-RzCA92KYrsU;astVMhQv%r9*}XPNlE|$9U)JO!IY9n_yYC^?6!&)r@6eEEyz-O970N)yKY^YZ)BrEGSr58(u=<+FmTV5e25 z-QlxxIw$>Q37BtrjF7lQh!@bIEA0v)9}g{e>?sgJ0~^pQ!kKvP6lc;T@eCm+{u;1b z!kX3^SI1b}4B#NZt+XiF+&B0+xvMf!IvCJNe902Y^j z(Krtb0Lo-VOOo@vT+T6n=!r3Kr|7}uFFz~(thCY;5|E=}Gwa17zW`H-l(-8jQ8C7Q p=!MbaV;|K=|2+25#nIzq@6_fb{|ttTPpkXnce(n<-?-B2J_3ah;D!JI diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_chat.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_chat.cpython-311.pyc deleted file mode 100644 index bff4841ff6880c1a9ef28ce77d3e353db5249e48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1768 zcmbtU&2Jk;6rWk|`r8Rjs|sk47AS(1ip>R(LR2+%lN3lT)T9EoF4OJKIN4@D%*?uw zDu)~@Q6%7oibRn(pd!=@7x)jjad4#^qCG|GDL12VKsoW=u1%9rgb>d&&%c>BZ)V=_ zz1i<;wK4(u`RiXh4TF$}I2Z|xQRwampzjb)IQ2-hXG7HP6pB-+r?-pX6r3wWP4%#X>rMVq6Mg*^ZWZ9z7ey%_s<*kT1GXS1he{ z#SYDE)AgPQ;ASMGKBuoTGwPTyYmTN*0lFci z7cQHQsk*}TI-YB~aCp6(9=;g$q${S(|9%>7l5Vm0>@Y`{4-t<^sW;EhEL}#lJpj6IjFe&onyB{4-wUW&LU!$faI zp>Q$xC|DnP=oPHxGXTD%cVIFe*FwkZ@c4mPT4JbPSIDHum=}6*Kg&oa_T7>x;ddB&W>XFI8JKMd_Mc>{Acr<)yaPK!nY@XEWjVO zHx`B<8&)suf)BBZS%71JQ)=WBh%nSNLGmb~W1y@GQWZLZU@R#!7DT+~Bd#*`VbAf0 zmI7lua)GxJ_#`?OPF5A;jP3hSzyf^4X?#g-$f+xQAM!xu(_m7V(lhb|uBwd`ZmNC) z1;IZ04K&>-4hX6$X`H2-^|_66eSI!#5A?Y${p6ND*-zU8eR7}?V@BI992<~vqeTZ} zU&gUsy}r?WhrmM_5&DOKNq8ssRYTjaU^!M06a?f+Zb hCNK66wk=ZcA8dpC35rBMUVqj2Ew%jq5BBu>e*$GX-7)|G diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_chat_administrators.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_chat_administrators.cpython-311.pyc deleted file mode 100644 index 71e028ef81463a464c6ea5ff5da85e67c29d215d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1922 zcmbtU&2Jk;6rWk|uD_cmsSqkbEKms+6}u83q!3j#Zj?qO2F0lmTbJo}XY6dVA7*A< zNR>kml_(N$Lp@L=4yb^7;l#Or00$%G5bY@vr(BS$a6plec(ZGhI4!CW&oj^O&6}_H zd%xN5%jE(B`T6T#+P`ZE{U)7}fG-8_eF*vvqKIM-`Pjl(+KQ+687t$fmg;Mk=IfRY z;~A=YSwCmxz}Bel<^6(Hz(_$0h-Pmgnq!4~8HDabPsJ+Id=r_4UFn)QF4{p5Mt0V;ye$m5_I;SHnnD?XLSG7)}aFvgYg+ zVuWo2Mvc+%X|S#{?gkyh_B_KLJ6}$=4bf$e+jbqJ!^2+J2)QA8UB*+-flF5k$u*l{ zk2`GE`0w|Un~a~FY`A}BSm{egkdmdX)GyRlN$vddVq>wnx>8$xccpnbRwD@QPb9>+ z5@wME z;PDz(x*PmyIP%6TPXxO%%IO)HFV2Aa^ClXcMCE6{nE!0y^M$R_Ouw}J?Wv!#@F&|_ zOG6`dOUrw(2AR1u`(t1yxbfrCk~k#Q{&90S{Dgv13x{E+rMX_pB3sAqe_ zNR|*9Isj@O*2L3~pa$_G2A51f)wblAPr7 z>F}(KX)NgZB87YM5teayUqis2l2&q#1aUt%msapBe;HhfuJ{JjAcHa9MlbZo+YWl8 k|D?8qUh0pxZB*%xw}Ji~mOwsU|1j||iTv>|@#Ok{119Jc-2eap diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_chat_member.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_chat_member.cpython-311.pyc deleted file mode 100644 index d06725da0c55377fcacd3eaf3ad9e1ef8dbbb0bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1908 zcmbtUO>7%Q6rR~#du_*#+q6J|v|1G;FfERRR1Q&yNZcr`a3W}2A+}DYo87Uq&Hgd7 zE~LsKNR=oOa6>&%q#jTa>V;F!aOdDkIaqUw#3|xp6b>jS-t5{m2~-I2JoEg$nR)Z` zz4!LJQmKGI9)10DYd3??FVYwa*i!J`3h2AYK@Rqik4=mvRy@U5P1V;-&Ci$_KWk=T zTy->0_j6_raK_1cdB0#5FjCMwa`fBC$H>7wwdKuL)M;H4P!oGMea)g?39+oXZkuZ z!j=J}#&GyNpqrGrLEEql9#PwExwhda$IG>r(Pm*MGD2qXPDEL1*>J^bA-UXA*kLxE zH2(W-x$)PGqio_$Wm9$VJ#|z27Jr$P6O@3uSW%N( zvg6>xPJsFzRTPm)I2SoW+`x?qsbt02fy)w3y%r%yJlRQb7kNT#&*GdAo&{Uxk+HQ; zE>1Sz57~ON7CI2~=6Z)&amWayM3V+Ln{{`!$)Utvk1TuLYE#~{+)(D#gruCy%p!x- zAxTP+g!43v)o6pg0B7Ag`&6c@!-Za>{@6nOQ>b+Mi@DF{KcC+&j(3YI_h0@& z|M58hvelOdAT^6Cd*B6Mjr7%{fK$?rNhFzLV^T>Hk}$GoBzhK9WkfO=SUx306bSJ{ zr{hUnB;>=6YvnmT6IT1*+<7R1oubL^m};wt!7^@=D|e&Tj!H))6EZPc4qjd#Y$1q z+Uh{n0If_`ipWCZK&GW6$+BWH9hs~kk)c7y=PA#}|CU+|Dr~^mDT$JEB#ZmGsWf!c z>@_eYz5E+ceHCNeLub2(+YY+W{kOJ*Ug;igJyh);ZvE^TEQ$PQeZTx$GV}XW=9BCH E37ZWKVE_OC diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_default.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/bot_command_scope_default.cpython-311.pyc deleted file mode 100644 index d639657bee4b25b2254fffbf34a81b0b687c192b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1802 zcmbVN&2QX96rZuZAKvUH^aCgo2n$-3Mar(=Mo1${vIN8uA(9s1E}FQW*^L|9V`gkZ zP!Bm&qDYhj5-JiLIG`fbJAVa-Mam)aDH5mL76l=c6K`y9nkGd8X2;KO-kXp2e(yKl z9~+Gtg7)*bzx4k!5c*9G#;ueqc;5!)E~1EH9|hRPSm~Ot1-h*VhHV5Ty973!8h$yb z*cH%AwCq;{(>5{E&?2IhTZmSfc~3{^K0JA|Yt&pu&Dx$CHgP)PgdvZe*yEvW>S<%; zgLgY*{>{$(+ixu`ruyY@Gp%&Jm6^f&?)lsZyI%=P*noZIIj zOBjL>ty%`fGEaodW~~37bAej6%fb1AC)bWaulUhg=)7_HN_XYM)QDl |UEo4!Df z%`NaEB-*4-7<(>R-*Ci03dM}HELfa~Fg2EV$XrD^)zn+LCls~jK=~Tqg&Po${b0EV z&wY6EcH_`PHHvRy58u>&z+Yx}4DN=$lm+(_YHDdoCJ_^9l@P!;CZuVkr;h|jB=h@( zWb?%o?4Fv0xV|GLAyUyDh_-cbZDFSOJ{Rk~c}}57z4b&mF&6}=(qrMry{>n?C*h7w zM~=Jh44CXW9#?#8E3Bkq94QJ)GFp%V_g1ti9*0vtefH5Xw#H#U36o?C#9v!zbQU$9 zxzqW4@r%Xn`qRVuEcEZstM`kq=A%Qo4=Yf!oTt|SJ1kmG~jNHa>+5mKU#Uhd%Sm%3XEL!+DbUybgLadEeDc7!HNmqwFl z<{iBK%F3uxGcS$M{}ZO#DckN)h^NLuE&*DAQ9l7514cr9m(wzo8F-Ort(Yvz%3NY$ z6385{Qztke)SpP6{TZcYM<_%Nsh)9+l5w$oQoAhWxIqe>}pKh5I*)Is484 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/bot_description.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/bot_description.cpython-311.pyc deleted file mode 100644 index 60abf2b720345f6a0705bd11530c76b1f3f0fb35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1291 zcmbVKy=xRf6rb6z`^a64F=C**eYOUcM=Op<(s`da{+Cfoq6-#ym_Mn*1;jZ98VjmP?hV5yAb{u$=8I(HgZXBU_&-84Aatkl@P49a6j zgdrPKWNSAdAzNn#GpTkKd^yA{K0q~QP@QF{LCrbq37W&ydQ`BpPtZeb=cZA2FK6QZ zi=iB4!sT8hy)an5pD)3fnfF8~O!6pk7I7w6AVo>ev(juRPl^)V4XNalkm<0=T{c{r zmogH=)v6nER*`8*m5|q~5GkrotS9h+D4%cple6cnX zQZK027Mt9WAtwMvjRp5>SG?Jp@FY7OIqsrUXQJkKp=yV!T#A@b=#d_bD$x?}hqspx z?S-n+O>zjFq5|UADr)CZ@#yohr{mAYzZQcxSu;0@ zKOJZzwYR2krpg`CQT|irlD9j5=#hM|oAFfHiY?#?h}|taE~X4t5(c?y&rXpAr6s|t z@SW`04#4O55ik`Zq5-0|_ZJaMbRgYo2>Z3`N?_&W1G=Dj!lz4vC{WwU7n^zrrQ zg)bUH-;~iMv!fhNfU<=sqS!}uY~#9SYZy_D>b_n#Yy%?=O(ANmBWf~ZTSsUIcAIRI zTC*shI8bI@i?VYM?o5)>jmgr@>GD*hUk#QIuyWz3caHh2%ANY{`6cE`w|zmITOH$Y z29#%jh9MhMWNUW;m8~;_nN%ACUkWjc_fw4-RA&ilP;lr(_fu3MHHH*43 zpNJCILRog|Y-KT>1Dad(L@ta0Zq3 zqS;_PN)qA)o+Ko1L<4_7B7*q~gv9Y&J(eg%i0eB-5F!k)p=oQsX0DG`?uEQoDTUMv zs+C%kJ2K=1>aMWhQRS95UlE>Uml}>+bE-^K94}O}F3RNw6RJ@p?rdY3_rawr{hj6% zy0C`eR1|>yTtlri$_~Gn+?;wo^)+*LH!}w7%{e76UT#}Q{17rwKCQ}A_Y)GO38{y) z=_@@$$it@NcRUF~Xz0SRE+mio2yucSl#cYm0E*@6O>+f`(h7U!tSekI4+9h~69 qV5*XZ`dV8$#&{2%-#uyVqulP_t7Q#h0QN822)?V+A1AnC5WfL|06CWc diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/bot_short_description.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/bot_short_description.cpython-311.pyc deleted file mode 100644 index fb69b3ebefc8cbb3228cfc06f8dd79b231ec7934..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1331 zcmbVL%WKp?7@x^&AKk6350F}6L5l9d-J4($QQJ~q)XMgOVPQx!(`{@vi8Hfm#e;%i z1@$Hsym$~rdiSsJP{BjVso=?5q#neR-(<74V!b$-`SLyHn|$BzH+fes7ZHpPuRbnb z*Ae=njNULaW&12BYltF>ebmM_ZfmxNm96=D+prCcG&G5*{s>Wn8E@g7by(eDo78Ne zs`XWwRV^;h+?bvqV;3jJu3Va$jP>)uN)^ZbGt6f#?zFEh++?nFv*h$;WybbpP#!}e z4B40>TbqS~Y@Hd*q}myX6%e!d0M(d5b(W(BH5aW_w1}zosAT6?(Oqm88mRZK=Hdev zLfKdfxg2N0*b6Hg|ePJS*8ZplWMRJ7D&;_?HB#-wI;sik`9d*+H2CjY+ zuCPeUjmsH8F7tiB6Y~KG3B|}cKB#u(dP4ma;x!1UedkFu!^|g0i4r<|WWyMO`NPO>Ri+zVWve`xn97r&|B{9D@a`veNxr{V@>JD|Eg%h8 z-sw9oXLQz5I=Q;5-7ZT?OOsXSKl5k02%qJ{U@AyN8$_aGj5pE9#$Iy^o!IzuCe|UW SI^0{ntbI!(-~SO$%lQSHKW5wj diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/business_connection.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/business_connection.cpython-311.pyc deleted file mode 100644 index 92cb3cb13c69b4ce5907dc16efc8836a09fd8115..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1811 zcmb7E&1)M+6ra(~u2!-nJN{@$9J?ZM4r-}&>%oN5);3DrA_r_!x(J5V?#SMFKh&93 zQyU#*2sDAVw~|78DU_6wd+8t1g91G)douKt+ZOjwa_XC1$safbI-2?EH}huR?)$wr z`%Af8M9_Zw;g624BlMS?jGLMfe9{5(1lh>OF7mK}vE(^7=P8Eb5re>7v5BjCnxUm! zb@QHX=om4DYhcsdf>$((80Am{+4+aa)|vKHLFgHbtQiw_VGGrYFXXg_;|bIEgU}3} zz!$Y#T;Bfd-a1{qyT1DIN6kj8eBd9vz}e2qHgnl7H@(gFeP)GlR$ntiw(WQfIN1@5 zTiG)*96b`B9K!r72#g^E+sMf6K!Ao~=NPe-J76myn*diwTmzmTaUFPJ#EZZu&hb*l znaYdy^dr>4_LYYvLwkh2#72G#jsI&i@$`p1;rL95)xh`R)gjiy$HgkNH6|?Xw3(=e zd#q}mnyW!4U1)aZ9ID1U$Ay!1lN!*=~K?S?m=911ZBS2c9|V7(aYgd+C8vMKXfd*|G?zCg3F?dHO|5w_hZrwKo^;3 z*)$lkS|<>~CwGB-ho3-2g=0IcJcaQLM%M11TI^gO_j7%vPx@+Kv+<8wKmRlSHmzi+ zI;C0Dco`1yii9Z%S0v0xm<9M1K@qB=*98r9N*&(`DXkUa>2ncK!Q2j|uXn`fz*}6P z)N)NBC>2s%nR3|%FL%~fTAv1dzqK0Jj=$U5?{PB>IE7@jnEyrV6Q|u0PRQQrn%2I# z%S6j`0$Kd^@Sw{?eVj{rmdxeu0iTD59L`_Xe|a3r5^NCn0RA1IWD%7YzFB|V_`30D z=|+O|awVFXi{`FH3pI(?Z$HC zSe~Tx+y@1cM5HGvOI#l1!eXuqImLVdR)s8`_xYmS1@)GJe0}jd0El$n@@_;bgN?z)(MCkpA~H8j`*Sjv{#cv!}q{9EZ}Zm85K)9^5mKjmwW>tU(Py z(Pi4C7m>70xa#@TX!S%GcnU;JCH{__e`8p3~I_t1j? diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/business_intro.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/business_intro.cpython-311.pyc deleted file mode 100644 index d5dc4b3a70572fff3e2286d49fa3291b181489af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1696 zcmbtTO>7%Q6rR~#du_)~(o&TQ60)HL@S(N@;zv=1pdm69$gPy3ip6C*-W|JJ?~j?8 z1ybdZLnVp?hzqI&mEeGis$Mwt%oT})BXO|y6p2%BM&W>R;?1r%B#54P`{wO?^LF08 z_q{hi)@l_5^x)fHdyf|o`dt}0fvpJdeE{+{a*>OD6kr=;rE9(x=(ZjhwhSYclh$j?jHr8QB%Lw1Mj7hsvzuWQK-eB&qbG zP}KFLcImx~>tyY%^|iOpw_Az+M!1=jE)12M`VVn-X7&>ES)bG3LiajzBt$Vcq~{D6 zce0;k(#T$T&j;mGsE8pOyU5nwh01K*)ojDnS-~~Vg1-zE+E4@7g#+7ki(s3X%}RXE z)zYVQM|Wp$p&oW?H)rkgE%XVtD;p?(*XNSjxmb816XJX*d358OiUqV5g_3%qu)MGr z@gObQqTMK#mb}I+At{&EkoG}kQhH%uSW(ZSR$i`^2eqiDMpQm_nX~FiY6U;r@Pa%Je5{@xV>M?@qJ%NekCbLPx>q|1IQk7**|vR zo`QTOF+~RVJ)PG8J3gz#Jcwk8c!;vp#+IwevgoURm6|O@uWb&E1JHnIf%#b<*fKqg*7pb{z%FQ7Y&Ab_q4|Jn3 z+~lVq_>GfCAZ+C6E`m?I0OGH0G&zN8i(jmN*805lTXkVnz54x2KRx&JE1)QDlc|!K z)vJ4O3e_uFX;sj(j-{Gv8=q4`RhssPKc=)3AnG#;u8;#m;V|i@6I$mB;dn+057%OAr#a;8n z1kD#Hp3I_Wo*%E&$MrLlnQ9p}(Epa@G;kLFkmL(_ZEXM;VC}_l9ROCYu0T?R>40&{ zz*6^xtC>rTE)|TIl%4jhth5xRlS)ftD&+P{XR|iF#-9aKK`OojG0`!`WAyasDDR@? p=+V53tkF^4)#oP&W5ClI9py>!DXd`oZ~0aGkJR($Bm8Lre*+o2!Hoa_ diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/business_location.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/business_location.cpython-311.pyc deleted file mode 100644 index 08bfbc2ae9f497307234e5fc4783caff7fe3c4b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1595 zcmbtU&5ImG6tC)!neN${-OUn$F$(Rjur%mQ&P$N!xNO8>R@hyG?P$@{RWs>qe~eY# znhlGL5HNy@2$F*VJxGG&;>o|l!w4RRJ}r34ZDc*jo_y6kZFa?+d{g!My?XUtzxR8u z=V7B!LqI=&`^#WkL+E#@l%y8|K7JpBdx#>60~BHhV<{_v5~_|GYK|7_jt*xk)q+Y` zb*dOKl~+L510ysY6C(v}AzHbEXq8nTs0clRU650w#tyR0$5OR%w%|rloVbY}N5WRK z#_l_BZIbr2&Gwsbbhk3~)#xBIwnx(J29I&!v$)FwHso%&-M`7a1fm$7*vn&h#ajvv z1xmulyTCt%k{EI@MUJuur8z29m`2qrU^5Zb9G&W*R|=g~c!O%RdLPrqT{OV7erM6C z-bJ^t1L>Dfdof#nEfs#mgeWt({dLU(YR6IH`jN2wXb|%-PtJ1tahh1k4Q2)Ne64t3 zxmH<^RR*(M&x_M2Y1Z;!J8{ZAwqe~!l9AYGwY-?KW-;>6?s~~)X@4;bG+Tr8@>_@N*y7`ZVDu?(`q4>UXsQ!Sz z%;yhgM(x@PZ@}d|zaNpUWV%R4jAsTRe&i>F*m|~dDoY|*Fd*cK6JG}R%p}AMTp-|w|!>PN%ge#+e><^+)KvFO8I$M5%qpRkuluD9FL)cW2r_#oRT3af*hL&6uOBumU2!_P@+1(&5z2Tc2vpqw4t?TGHRfvt{(s<(au) zf{6Y%H}jB1;8UDGTV~$17bH}J6lNQs;_@FXt3a<|I0`7_>~J~anbvm&quRmA&l3i+Un%& XnpG}g3EO}3uRi`GxBU4OdtSibuSBQI diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/business_messages_deleted.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/business_messages_deleted.cpython-311.pyc deleted file mode 100644 index ea9891036d4f5bea5a467cdede194a2c5c77c872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1659 zcmb7D&2Jk;6rb_Vu0LYCUxd=MRadmAS|RKkho~TE8W}ZP+D5j zSikn}GF^IOdFib;S38OJdbpL4tDcM>;XJ;%&V4=*PVi3e26tn~K$bR~*v+%&vbYTI zzYq53PzpyjX2>qR2PN4WD{;cKOR!f(jDW5ex&eAQ*SRigtZ^6hF{|IH+s0k=3AW2? zX!>t8larT6(hIqiZ^Lp1TwZ~f#hl&Vt(h>^H#})Z*&|KR1b4Z2lQZ+y1`o}kIAS`2 zn=C(P_C*w!j_F2W2$ex-ueiW;TsInpajTYPUW-P;<%{M<91rDUyX{7Tx8eepRwM@P zUKGo=GxW|+GfeL*uFBFRnv6yA>@7xy|zt$z+Y!f1$JqxmL?hyE}BXl1@RNIN{KE$^Aa1|2Qd*!SSR@sp~sZQYsCwRfo-;gX>ooyB|biv%3^AFC26?N5Y9C zL7@R%9^UL;^?F_D#r&nA<8CUBbR92J>}|(eLoVAh@TU!;MTc6$EpZa=xosYTacf$` zS%{Jy5P$8U^f}Zx`_=Lnoi97T)z73zZ!{+tUzyCGnw+_qmchzgX$76QkXC1=3d=W? zwhyV0Rm(xBgPvok_>ci9jwnrGl66%aSK0{>Rz(3DIsvCNsZkn4Y~(AwPU*)Z$1iru zl(NVL_Yq2;`1S#IqB5zXlSToy%Y7fZgvBZFO4aw*#Da*K3kcPPbXwyoXv-1VM4C$m7ht`yxvSJ$EpCx{}EMn zEIT_B;`H>5tJa*tqdx-n10F&#J~4m*z?i&f^?3+ItAz9%$wfuk8Fe$*vufv+FUzSA zIH+98@qJai0H%UQ-UE?p7~=_ge*E;@LobdGpL@t0KRx%fqbb7p^bDaKCy=Re9z&`B Q7T<<{DDR*Dv6VghF@5B>g8%>k diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/business_opening_hours.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/business_opening_hours.cpython-311.pyc deleted file mode 100644 index f704a12041dae36b36c95bb75d9b8a07ae0753a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1610 zcmb7E&2Jk;6rb4-d+m7L4@LceMzxASTA|vfUZSdMn?`A&xJW62Ze2#}-LbRHewdkY zsiPcvD56Nf4T=OuRD^m*{1F^niGww#NSu1xDjceuc(ZFajW7qEXP)23%$xUq@7cfD zb`=5r_TwKt%|z%grOXI)MR@m9;Ez#&0vw?jyBI53i?mpG_1JKY*mO;>>46cI;<8)D zi0Z5ax*1t<#jRkZp*0kg9-^R3%TIKKp29B3tp?UQaw^Z2>R`FxB}png5vB=ubZOtb z_2DX6xw^XY{A}G7(MSk&W!KX>!-SW27`g!nGP+)*;7BV$iHCT9r zdN`;)thuE}=stGK>uC1v)a2s49JWT)2GAACeHL~pZ-@=rNQ)#J8!F32+G}`??lk{q zH9x-&9-l5ZHiQ`Pmmr>;m2SUGe20KzspsAzT%py7gf1lPk-e zk5jhUSxEyJr_Sb(c_L*5Q18&>Ugvt)?eI|0vjflH^!k){yf9T0*%G4x<*iv$$N?mq zgAqFhZ)`2i1GG8I`%O5)F9Cb`0AVx?ZA+P;%0a`;vQWZ*jimFee2s(k;39xe2)Qjw-It7zZFeUIWfI+qUpG-4MD?^Ia zka=Qk9EbJHI6g7j6XV=CU(bwl6XWtuc`-vr%z9?o6+qL?YeZ{^)r+TLu$jdjW}k$+El3)8r{cLQ z+pK*LO)zWS?F8OE^c4;uz52VqlppydQ<30GU7m3fiRrmClj^+CT;8Pd?fY#X)>*DX z8I8H}sqmw@%}*!3juP&(OoE?(YcmQred>?r@%%{nDa0JK%NSQ7Zpc^sO|55YWjG8| z$p?B~@gSAc;W*W5NN3SUbp+!LkvC07^{j?0AK@R$xq|tyH~N-@a7cE5{ET2UT$RnZ%$tNnBGQEP-Ta+bvLuSf z6G9eFvJ0Mhi;ys;N)e(=0j6DdUeL2EqwA^M8m*=b5E*S{lIm0vfOy2k&C#W3JW`S7 zCuTIz zp5YFZHw~JCCY+GGO-PcmEH-?HkS{YD&n*o?SQ>)*03oluR>0aZkxZp|cMfyN;}}|l z<@=yjrpu@0A#CsrwEhJzN0G?@ diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/callback_game.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/callback_game.cpython-311.pyc deleted file mode 100644 index 749f55a64dc9bc0868640aceb6e3028daa2a12cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 755 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 Yv%U1HqQH^%=RdfA$(g@jFfVufFVah?K>z>% diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_background.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_background.cpython-311.pyc deleted file mode 100644 index cacaec771533ac809f8c414a1ccdab9423b489b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 zcmb7E&2Jk;6rb5If5eW{v{h)KuoNyv#lE7DMo<$10)y}1eploRjm`lD;$z@U@7 znZWq%$H%=}Dj|QMF&$vzphsVVd_ZhsQD4N*;d`6S29YeuDNAz$yiGDf?M&bMm5!o?y^@iYLrN1o7km$#4hvNLz$3A@MObS zv6ps9z48RjI!%^L-w$Flb^<@D%Sp9;{qh!Ty|>l+;QgKLM1I>pNYtx7pigMFVC|A= z?e|46@a^_N$Xk16+}`6JhrL$w(7TT7g71<^Td|d$J(H7E=+P$FUjdn%7}O?)bQMT7WLx5jEpGr;B3u<^yL6xQs9n5QF|_;S z7BvdHWcsd`lVwa`e!|#|H=9-eg9tXY=Ucx>`@_(QY zpwr?h4xWebJc1`1H)e<}+4K%|=pE^2`d!-d(1Y@hSb@M_NnJ|RXaJQ@ii|nF6Ejv< zlGSGp$0F|b7)#^D30Rbr7_(e6iWrL&u%TvmkFUJ5-nkZt{Z1>e9lzh%9|$uJ1OxIr z-2c4uq0{X|PRw5qp@3$eM;+4%u*;fAPSnKOuz7JB;el9#y>GAONo!0Gc@Ds+0phQ_ zWc(tjp8Iy|>+Ns0f3LhStZcyi=~aBc_GV_yUk9_2t9DsWCaJUK|%|rHf0qPW=QX-y1+XLh=IdexgCOpuAaz*pNa)_t|;n7}k@e<&5#$B#IbtYB8V(S4@-; zT3dv|>?4=;k=I0@~F#PX%D6c>zXp4@N)-XRu${WM{94VW_{2VElhWR-n`Y=Do+DjBF@=x*o Or%%!Q=f6N{wtoZZo&O#H diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_boost.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_boost.cpython-311.pyc deleted file mode 100644 index c08148ba1542ecf2186baf0127eae133f5b21396..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1962 zcmb7F&2Jk;6rb_V`uihI+e9HvSy~QQYU6uUA({_`k0z~@R23Ve(Rz36Y_lI`cHJgb z4gpo7NPxJY9^eKlLcQ}>^x#MwR(p!XskcSpfO6u^tnJ2aI52+m{G0dot!IAkz45P= zN)f^M{l^#WdpU&u6pP_dQ-F`Z1n?AD$ifbCv5v9887Jc^y5bU@xT>y#O|giRb#r=7 zV%5pJ1-*a~Q}`tKvQE)0=_TpQIc2w^S0v6mRkxzZycUI`qhbv2;e6+qAD>uEpSiS3k_a#mPs+-JV z9d5X{Tlbk6!YlI2M#wg8mjRw$+BU*P-w(nKzsF6sYPZ8B-#Xj%fEf>sJ&2lmE$R+u zuHAFZbjzt8oB$uUVEq+v$dHaLq-X8|m%3tQ7_pQa;42`D09H@o>;UJ$o=-7TdC{sq zL2YbR9+&m(6SRx<+y)wc*K2WMw5vzEMGeO0wjF4`Jho=~UTD}}pxIvA=dL7BGg^Kx z)C|o8610|JVZJCMQ!*B`?J(>H3yp^9b2c9ih@AI%r_u7mpkZ|Ft0Gp0%D`9&LLTR( zf!Y=?zyagDVOi7y(&HN2?b=-axHO#Hmbuy*?L7VA0iV~j*X+aWoZ(1w^I4n?WFF&L zI*O&VyJs0*Xq$BBp}{)=7u6kSISYH-i^;n0F;i5F7zAb>W(gsDybRz6{1nPF9QwiX z4CZr~>9{}gSebpipV?RTiG_b6`|2H?_WP(2f?L9fez zG)isH4k@kY;>lBcrU7%>l%5sNFTy+G0;Q&71OcT1v@sHy*R+F^Tgwa0dp_T3LOt7F zr@7Mu;(bmbb4}(wXx_40&A<-X^{!#=7#$Wg4cixu(g^puENFz8zbu}r4wV4G&!B*c zSDz$9)O>=3DkF9BVC`V-i?xWn7m=yHltVHVk;RD2^`#t=xg>+sjZ8$g`ce+bRz$8I zMy)3Kiv=L-|EPipld&Vk-yZIIy?#zG)b2qu07G2dTX7aj0BRpG^GLSx=-r%c0d!JoDxQ-Sk%FW$>pg z&j=)UE|@>b-$?WNKEDo2k&@sAs6@dSN9am_T#nGS{(s96()!~Pp-cU7IZ`GPq~Jvy kk>&olL}aNyE)lueAD1Ls$B>6N)%VrEg!S(;T=KO40!_de7ytkO diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_added.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_added.cpython-311.pyc deleted file mode 100644 index b239fdd46ccd4d9b5fa3f7fc67ffcbd6716c83e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1313 zcmbVLy=xpt6rb6z`|zDVBn20VV8Ns~9N)D@2oYNmilm@~NQv?K$S}7vI<2+0bD5d7 zBjdt_!3xA5O>mJSO;8ft2mcW%E|9`(C2*zgj8Yg?d9!aa*qXm8{kEQ9d?&~OxBh63vwKo!{B;V!dgAyz@$lV_R59cJ?qbC|o~?Vt_Jy!*AF zyn}wgL1hh%*G4HjJ-1?&1j;dkZj$iva2#ra-GU#H8iXmF{^3iDVTXH zf5uOtVR{^g?OmA9U>0)oO$1tu@8SsGwSL2oFti*&EA3TTfrEdVZn`S%bD5P1iIPYY z(r~hgV~~jA@dhFJd1*ehtU^c_Q>6$|4*0TD@ z@_kC*DBBN?(;)8)R1>+xQ>V@;kUTJEGD((s%mfgwy%Vc z#AJ55Nr-q2Bo`IJgpr)gDkJF7##;4k#zy?AmFZgahL@&%c>BZ#?sR?~Q*d z7IO&NFW>#z{4<5nA965k$r#{+#{ixn6PegX4%RT1IAJFoMN=H25htl7VNNlLopRDz zI>Jdi<7BlgMoi%sz?QOePF~ALwzOSvidr$k8GFnrX{88f?Qv&9o4_c6mXVozh|D}o zKUENV20d=tq*+);mEsFItl%)OyRPT!zU8^1qJ+hbPi`&Ih4+>gK6rm^IaIE@yJ7OS z3)UAnb{N}WHfwR+x!JhG3?H`0Eb2bnup9=MENtm=Zbp9J@I2wKdmV1DWvl5gc&1!( z+O)&;yZSDe&Y$qQ#hGJu93wt@tOqy22Mrj10lYG#VH0VI+rY1;m(s$RvQ1 z1Dpb!9^ee%Y>Ziw=giV0)Wqi4!-AH2gg(bwdL0eFE92q#(WyRSj<>_id-roHw2duG zs9wZ^%2}H;!CYUcy4sNUhN)<=+T@-ClLin{%|(teCG+Z*@3+N#t!8+fRs8|2Rgbr7 z4bK-fy=`5QUeR`g-6DT3b1o#(7AnH$VJ2EaEt6-ZB_A)QCdB3NW)!{6qdUYuK4A8$ zdSZSUr!x$3ls*kpB8q5unI8ELc%ihtYwE6V8Fc%u&Rc@Z5(rbA`5o?tWX*G#A=5}U z0zCsgj}Sgs1n@0>0(t8X?J)Bc`ZMTpyK`hQ6MJ|sv8U`26Ms+kl0V|dQB6T!D{B?P z$H9S5N;M_bG^n3ZB@re?r_F#ZN-fv&DXpZ#$zx}xg4s<<&vNJIVUI9NsbT9vP%6?e zmN}rR-NTK=`TEBm->yS~TW+hq-Ql|LaSB1KGk2%{q1C7h%V%%5bz@s^F;UkoPgYRP z-)%EdlW~N_kTY};t$^lsj$Yw8+=VUV=Z|tYf^-(!F*3V35fu{eXveGT`JyKj9o_DP> zCAn#KpeleHE?=}T1-Ssp6B8iIhQr?p6nR4zjLSL+Q$|Plo)eY$%NT{P97~_LGHDAQ zTWY{-%b~bXID6KLxSDxEE-0T~0I!*Rd3h1+G1IdWsZvSy4>Q-|*uKN7FqB~tzk}*4 z7~=q4?v2Vmy4w41*+*(`R01^D8bgcvANRTUMaR6>eQa(uRv9Lb#z+gFsS4155# z4(uSr&Zl5tL=hVkTTqxf@$9=IrD1`0=jZpH{eJfQURH?aSXW-KzKqu4G5alt6kcR6t zk%ri*B*yO~YD^g6;7$_fACf~$ILk>QiOOM&J06GZkv^X@WBMbODtFP)E(&Qv=SsaR ztq^IUWtNs%c;!w{EA!}I;U?+WQm%x&3U~ku`(XbM#8b&$vc)!FWgk@`SE=liskMda zM-f+AhPEzKsPrUClr<46(z`ARJ_l6_e2B-r=CVy`&N4~qvO{U6L^*fz4y7+jHm_H% zQz{gv^aEPEDqjp9_2Xws&tixz%_s4!)XXXkIkvIPPvggF5}VY@y@K%>n@AJa1&Mq? zqOF32#X`Ft^{fekxdZIgpKsM@x7sVT!Su~bhhu23?ncSAYvKygJ&J1U4oDa6`&En& n^e(8bZOsv|Re&-6itc^c{8!g*U^sW1y~%$%>#x5o`NMt#A!G^N diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_source_gift_code.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_source_gift_code.cpython-311.pyc deleted file mode 100644 index 068af11a1242d4e2496f36df8a8ae9b983db4754..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1896 zcmbtV&2QX96rZuZ-@8eh1}d5&Ss+pEfn7j=L{zFmnk@NHC}}E$*=pqV%x;|6o@K_S z1mzH z@%~t;6cM!FzWcr1${_To8jKo@Rm1!1ARi!#DE5$#EsT|}d77_Vx^Gy9pRqD9r&Ghr z`Z+5HdWL4bykD>i7%^RBVVv`de#t6fq@f0)`Fn^KSmBY5&|`SgW|e927OIx^)Ub-< zk{tv*v_qE%vZ}|G)emmYl9_jAXBOv|8?pXYuo>r;+>i;|+tbpJ3o~nW_%`PE|Yq;%jhErxw!s&}9 zwAD3cwp3>3U0a&G720mVsM*>yL$El4B|w?HZLTtpb%gDkHwE+E$TvH%nCZZ3(hT`< z5!-YCs+u`#J8PzlKq!aQ2ySXgu$!-%q3c6jn~P+UM&fXv#EA>RWS0lj4LYZHmQhPO z!tE*!YsDmwl$dFAEeyMIx?XpEUph`}JjzA}*yGiXJbRDvB*A^Wq z6zOqRurLxqY%KGDIjX8uQ{?s%_ydjpB#e zmi`0&I=NVI0rcgnmYh(WgNUC{Rf{t+>M{}M32_5AB&3>&CytzwNanQ(c@iYfLu6ba z#PMt?36UxRRYltecWz8K-{)eZ3FQTxH8&KaTo6FL$%2oYOKz(v;a0uawVe&S!(`KT zxhki62*}F1A_bhG5J`$GQM?dEOs%^qF2Y8inr8r88=e0$c*&PQ{IiV)Pov7SU(J5e z__DE6zT7J>en0oiB)n9AV_~SI!}8)j#GqlxIm{7T7)` zBrX!-a~gR{FB9@nWP3wPju6Tn05A_RapACf(mEL@Kr=G=0aBujUZ2N1udQs)^^BFY|6#23jhFkz*!IHq z!ev$EQcR69SccCOK-iAp5&(ok zeYfK*6a`dK3W+K*q3%MQVL{}}6wdRfDn_V3og>60AU&n#lFbxw2l=ZhSJ%W97%D{N zuOJ3G#<-83>mBdAsMb5X@1iTc&Lnl?k7dT& zk}8KBDp91u4HbzVQ4y-RBK`;t8`Oj4QzTBk8HEGNi8uB-P0}JH#?Nox%$s@h=J$T% z{jt%gB51#S|J&lPC4~M^oxBw@18@3ZJVXpJ>>>|a7%RKr7Cg<;JYo^AXcax((qUX< z#4UMcs|2AfVT2+j=CUoeR+?rRn>KGN!3}WSbh*fy?v4+qSc(Z0TSoIPzYtK~I z#Bt5`{UEeMC-9|7;>P^7xoJ9ietPng3$rt^cFtdkOBbDx3)_v$pZ3%|+kIBZ7LQEc zw8IaBK!%rszUcD#l^%bFGvB^FKG=&~mRxkz#(5)|fj1w3@g;!3k%bwu3YP&4OXK9$ z5F~^wofUYAX=h<(1u+74acJvSnU$bl-tJf6;3Zbg`n)O*?To~9cxsO{cHll*#BBe) zrd7L-zQ9)f63TzggYoE|1I#$LxqZi8xw}<0pv~Xp#)3M!amSWMun^jg&zZ5XVuax7 z3Z7zW1dE1k%yXA73EMN~1oxc2XDkh4wIGZmvp6za2#6Y|jnMJ9G!_Gq4zj-3j+RCb zgy6Cl_{{N_UW_jL3$iPmv{tYt z++C#fWy{4VM2jnw0w_{aD&ez&6d?^`ZL2eNrgJqA%bm$UQKPf0h!Y43#qDtacITqA z(2;PPPxb8XGE_o#Y$s66Y==-l*;ciO$-ruwRgmVjYxP#d80>V{_!q=m`B4m*B|irB z_Zmu$qQ=A%j*YKP z4aj&V>tsA4Q_+cuwTlBXk;yulh={#WI+UQ%Vl!!?_vY}^v!898n26qNCykK`;Qjwp zMa4^lZY%Lxe#lv~so-Ah!@UEzh593kbzmFNGeb>XOra~Km>d_m-}hvO|A80yDBz9` zYp&qSz&xg`bVmcMt@7EdxbKTo&{fFGpFt%W#yCQ+4|dB2dUx<&vVkTByCp)c!EV{m g_9qDAV-Yzz*e!`ZfdQZw)px<4YV@y{xYFbN1AEXub^rhX diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_source_premium.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_source_premium.cpython-311.pyc deleted file mode 100644 index 0159d5b633b53f221cc18ee169e9662239621780..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1809 zcmbtV&2Jk;6rb4-e>-W@Qbbe43Mv&Ju#wj zIRvQ^MFMW9Nc6w~6`>x03;zQW2P5TR?I{wc+>F8j<$!pzyQWUko_L;l`)1yIGxL7$ z&G`FjwS<6v`R2FIKN>=R$iay8RKN!tAlyY1QS2fQn;1)3aTQNBRZlZDPd9a#Q>o_W zyu6tQS*JO-;1$gxMoi^780X!RS2oKSDQE%F!fiy0tax8V=mGSU%nB`CN44_49M*7L zwtPPbtiaA6WbUo`xuvVkg;;&v--`3gPRO|B?klOwnYnc|16faHR^U_PmNa({)5;yx!L)pP!YtlFA7c|j9er!n_}sC>t#IZ!k$3CYk^!{3 z&WyH<%D8C>BWQ<~<1=csw+s=rh0UF|<9CfPFjkq%y4>=N%-;yOwCXyYP+C|g4YCD# z5@or91(2^ZZbX1gy_D>pLOElshhb05G#YlmSv|~lst3H=Xa}KaSUu-C8{kh4DiZj6 zX%xvShZnP4-8dGi%u#*io%w55*RFjK=Tc8z22^8Bo}z~Nq#Qg?jyYyA64KkEmLEDc z*}Q4-uHZ67agMVv;(n|(1E1Nl1|-Qk$w7zZ@xf&fzQT85G92k)=05ZX&{Nv@PeYY$ zysc1tPuW(#!(S%X0LoQu)|BLc{1kZnfNDyti>SwVTp+~posf{49#4&(k_hH@2zltl zPlIP%B*bkiphw#H}#k1Q2gA|D)Ej({2g4126O} zd(-MN(XyOCRzM>JSVco71dO3{ND3^;a#HVY@h4%MThBZi)%xi07r;oo2<-12G(3l@ zPk%B0*}~@wyOj(5%F?%2emV;u*&{uHQ$%K_2)@_~(WP!CW*DI~JKxV#3j&iu#|DVV2E6bqOC4r6IcKzc&XC7Vg$4hyqsre5Qh zU?>q4KLZ=87~=tYwtuwkp?d%EZ4X`QA8msZ#(V0iA;Nfipq=j@ZNuC&mIyzZe@*^O LG=DutpM>-;via$F diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_updated.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_boost_updated.cpython-311.pyc deleted file mode 100644 index 6d4a39cd14f3a9e11346109a97274b98901ba432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1548 zcmbVL&5ImG6tC*9>FMd&UBY5iA~cB+M#zjeVF?l)m(7l{3cEpU28y1pn%U0wmsLIL zhDBD07(qo3l7k*RNK|t7ukbK}hoMgkp5kd_JxETzs-DU2hIp~M>eYMo-m8A^_g?+j zY&r$;{8LBh4=F5$Suyx{2+UnX5yde|u#d6iwOC7ZUr!9*09mI-Y$ld(VZ?Oq zf^5dM#P)5av*LQ<_zp%I+Ca2+8&R8C_uzl`VO7I#(E2uNIS-`R!et{!)2s-JC`(04 zE1Ns-zP(Pm*VnsmY;J9o`m5>w16)}y?XZ}Qc#ym`xXHo-e2wmIAosf5U&}I4gw;De|=&kfE@BxkdGx~@ISmR%Z++r;Fm`q$;bkg3kF%UJ!O}u_fj5xBc>$%2dPN2YAw=wDT<+)8o$*m;kQJg63{F*#)J=Suy5mX>4UF3nlP!Xs|3;4TSLVHDJEM zcj2&D=;7oZtoyL4ar2ReY6tj0qxd`RK>q=MsagukuWz+9?t(FI0{Iz1jF{*LQ6@X9Q|#wVbR>RY3?(CTbldqpUxoW`J@Yt_ z?M1v7KrLPZ^3NffEurRfU#x$&@%hH@?uCiF`Tg@hG1%mM`TCrxM0fKTd{E1-GLr>V zn5g=x993obvQ(@nONmh$B#e;KAtcG@IF`Ii$a~`;o@;7^&@6=GWkOCpF+k9eH_2qm z<{Z3`#W4Vm`BQKzWbLl;^U?|mUJ+R;@ih=g?&Od81KC9i;2nV*wJ>VApFL;Grl^(*`mh!Q3tTYjcvjHl@0JqDDRhwj~tBRU- zqtMX+1Iz?S0uKg*F_0{>2xbt>KEEQ1B9O&Jtqf!}S=FGk2(-#Mr^pi3o&g3(HWTXd z)A`Q1?|bW&EA-O5vTj= z3q#o;MWS+ew^W?8#M+cZGYT2(wUax^gLI;*-T$68S@ zzP@jiObhf)*n3UA7UWMgv!GiRO&JCw)sbOi-}RrsK+07(x2eOxM?&6C^Gk)iLmdVCSjaoc zJ|6Ne;u9h7RwtqURLFbCJ{|I2TJKEA`-rDQ-cNis9d^P0b#4m?@g4(Zze3JN;kWUf68uDr4*Fru+^IZ>l zn(Ws@K1=qEkk8ThH$pzI-h}ns3b?jluB!3>d3Z_t@XvloMCDiTgz*&O{I`A%-4$thHWh>$ND(7!Y;8# zYU@SyqU}X=)r(rT>2Vu;gx8|va$3=rb4K1UWw5muly79S;zmGSD%y|Fl2u3e1+?7v zVzzGQH7{PWG_$A_G_T=MH!WKxIgwW?;#qUp?7%Sc`(9kPWLRFQaMlr8LQe+W9-~LA zv7r;D5%;}T^lK-YTpiM?sTO+PeJ^oP^}=U8;Sg0nOU`)TYd)wrXBqaxG|u`zs#tZt z`(9gEH(znwXTu*=ul3*iUU%5U2>iNygpR#tGjPfKUh-HoEetL)p48d%uv=O+#hWi` z-81>@`Bbf{#=~DUpex_s-}gF{6GhJ}2YD?#Qp@W8Z#9VS|Dc8T&9QFMlOSVQ^`Zy5 z;dLGk4+(u)!(8V$dytWAHjqeWF`BULtT?wqd^YS}j}8z0pjVedVdIti_gVEZ)$C z>s4b3JVi5ZC=LbpA1`0`g?&4J2;;a zE+If7%*-`}s|eQ+))6p1m^Tn^BHTi_jc^BH6JZNs8(|0GKEf`-1B8bNj}SgVc#QA_ z;VHtW2+t6nBfJFghGo1P)vzGT$8S|Urkwl+ZuD!*#3bFTGc~(p7CrvhC~7%OKJhaT z-#Yjzq2kdZ!*R?!*BTP6DvOX#i|=8UdS}CcvbV1Z;Mi0b86Fz*eUfu+3=$YzO{`T+-=0l-0L5OByD0vvXR0Y{t>z?72$9Cbzk z$DA?1ac3NG!kGY^bS43(oGHL*XBu$EnE^~YX~0=$7I4m)1Dto}eU5&oiY+rO}M#EV%aa6VpKhOnpGvYcM@+H39|Jj(e)S^odL z4d!QXl3qfVbC9A~vTUJ$z;x`-|D2vZy}Q2mxnaK9+cH#mY1?~Kf*1v<6XaccTJdD> zk$$jeL9|#nhA0bfW!9de8)nbU1>J|PzIQMD7+UMt=+Zy6`1L5q z*~FSVe%VhTX<$8r?=-&=9= zj7?s3C$9M8NG90)J;|Nh_9u}|vGi@pow?;tBb#BXpGoeemwp=AEXzEQ+=X3#4%vK_ zEg;LVuHJWB{vygtY--(|yyh<>Sz*_{l-#Sbe+k(to8EAzuKSmftOZ+k1?8)3Xy*Mx z{~F5cfqWh1jbL#%P`(-HZ=rl!s;uFTgcMveZT}XryHaK4+eGh4Y<5#}(|7zG;`b%C z@=S7)0Ko0!m07~R6Nk<-&q!b!P5Xg6uL=KcB zirFMl;GV#G6uqZVq7XiV62ZFfM#_I4J6$Tr8}WSc>%ScLJ0%S zg|Y^cD0Lu-@&~F%Nd!rhNsvV81WA-r&}fuckdCqo(ou>*{b8PAzCb{~M;V3rIZCep z(n}Z#@P$p5y#^T*&JrYevezWbUze18#ZoWJs*wYAiwtRG_^TPji4^wqmmeBUj_W`d z>?JFKA*X?JmeZ2?SD>{dfZL{wwR)@2jfUSsOK{8Qe}06=;yy!YVzH*voztD4?D!ED zbGYEi)7{hEpX>_$x!}Dnl``)|>#L~X11^;^9}xVR7#KO-cKJw9%6vrddt!L(^uEi- zf>P#Vg1-`}iPHxzp9o5sPYAv(M#fKfT|OR^G9MTGF6yA|xeiA)BVu$ChnWmYnNJFy z67x$g?{qmJmNH+$y3eCxGL7A)gHq;coKj}x^s&oVf>P!yg8xXYUUhkw%K@>J`BlO9 z#Em;H?{_&MmNLI1xFRNIPCs$^Oi;>vM(|yTSBaz_W3gVJMPkWw_yf^87PBH^Y1QS! zE(gR?=Bt8#Cl;1z0|Bv=`7%y>Gb*lbxO~dxfLO|WL+~T9vgY!X%K@>J`I_LSxN@D8 zfLO}>I`(iUBKn3-w_H9HlrkR@{HB;&qyq%RQs#?Tw-^yOH(fsGazHF)zKQy05!%$g z+D#SwP)yC9K5_YMP|AE3>&kQ}4=*0dBRr@d=w67KdEET@pp^MM9>~Hn);r$>!9NwV z8JG9C91u&HXKB{`^2uy&Fswj_Tt1D-k$rmk(Y%>|oE}_Fdew&mtnd;PP&l z17a!j1;J1L*e1vy&ra~ahMl21c)m4whd)|};7`P*D=r^(IUtrYzk;h!BY3x9bI$J; zsXJ%`T$oDh~WpMz)ULw%>ubSZ|Z%)|@~4I2yfu%s8@Hp8BZwRN#^TWs&b65xim zb-}F?m#>N2cg6Zmacc{X2PPu!J;3Uj6>JA(X%*|NtYHVBhd!X@@@14k3Dp3v--0g1 z;w4{^G${ee-2WOAw3J{$HE4cW^<0nBRL%x^K*#V zhU$hujXwmM?Wm}){LEo?AnOl*nZ#`R!jDR3CsydVSb=_mGP}^ye$j$IxtQq41Gk<< z=}QE3^=I*oARyi}O`sS9tgiw6s3b{(jky=g2e#q#7u9Dfe7FR^g__eC#qLIy!)c+BtmZ?s&OFnJrE7ZBc7w+;0Z4jQFWrB fHx*UK9C~QK?qO7dyZy)U-Rd96@?U?#PDk=T(xT^w diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_invite_link.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_invite_link.cpython-311.pyc deleted file mode 100644 index cc462fda3738d231000f70267f89d7300ad3467f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2198 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_location.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_location.cpython-311.pyc deleted file mode 100644 index 26a218b1a5b882a048d79a1e2251a2e785b17b19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1470 zcmbVM&1)M+6rb5|$t%Z%)GqXc#i4;cRO;D;kfItlt#C?hr*shv>z%Q*@oHC{86~mt z!G%CmXiIx2p|pn{N=nJS^pEI4g&xG73_azh;vPayd9$l+WJoS~dh_*SfrSy% zxdpbF*aIhUFw)QlqSjqRZDu{t5qb!#q@YHfE#%i8DbvUKLYStR3}u|9!q@V~_NO1M zllJ@T?GLYQZshvA>A@phzPY%~64vA4;QH=O7D&1zIk|9 z_kccTL(T+CrSL*8nbqUT%)8x>qdx3K5aY$di?TF@vKejGi@>dH#3Q!m^`#t&wN@+2 zIBUvTi_MJpTDzGPt#BA$R4J;|MJ#uq{M@Pba$QKC+aaY;ipbw2^K}w3JfLAJ`!_EU(4`G#b^M4Q3j_{F2 z@lV>3{tN!5I5041ebd)Cq(i&`;x_~{HpOVjc4Vvh-HB6Yq9KEZN(`Fxn4$ zOmxFIQ)j3p4~9&%6tbj(u{k{87a;ZFEA#j@t1@2$mv{%n<6|^kM2$DTUjK6AtBt?i z*T?S8&;37acqndf&y>=1cTOP&`A*r8np^<|ca^4ED+a>PDQyXa?x2w4 zI!cu867tz7OlBUN5Sm4>eU6a1I|RVNokm3?d1HoI#F7MX#(WuELXGSyUr}$VKY~K2 z35oAOKy%N2Q_V1)DN@2k=E~Su2L8)fo)|YK#?o=;xbt~uVq811FHF&bc>_-!y9N@y zl&lpQ$~<$DzgpF}>DLt=dm}iwfCpC>J-1+xF!{3S;$$1UpTb zTL*R!V&_vZR7@xn5>vOJGIhfCr6myzQO)U3V+~3;DN`0Hr@c*Wd3^}fKTSHWze8&hoIX!w{90s zHwfoK6P*dJ&S4$fI$}8+N>UueFIb|JIKN@jplw{o7U5RnY2sw{=njD~H;0PUbK$%#_oG0BA8UEq=f zTLafcu{hyO27fkiVEyC&&nL9Vc&4-@S}fu`Sd6cLSJPS`RG;e#2$C5#Sz^v%0p-bc za0R5CrFsEl*SITW$EMGgI6QQLBJ1pjB?|O^jbwB%jZ;Fs35G_#?Qm{d>9hD2$#8Iga{* znpTR&mAf-+>O_pcigvR&QkiBuB}v9)$W%1%nx5;L-a^*|*lXlXYq^vyV_mM_t9N-{-Y~9xlIodJ kGao|u4ct0g9^U~vTOPBuO=uYXt=?|`w9#Mxm~!QR131THdjJ3c diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_member_administrator.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_member_administrator.cpython-311.pyc deleted file mode 100644 index 315bde11ec09427d5d1c8213b146277c2707ca89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3469 zcmcImO>7)V6|SDC`Tz63W5;&dKXEciuoHH(8=_z^PS%@j;-J_OV&bUNo^CrGPj?Sh zJqEA(V5F5;BtR>z&_;p-2eb(7p5eY{4n0y1t(K51amuYxI3S;RuX<+O7G5EcC|7^} zUe&AL{@&~PL#dP}Q2z9rzidAkCgg8ubW18C(i;oNXG9~K)F7r*lO*JcM#4ettd0wIOC}=Hn@2FA zcqPXBV!S`b2ReMPmeqz}Ps2SsC+v})ofr0K&n^i2OwTTAV=#U^vh@-hjo*Ye*!w&C z+q5?QG1-wI>=`g#=L>nU>bl)xb^WINUoD}=w=bqSy3kSNljB21`de7O{owA} z-Sv$}%Nq|LJq^-a$dVO7JOOQi3Rl98JcbjUmgr$J6x{AjJgBv7#%#CqRDL27IQ?6 zVj)<;f`trg+Yb70tYPiJrWD*Qk6M~GcN7k9&wzD>5AM6yG7#Hd$7}7V+zr+zc;Kf& zKRSttdM6M~Vy0e`n7nDg@w>+qPMyne?50uYN2T7>aLA`YvEG7JO~o;shF(pxKDcZq zBTOUAAj~412MDUl@k=|QOhsw#YpUfKb!GR*D%;@qZUQjrCIP8S0aI=YFzu!R zGj0Yj>t+FSZVoW-<^cw71Z`qb2a-v!IoK9+2<`DNX+J&d*nWvHGew5t89j`564s$xrseB(xn4 zkA1Qcrm#0n&RuzFh8g5pGIic&ghrWMT=Fh_JFKA5 zN9J#O=f4&9qcPBN8$@F$8b6GDgv@-?o4yu~qH(5UjG-~!G0vhfLFV4^X0L~nXiSmW zx4oIS!gFZI9b+1ena-G5H0C-z=h2uK`}YTC!z!95PcO_ja95;yDH2cxI1_rtTpNjc z0GUv>U_#!435^RTgf5s+yI?}{f(hLVCd4n8hycMv7zid}K`>@z54}->1OhuOi()U z=@FL_R22BC^nPA}r;JOS60eM62TC+3bwZ`CHyRML5?g>)4vHk-WsB%l?gCyk|7)bx z1JeBq6Eu|#2||&)yDGhUXXD^Kk8VV@O*eeH?9=kWy@Pu{z30<8pN@K>w&|!(pZIjd z6SYl8e0tlbW1gsOIu<5K>RHmKlb)z;I_cAgK9xOD+f?@HichCJQQLINr>(d%4tHSq z@q|8AeLC)m+NR?^T{~&sjhi_9MZ%{Oo~Ug);nT=yyp#2i z-0=QWJtTA9$?B6??_@np_Ju@}&h}n>Bo4qZU6&-do73^-i@%GWe|$~9IM}}cs9cdf diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_member_banned.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_member_banned.cpython-311.pyc deleted file mode 100644 index 7ed43f5cff6fbb71327c4cee7c86416c5e2a47f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1918 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_member_restricted.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_member_restricted.cpython-311.pyc deleted file mode 100644 index 0bb342c46664c170e8b84b9e40ff7293a1e0e9d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3252 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 W0}VL4tHakj|4p9!dyVI^uKqteEo$@t diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_permissions.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_permissions.cpython-311.pyc deleted file mode 100644 index 659fdfef0a63de4451981cf981d241b45843e1db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2691 zcmb_d%Wo4$7@xJruOzmUkc99EI6MkYNDKt}h)^F2D4>Fa3RS6_YP8;+Bum!2?(8~g z&>nI?EtT5dDh}m{s1W!53%&HPmU>w238^P;uF^xrsoyu7YyyNH+KxZ}{QbW9=KY)T zPx*Wof%5Z@zb+i=Bjk4^TO}1a%0?BO`$Q+YVv>eZQxxw0fVo9Bv z=|-lOQAmQ!5X{p)oPCD0tc2aFW!bLk8n)$>lVSemr`IpB znah`EKD<($4U->OYhiY-iPft4Oo`eIUTe8(-Q+j9$rpv%n5*CBnyW$kiwEY2*c?sYC2hU4Jj+_~RXf^v~NnlS3zDXE$~w2}*XCADPP z)`Y4z49jp_p}MvxwHz)=1|*uMy~_2HYnNPgnU@R;(lux`*(JNYVYh_Fr%Ow&+jOQY z70niW(%n4UNn0#d>bC1t)TVJ1TQ#@mB%4>C7q$fQS>3kH&%-`VwV1;#oi(`QsEgbQ zi*ZP8>4xou{c%9IwN`^$?#`sUb=MWf(Tgdk zgnMIdyGvYb&ut%8sJhNpd7U+3x~wVqiosVmCjg7KAZS<%cG!!#hP7h2oZ!%uPqiF8As|SMA^6n&JW6ccq-hjdWbxN z?-Te&<#t@7Cp^VVcu9|XDKG71ysVe=y1Z_$$IE*KU3pOOiVv0V<Nt!!xVw05c9!+$A6=ZD z|HKx{^E0+?Sc~(^EqP-Y=zN}AEAv;4`n&^2JkeCOWz_GyYS{SFRot~EcPe-d*p7QJ z*<2H&Fw&jjmyTz0Ytg5n)>#7hYn^l^Nq*$JOW(|XJNsMD!4B!o7lI>GL8%fPJ&y=> z{2jEz6T!*%g0UHljGjR|GSwM@blIkJi0nDmIUG~$C#pbi1I8ldQnamb;G5!;o>ZXp zqzt7ewJ1F)Na;ycN>55tdQzX#lOmO#RI2o(T%{*9D?JphkRBe6)TcOz-UvW>2!&y( z4bE8D#aP4ETPFHFjD68k&CQw&WAIFDsw6Bjw&Pz5qW|??35xT<6Abg4+R?aaf>srA z6rv8^gZITT%)@#@6S2 zIu==*js^5efVo3H1w?DpiGW_+HF3Ab;}xF{`xFqZO)CMd2D=82m)EO4El1X-<$zue zCeQlxfKLI@+VpHdMR59@Pe*(Th}Nd(0?J>R53c80A~-Sb(*d6XqP6LGKx?}Njo>8g z#Vb2`cgLZ?8^oQL@Y5rQ-I7TUy_;LYja?F(2{nL;~#t}}Wf2ZH~1ki)^` zh%t!cTPIsB=TM6aEqFsgiy{dXVH&PJycLmD@R1d14AZ&_e*>t6NEwIGlRcqYo@Xya zihfsAfTE0?uK+qpMNtBB#DCGAl8XO&drD6DFIp!(rzo(F-O(Q!|3g;&`I-bd&%Xfz C>%cGo diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_photo.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_photo.cpython-311.pyc deleted file mode 100644 index 3797f52e9982f35bf6494c391fb9424ba5535e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1538 zcmb7E&1)n@6tC*9`JUAzZqy{w7?-6HGbay*MU-raA4?2uL~I6%p6;5N-t=_$R#mH6 z=CFqaS5WaHd(fk-$R51;S9q9!hoMgaPkU>L2icRasxz~*n2R;9-n_4Ry!yRY{d22T zN3eeT;rISQ1))EsGFxUT;Ij`vcz^;F;0TSdi?NioNE_*{J~CVbbUiR4b7Z*|MjF~f zfq4%F7PTJg2t9&bF1Hd?ZX&1pSgH=r8(thI!V_TI=WjSMu}p_^b!|mry80E)I~ZeGCP=dZ1Aw(652721SEx zEXd}9Y?U%KSv_dpM|~VL?loQOKKcT?Q1o%;zVaV-7m1Z-V zGRkQzxb4|K1lp;L+^Va{n@Prex@`}INcncB<0p)6iSx^CC2Y{?C4zUnG~ASD)lqdY z*STPMi;ui0BK?-UALip@D2;bue&~7pFgXJOYN3hFvYwiiOF&=AUeQX5y zM`LXMguhi|1mmFZI|hT4h&3f^N!AAT3xb(2d6rU^R|yH@P!Qr&@}-5E38zt?kc*D9 zOOPY45#mQ4=Y((=ZzP*#+jpPbxW3)}Bw#0Xc>~J3UYN-F>xko&@{a5cDf^lpvlk%qouxUZTeD)=6ZpwR(tx&>(eW5P1mnZH{UF3U{Kbgj+S358go@fmJTVMK{n(x%L~h=TY{z} zg`AQkd`w9a1l3aZoRppi=2Rt|u{WZGwLKfaB zfGx*B-8pZaqw7-`O5$L)3N9|2{tkOlM%89ajt&167(ns#S7?S=Es$hQWUfw(%Rnc_ zONDh6L+$@%-?jge*1s=ssj~hB6S9Ox diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chat_shared.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chat_shared.cpython-311.pyc deleted file mode 100644 index 60dc75aee9beb70a446b2ce926ed6064fa9d09ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1948 zcmbVN&u`pB6rNezyWUMUNt3h?C2idF2i->O9uSwPLO=)!YMN9e2;pv-dOefGjo04J z%o0-Nu$3xNBtTqH5A6{Zq2Bo`I3%J6%cn@3dO$J?2b2?U?CiD?ASA{!pWmA|etz@4 zH}((ZatT5E>Cw+?&rF1VRZ6!RnSc)(AUs4AQS758wlP+6&d)V9TWjjJ-ZX5ZnYZ)l zyyh30rfp)xG@hqAHT+_;WS20?p?O5}_Yo~H^NEJgQy5vZ`>45sD#hnYt>C!N34%~M z(hCDo(c|*!C)el5?84ma)en~DW9^+_JJuIHA!Bp7r4~6pJT$P%e74S==5pgUbLDfK z`6^!D2xYk9-DPg}vJCa?h7az8@CEFSAsbU<=RSg6+8WICEJV)JU(s#~MBH0Igv>K})E zvpySAsFM0-n>#Y(1kzP!!DsbFuTdACWUsdzchgyCqJC68wX}L_X|A$#R$JSA9DLs$ zc|mct8}wN)h-(0Uc2F{b%BR1c`*QxP`DgtT2`ZEaqVWsStCP{G@o4NUVA2P3sUhh{ zBj=NHPgRREgOU!wA*u{ydoP2Wk(f#;lS67Q&3-DW65t~W6e(%C`6(s60#NBw9IL`2 zBrXxs3~Ad}az7z=+Kzu@DG)+K7p4aZdFf*X891IhuD&xVA#wSLe3$t?mbCrgo3_ee~w;fAxKI mY4>>F*M<^=@x@5LuzS2G`DqL+{2jhM^She;;~z|E@P7ewz6Nao diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/chosen_inline_result.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/chosen_inline_result.cpython-311.pyc deleted file mode 100644 index 0a0ecb02b173e712dc2e028054cd1edc8430fa84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2313 zcmbVO&2Jk;6rc6(`ZIPQO#)3zwM~kG({_zii9=LXh0vxc#YO!9vACM9z2kJ7^{zX! zP6^7vl`2srKwMBO(E|t63Y9Zb{|63^)PuFBNSu0G6b>jS-rI@YMx_EVo_&7v-rG0t z{ob3g9~O&w0^`>oerwVkA;05dFm%Z%TdTm_B@S^EkF*p^QIJo0sg`P~EzQzex}_&F z)l0WBRt9*@(Yaa^d!Q2X2p&1C zl9Rtk%7v%6EGtpL_WdBVLpSh6S&fR9KKVx+$7uSMDOZB*MHnCquq z<~dIl`EuzJ^Vl-CTj%T7StA5}_FT|NoB^+07K}IKwvuY{OWC>y%$JZmBbMS2D|Hz# zuv90-G)FxSx*TM{bj+e!FDl?~u{Cwh3GmEcL-&X1i)}?|d(E-^&~4C_n>Jq- z9B+px%~{ytexy|cs2-j+9H@fJgg~&$)@fkASMI_=2?u(RJb>pBJaSwgYMj)%vYuL3 z*R^%sQSR&O>7SHulM4qf1GQS#`6#@?$B^tnG7S4?Qcgv>=(GWqETyjRhLo1G(b#jL zQ^C9@r7!itUk8^_j?#u_3qh&K!Wz#KjPCZw@6Xph3HVBFA#k9vYAYRXhXJS1HZ|t2 z*3P;0ns7sQv<;04xQd$X26*dK!nHON66Q^`N8xtfYqVMTeyVYCOzIFmY`;OgP_;Iy2X>LrKPbSUoQcpAG+|bOv z_Eujjb&`nC#U{ z@i;m1cE55g9-YVm`u~sQ&{5)TNci+1w;i_qTrD>$SQLY7aJ_Ov&nazH)t#!gBr*bC#C=l3!5^xp5inV(9f z0)p|&55IO^*ARLlg~?D;2A?*7d4L#V*g;)vU@ZBJlj$mk(j^Azs)hNuJ*UDpfD!1i2USEAC+Cm(LojdwRU-rH)_ zBjqjkAj&m+(rh|UaeAh_!yUdW%x<%Nhg*S_dQK@xfB5ten6DsgjttC@k@*P1Hx!oP zgekYcmWLF8Cu1H`fM5yJ&gCr2ft){=wZvXXWu6n$OijM2hYGuLggThb9F~pz5&9e( zg>5wX>$8!z;kkin1^4Yj1;);v?N_`c^orm;!F}!qe#NZx_B@wYtaS5QA=$j`^@YXP zD|9!Z?D|4>P?Qxs=nFR@4am-tC6q&&^01~5!l&;5^F4k5Z4*rFpm_xAF|2glIk&LP z01q+)Wk3ch!w=O#_DB3((v;9xN<&vg5srwGB$s3T8R?lw_4_?QBS)$2+5x3{E}Fd% zI`z5Jq4b$P#2omI@|0QtnNO*o16h_8#_(+G?e*5jp4e|~c+7TpTl;-s2A-f$q!xGY zw%)hfE#D6KYdzE2H+Q+;GHp+`axFOMaUaT?bjn)qKrDdY`!i!~*Cx?k2d)1BkiUi~ zUP7hiZ#TcLe^dXhxD+F;R1TN*aPda?LN$DTCA_v6Pk}Bm#6>jsQd~M0<>u5Nxl?e6 z^m3Xslw^!v!X*%vr7o%YjO1kDMWT~vBy|>7B{vU5pOWCpHls8uP}=oa-;sQg($D&) zGqz}yGS33_G^H0F0f7E;(S*Fx2^vvpjJm}g2MUM9BA9&H7;lOtxl2A~36Vwde+L3E z{qw~cqUK^GNfD{nMr0o5F_{lZB_wmh=CJu?GbGo;mFjS7M5^gLCe@JW;qvORJ|e5> zJSMAg2B~#5TwED$j>t+nkI70%?wx2?W3-@_<5~3btKkhjtlo^L=koyf|08+nD{**E z#PTH3hMt!gclvP00AnE^+9(Un1l^Y+CvTd_N;PSlaF-=CDNxTzF7YJ6JImclEA@uB w38F;R{{l#?V2nfb;^^``LABAd=LxEeF3&jo3WhZPO^)0@r1sDMFeSnL4VI*=;{X5v diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/custom.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/custom.cpython-311.pyc deleted file mode 100644 index 822891b086b359ede7f40c49ee365a474679a55c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1301 zcmah|&ubJ(6t3!D(=(ZIG|8+OST~9o=imyP!-ALvF^GqdD7v@|4MRIs6Fcdy9;&K! zGbqf#gNI!R9yYKlT!m+D!%Ue-mBNIUe)(r z^@Bnohd`d*eO{k65qhmBL&neA&zhbM@GfKdTxehWL2!xwn95{ zDh@^ztqe0DVy_xH8_yDlVv?b5-6HNStCD5zE>Bi_C`1^DS~N>tl6y3^1?Sp^F_5}( zU}&OBj^K-^oPVP|i)BN(#FtbC5mm0nX3S_AtK#|457}!6QP~~tc6V7UQv_Q~Yv5QJ*$fkO6Uz~Q1goUZ z^FatE1~G2nN9L9V>|hL}3EkMVhqK*!3ntqm#}=G#dvr#qfwdSsf!*F{AMkTzGhp?& z?C?A|xX!Q4MAnqe8OH)5`J>KwZtNt<-o*%@^+>cJkwFVU@YKf3>^nGJZO;(4U zf$fHU;N!53E{Zq{&_ca$58w0Jh1uVK`OUlSJ(RbN|6H`Uv`+6|-INb6JjTxsw-3&B z4$gG}znS~HwD6*|&?zl;ON*W2Qn$F&c9(V_6Z)uontR&4c`!DR992#CWOLU{uN=r% zYK`Hl@jVc#vig<@=|_z+POB$$zG=P>FlCp5rYWWXTIiqR1elfv{Rhv z7H8V-44;6{&9Q`qREXnD-&<2z^@P>b*x*K1bxBqB`c=xRiJ+uBrcALW(oPQg>o(Si z&ty>J`U0taumGA?rN2tbL=ZE<9qo4;p)cz(kCYiOnI2HN^YANN0xo}{^du>PckZbu zCP_$t;?uBDGZQZX`XhjOj->7kkS=iXQ7Nc-dW)5uq*bL-Ulk1x!rwmH?eZ2LUk zJl98BKb{!qFXA}1kLh4gIu_LbA&2s%o|W%e6Ro9Q;ZSdKe{cM|e#Ww$e-Xf24SmzL PGjGjI-e|e{N!h;#Nj)>J diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/dice.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/dice.cpython-311.pyc deleted file mode 100644 index 11f00a6b0cee2b156aeb13118ab4a04d24a90a60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1741 zcmbVM%WoS+7@ygf*N&ag5*o@wS`~q01U3ga5LH$4aFaMDLD;BbWofk8nIxO6cg@VY z;3@|r6%iy_!~sVXO*Zv78>$bo~krwC5Hxk?YHC%)OWNdh@BJM-Ib=I8nL zd-}&hA%|f6_VxYsn;JrY%FSr#selhD2)7YM6#J-!ZH%R?_)1H))s|*!uve+(>n+1J zFjCM0qWTR)4QA}A2;G5|4m*=@8Q{!41sGUE#-!OgD&`)@Z4t*~P7s8V6M11Eib`B) zy!Up6%q>>tmX}r*Vs$3yKEUZO#~aLN8{BEFu5B?la#MXN4nK?!tFZqBTwut?6xqtV z;EJtMg=tj12wWCX4P-r)na*=`Y!|I#n!Ay=ja~F1wlj4!dKdGtHt)IY`o}p7Mq|?x zR+xO<;;hY?U_m4-CxGd-oQP42wZbjWiZ-3dqMm5`P8WEKI{^(_)-}iPuu?A3RS!Gd zWz*JX6t%^4x$K6Vm7<}CrI2rw*TP7YowoM^1q+fpu__`S>&Z7_)eE9nPgKU|h_sTB zc9%LqDoQvZ;$soAKBr#0$KLkfI)+J!T~l z%wH$u=n@}?n{k#9*LQ>{=%uhG3hJ3p@7g8_SXl{476NQ{Wl$tEK)~tDJ zP2olC)wbhqI~zv1 za9WV5I7dh;q#a+%c|zXrIR22y5JE#2jwc8?)*KKgXj_yx5Eq6aa+&W#STR2bl#m&^ z%%|k9vLi4h@dW@lck~PtO*aQfLLTW8y=t%eQMIp4_qFj<9w_&o)f)U~@v~Az;#-mlOKv4xfF)i5I7&l* z>`ZSyg)>vVYJXy~x7dI3e6Q9YpX@EjCsib`gNd?e);rM5P&8cn5*tw5&<$y2B;Bs9 zIfC&FkZBFbtN$|Tv3W5qy-WOMU}eC?4*&xdW86m<_D{|O^y2<$^8i`(E d$K6X06Xwxz{&fRCH9-G`hw|*vDMS*GzX75Mv`hd1 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/document.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/document.cpython-311.pyc deleted file mode 100644 index 81389ab6971950d94b47235d3cc71f4a65ab1f91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2093 zcmbVN&2Jk;6rc63Ki09GPe>I?v%(ZumD&==D5_c|QCf)7NC`r?rjw0l;%u`Y?##N7 z%0fY^M38`6>46?m5$c`4fHPmgU)JDk0BdCZm>Txm9B7FHtp>aLDpJKd=JZ_oS(Y z#kEgY7U%PuENpHEg|1K)0N!{t(1O@6)z@fO%^SROOhtv0j$_*CcH z9j}MoW+fjdyy~|_gU=Y}I6CW9E8Z8XG7w=F%Ry}xmSUmp+4tM1FCUNhv2$mDkk3Lr z*lN2Qo@G17#epBW=}v|zPcxnDPs;c4&4t^hE}I!qgiWG^?2I%2Ld;Z{mhBc7 zVUAMUvja*^Jsdlc0hQd@r1ZZ7iPzx`p-ySTv81F_!dHeMq;c#Xe>gu=|HK#D^*Nu} zUbDX47FOU33c##$??HXZ-l$7E;8$B#V;iwpw`?D;dKEh%tNrFzT07z*M1DBhFLkAV z>N1$+3b4O+Npy)6-~4Xjo5gPze=l5&NUm7wUYPDqU+qqn2NV^-9Q&dY8Gkz(9;moJ zaiDYrF^M^nA7`{vXc!#}6c&4}XmH1YmMY>BSS2Fox|qgQ z0JnspAR}Nhx%n~YKR!- z%mEWdzXZ$X5Vl~m4c8M|An|8}u10XaE2J diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/downloadable.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/downloadable.cpython-311.pyc deleted file mode 100644 index 77828d51d2fc2f5229c6fc1ae0beb8503bc4d52a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 526 zcmZutu}T9$5S_hCG=!YSQvHGyCap-YF<{{t1QFplST@;BIC6Iz_cltp6Z`ztzhNXb(23oxxB7y$=Pd! za-7sL$_;E|CZ&eF34O^pYxyEs?|8nT9&c9iNrBRk1%lF~NNFJX05dcxQF=9C{vu;W zS|yv5vM`jIX-|d`rOz-;hnO`R2kxa*J@-g*FYLO#fnr)J+LGE8;k9dfEjRMC*z2=) zk99@lGEa6D3u=1U7g3F`Ojhj=Rl2XtP((x-M?Oj!hTAc(gN;H(u>-W>#rc z3{@b|w6wjI6xu=$C2h&Q^pEJlhaSY93_azh;2cU$eY2}ol;B)Cnt6I}-n=*O{ob4X zwOTDB7=QfmSND;L&_7DZ2gqvRvk!pYLkuzOqds;pR=nnGecjRfhGT%NGs8FgmSbV0 zp$){$JBV4_y00Vj09H1f0xRsGTJfP0YdBe;K@i3?_QF8cw4}QG@wFCNd%v}|wYj~K z=dx|ZZLfXbR`HH zcw>$?GoG8G%ogsVE@tIB700@ZKE)1%n*Y}-$#N@j#W0FFTN9k|Aoi#)=~ob6*@m&s zr7OG+mo}p@wFSR9@Zg-?4Ta5kYUu?%n+D9LgZNO{yO20+HC>-d**u_Ls1mHl!-&f| z&u=3UXroZX1Q6(hU40hFwW+3+DGuuP4(B#Fw-0i-?EH+q9=Zc%o}z899L8}Zn~jDW z3SN(=;MPOYYvlJ`7To3DEeP?d7eE^Q)N=KJq&ZRB4f~PLV-D%5)FV|zJM5bFw`g9R}Q09jJzCvjVII^&;K_<~w{3 zdOgnduyY^Q16bL(G1D;Z7$0lLI>SHe$Hp)C+w=v&OVGD#x&VhrR1~QK`5nPaFy$cP zA}JE$1zt=@%}OrJ1xqCNyM#PvDHg#zDG`!36d}?AS@otpda}RXZ10ESsJ#|4sA&6W zAZQ#40+_aWaI5{H*J(>H=2s)?9?>3`?P)tU(spdjASZK}*Q23WhC4pHcpkX*Jowk) zhX#4bqc7PS7R-G-DHcjV(f^{Q)I;WHj*3_Fc((y1z@|HZ zZU=0H>hQ#ZfW iou}xnlk?^&vQM6!6YDjsazCGbzxpWEJbr;b4e&ps2<(Ue diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/encrypted_passport_element.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/encrypted_passport_element.cpython-311.pyc deleted file mode 100644 index b691eff9e1f6d5fb0e4e4c89d7aece0477a1f768..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2417 zcmbVN&2Jk;6rZ(c{T16uzml{`8ny{LQj8ust0XI~n_K1p5@B9@UY>C5a4=56+-WG)e%8B=Oy>0_k6vl7gzTbOqW<2wL zGy8ommm$!8eDKriC%Xyx6+zVG(2%yOVB9Af(IkU3q_QNT9W!E$csbsnW!jL-awAbr zfIqHLBiTrmQxf5EkpL_k=|-lUkw}az5-o9;Xi1)W6er{{JYg#jX{oD3Nk2iTNZycY znwFzFx@Fo5^>WufxU#^`zq4@u;?nY>7k}H_@aQGocD&T(CMK!I6DjPOzs3!|Ce+5| z>P=pAV65yF)wY|Ka4zTuuZ8o4Ivu{GtzW?S92Uq)S<*;3_C74M9M@u;YVmUrOT%Kp zrhOY0t0e#@2RISn)Bq;~oF3qmmVx}C0ZwaKz_|g=1UNsyLjfKh;B3%;B*Z)?_G2NLDkOhM`xar(^oGCz?=XOo# zRc;qFtJcDRU9d#Ka_U?ZqFpUSeG9P7VUAr_1=k9VGt>rWMoc)O)@*?%(n|>Lw1nx=WmsYjiH{ABaUPx_LZq!LV0y2kB_s#|!2l#pb0 zX+TF7@safjS!`~ILonZ+L(eNN4`SAe>>i%& zT?e?;gMFy<4;GO~o2>j4{2{=!1 z0K@X(MJ5uck{F{^6}}btLH2TkV}|#!z-uim<1|{q6j<8r)VYvgZ-|osvF7#zP<~vJ zB$piS?vzb(ru%QQNebPavKb%oi6p(`(i7dC;wRpeVEunr-+uZVdVl|iQ1Ivf1cm%~ ABLDyZ diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/error_event.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/error_event.cpython-311.pyc deleted file mode 100644 index 2e96c85a24c754f7e461d971645be22516f7b572..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1514 zcmbVM&5ImG6tC*9>6x9$*9P4{j7`KtLw3gV5+t&YYy236-Br>I6g^!vvz_fPtGYMY zu!j`_Mo`g%1X00*L?jna{t@C~1P?=>7ChxPvK}NSUsca!cOkj>rs~c6==bKm-+R+P zwOS1X^y|034}a4T`b#QvGAjWedLZ0K6j2f&<2Pm(nE^Ds?>tCg*d8}E0? z>YLrwx3BlsO8vED7alsb!6G)|e*E6xCJXXMxQewlGwSCos4`c4_CxsaEzm!K78vp{ zMV__^t#~@sm_hZc;Hx8QfNWMWGkJq9+(Sc58+V(Ybr0RfUTq!Czujip=yIO&?hZ@x zJKr}PpzBG_c;ZJ6lg2BK*h-6tIs@huf>9?=9nJz4?l6bRP~qI#3M1xZJPnu-VKQ>6 z281)@Y3$6KY^dbxX~6@w;%w!4CRRF~Amyx`&v0m`eAF4Fx#;*=_>#)Ltcp;f+=l*2 zt5E2a_3rI}WfI`B&Yp-D$x%CmWV_T)@-QIVw|qVlT&_WBah4Z6DUDv5us~ui2{r~< za2F85hu1*(8s7(FKKFy=0o;dhE4ul_L$y7;r&0W!wx|Dyzfd~`yP)@6jYB%bTflxs zum+|mGR8}rkT3~zLR_;vd#p;qq9GwiG5iz+mUTjc$QObTA?ueD+JF4+>nr^aQ@-6_ zO(`JW-!8bHr-w6kO5$0?;^Mh@F#6;f@Q@LuLd^cmFqp&3k+jh3g&qLxn zi$~D4=M`Q6hj<0pzx!xvq1FqZcRyYGZ0*nH#c^}6X(^on=GqdK#E%&vWrL77r9~v=CLtdcel+vc2%%{J=F@~6`-cH& zhRh_}C|fhU0v1I8G3L*KRmf>wwr4T;CFfSmo%V?05Z w$0yGLdU^b`bAXn|C(nU?W{NO=abjE=pFC6RES6|Joqu`hZ{_*t8Gcpzf3paUWdHyG diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/external_reply_info.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/external_reply_info.cpython-311.pyc deleted file mode 100644 index cb155873a364250245fdfd839e33bb927e1b7a50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5836 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 b*2}eO;h(T9*hhPOn)rt1{PREL(}(ZhlU`48 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/file.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/file.cpython-311.pyc deleted file mode 100644 index ef730d8f8b3d890337dd67f6e8783edf3d7a7894..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1943 zcmbVN&2Jk;6rWwMKNCA&Ra1pRMg##CtqmNlC<4+X1cHl{pbFP88GFX|*6Uq&W}L(& zhagoVNWcyCK#!;h^$dRiXAY^v!P-+KPQ4k01ImdvyS9_4<-&OO?faN{^WN{hS^tzy zrx1)^fB3z&lR)TCEeuCAWQ>y{Fb@zz%y3Z4C>e(4O~-6SN|BaTvRctn6m$`0Ik8r} z6gQBG))0%{M=ZwUk0J;?h9?}Q1dDH?Y~raFvxYxLUDs1o*`6!25kI~4>BlQ%`TdpU z57&!pe&k)Z>nCouwV66kjc`w9i#xn7XzOO>4zH?e=sBcT_%coeFkeB~9F+`)O6DgJ zeksCCZn4NB*piR}@YaBb6d+iO#Yb|CB|uJwGLMT4i^4DU&}5T`sAjN<`k30~^$r!(Rh%>MOVye4UE6W=;XBl^8LoK(gB5a<3crOLUPt8ctp<0` zHt@Z+4GCU@>|DN!J(uG_{DR-@aH-&kN*8nv1Yd{X9V%sEo7$ePX0F9m!(%d6=Zfe! zb8B3!!h1WH3ZM*7Y0*8q)oF$3Nc$ew=nbLM>Ad|W{^-4M!zRR7LZX6I^wK>sv*@uBzKz58cynInfwG#>ov}zBeAg z6;neyXdc1y7@lz48CjUQZ|s}ViF##d z(A)`lL)q~#O8|d>RKNvrWwcILRZME4GY{%0W;AyRNH(Q0bZHAJ?xzT8d90(W?~fC5 zw?mzQB~A$Qs-T`A2G>Kbl1q= zfB-0GzrGoZCLm29lPEfMuyL^Q{+u%!F*!P_DvMMZT99D4%UyXg>XKx7PR_v z>lt;=636jNeKZ@*^rzA5*LttL(NE7L0n7hKlG;(=ZA8S?VN%6xQbSqmz*PY#h5m2x zW6&VbQ6WnDE{T{{TNNs~&@hCcT-IFRNdtA7SPToYBwhtkBPhQB(vKL1(L*mEU7W`# ffArt;7~!LfvmeVEkjAs*aOp3t{rfqlAh>@4yG;p} diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/force_reply.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/force_reply.cpython-311.pyc deleted file mode 100644 index ccf8ed6be7bb00917cad94bcccef620a08fee373..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2903 zcmbVOO>Y~=8QvwApEBh*j*%}1n8r>h3eplTP@olzw6?3Lfn&vpl@?`WtcSZpapUFA zW@c7010RecKvSU2Eyy7`1_^@Pd+JZ-2)$D{AtN- z(aJ20!OnpDf*FbVf~8t0w!(eGxMtztxNV5K235WhLEhSzrmYtS@EEN;NzmEOjc#{b zwnGN_JZ62t!~>(mNMKKFF-Rj?d@NITz+*$3`$}+A?7u!xFgd_bZA7x(AFtE**jB<~ zhB7s5$a5YrU2|WBgAhROB`VzK{+NwqAlTKRF^S&jc73UYYi7Q7rP}KPfbI^kYpR64 zG@G?fv);Jpxole+rqd*miV%k}^M{a|h%_Ut1F7cNi5FmiXZm8uqXClx@VnsudaA=1 zZerZ`Wf~i|nY)s$u5Lcyqa+d=tE=o9%$D#EY&tgCxFgZMjppmpz@&W7JtfmbGnK}0 zPs~nXU6C<3E94Y-ck z4NJGu5RzEfX@($kZwMPt=`2ywhre9bz8wj!MFC_aNUn;_?QE~H_6;ecH5LPIBq$ho zP=v-HR2l)417R{hcWC$)N!(>O1;mV@c?6#v15d%WxY(~7$QW@=b?n;)P|Oa-?YVs5 zEC9wf#rh197KlL@;nOI#?aI9q-`L|wYfk}%Msq1 z2RV<&`RT#gfmHW%=g(a@BjXMnc8UX1HQ5_hvkaZ-Z$Z_BEM%R!x`>>RS} zqIXQK=OyC+2Vm%X_Yb(*(~9oStf~YKr8sl8p#h)nD@tX&HN3cP?WfmK_{{zsm!+Ba zqvdP7-{CFN2aBGd^w54-dRPwZFUt>|uk26rs~A^ld0Rb;!QWb)QdYrfCsbDVJW`S8 zb*kC3Ck*s}Y2bPP0Y{z3^sM1|xu85xS5c>{iak2I^~;Uj-@s+NHzbLD_kOClk;;RN zc166u`*zsh)zIsDg22Tsrgvv@?B;Upo^XYmjMa-+`J?m4yCdRl z&U)U7zcFZCNJY{Aj~sT^ni1@aD1v8f^)k9N`S%yX%drzlx}H|LqU*Lp$`bE z;D;hck?Ir$N9Oc#WUB_%b55S8QobDVbX31uIOPr1MwJNEze6@H+qQjZy*fGlJh6T{ g`Jv~D)t;Pwrqxv&i2gg9oO}Hr)cnu?(U;r!Z_rL_!vFvP diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/forum_topic.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/forum_topic.cpython-311.pyc deleted file mode 100644 index 9015b624fdf343429775ec756403361183c5abe1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1604 zcmbVM&2QX96rWj-_bYMIGyzHy(5g_-BC&hu0TERQl!g#Kc99Zvu zQgYZzl_(NaTu=}6h>B2e9QZ3ZY$XnsPmwtFW)u!6C*HF+Nh`{Q@yyTfYo2C)@7X_D zR-M53^@rcKZkdGqfy&7M9S1$?0Ny5o2|w48iUi`0`sT%kQjp zR#W4Ra6hef`{;K32ejBTwIO}Et(>5{xhvh+EixC#iWfcdLHG)eEs0G9u}dGo@ohtt zBooFJ@YRT5Ae&OFW8H8XTNv4hF|<|BL)W8$a^+HECyx7i zsoi!XC0p_MqOC}6w>P6$x1GNCT)sKqo9|2wFO1WfKx*x5OCIki=?LzL)X=d?S?B~Z zt$S`1ayRlL)j76K2>loWK1t^a-$2Jvz-18ada$`k)eNwdF7mTWao*n-P8fSG-}~HA z+gf3Zq-7=JfeKUBi9+dOjc{Ngs<0-ogRX+`J-rQm5ufOAB~Yn;2jqc!Kc0y-A3(HI`TcXg@vVWjqY%aQQH?cUx%IdP;o)T1ZE&wB5A zn?3Et^5wqc?m-1~&+#H`&vv}um%5#oix;)-@2d-t`r7OntF4pcE`me94e15$ja_QBq28P_4)yeGh*~F=ek%a@LBgjUYlf{*x z5@XsdlydHJ8xp9_As`KTQPnI;a{$d65{ga4d0OW@h{V80d6M%_2aZ4XR5%xr3+8Fg zANr($?mRnoLw@tr8k6iw--i-WH4iS0wSQeLU=;q4a=`Ac1g5QuTqnT|wS}MGD zLBf+L<(ZI}$d!2kdN diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/forum_topic_closed.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/forum_topic_closed.cpython-311.pyc deleted file mode 100644 index cb759b3c6aea672201bb390ceb904c2af894e9c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 771 zcmZuvJ&)5s5S_L2rEoa`KLD+uNVr#P*uq^+};X6#M|X zE9gOpo`%0baV1KHM0H(IsIFpmeTNjmc>Of9>v?ZxydMXHKA?Sh|80Jc0Q_{pm9-m( z?8fMvf&f8sC`e2Qh(LsSP=s+vAb`gpT5mzLW%wZk_>6C3aZ7ZLVc0!);gD>u@v>Bw z+f0?_9M#<3;Z){wp?UFi_ClsMZ895lpP-T5O~g}>5EB7$AV?gF0ExrR^+!tA#Z*;U zI?0uh;?>taMVl@&LzQQwT2@*bSz1FmHBz5ssicK8hA$-LGgVvMpF19E9T81E6U|C$ zmy)JSZbx)dYmF57nl4o?3@sI&V^ZO}8TGyDv8r_{$8>3JWyVpIDlJF$vcHkii)f~- ziFlRW@p@jaQS&hvVd# z(yL^mL{=`6Rjs*InxR@E%ai0uHcL!q<=u*>E9}}NJX3DwkzH5PM7|j2t6@z!qiU_Y zNbRA6j=6>K=I^r&TJ7Ez_COD=5{`y#SN*)UwZ`hTyAYe!jN|a#oobj5oaa*x(Yxr~ vZ<>9eZ(!*Dym^kW4GAIN;r7}7`T_K8e{DN$f))J>?_U3MyTAW)V5j2SijMAcPQsHb_ZTVHORJXOcLvJXnC6j22XqirPsq`$}*nIEZ6|(%+%JSQ5 zomFkUmLBNpde4}H_z^DNX>PKZ?T8>*-`ZoL3JcE#+QkE(d?TrpPZ{gYbQe zmY7Ygt6-}kYJ=>IzB>C|1cjcM~v)34k`A7j6|fyPhof}Vbp zi+-}ndr`P7SfCia^=;jSvAG*bm*)Yxg7pNGELGACT*<_ZC}eKJqzrbL8*K5ug8h`; zbhnK&R~c_^Sh#be)K$C84R-_8s^_jZcwdBU$=y||CzsmokPFsQBTiae?6kMIlI@@u zE#wY!eg!B$*kg6yo`!@rzBZX-sT^3CBMXK!%Pg!UxX@=>G3akm!XRm|s6}|`E zqsDgFc>wDntYYk)S!n4HAC?X+itk&8_V@V9yf2}*td3`iNjNT=227kkBCn(!+3zu- ztAs>pqzLiKdgifUiDdCMA^&(&OvCHCMo1V3QW7G|pqu)-gVSqoEOoDQvEN{8m9H8tHYCQAB%4e&eul_pubcUQpb2xW-IKMbtd^xLtmTzTMH2Yju zJ5$ZE!eFEmaD}{jkvJ4$#9PBihCDH4!0?b)Qp^}>7Qm|+GEEl|qU(etoc3cQPZIJ` zKZr+`3L%t-usub{W49fs&b^x(o9C<>BbGxJ$50+DE`v#$g1;(E(!zYJa;O@^cK|@a z-@mM6JJk#sm_$x-D@0G6u);q_A5JE+or`(+YSk0R>`gy@F7&GCNULDDr7}EEL zYjfMbw7$Wd*cpV$9>sxh@DniKKw1o0m?BI04AQeys#x%OmYW*+usl`IfmDQ4t-^CQ zt#4yRK1~(4^nHb@ProG#IvkPaSc>(kkqt7N&*k6>DM_eTA*^8X7*U#pIQbLf-Kk zVdOf?)QuUvwpTJ?HLkeA4718i&LYkP3u0l~reOT4>oC)2LfCC)+UsE_HtoPs|J&Z-&j@+5dIrHsD%luapEwFu- zOu9}O5T_&J&?n3fH(cVEEysc2YuWYNg@%LCx8cdM7%4M*-sH!Bo z=tPVs1w!1wjR~ph$+1H@5y89`A>$Hw89b9BA&zGYL5Ps!E&H+aq_MQn{5<5F&Bc(q zLA$xx;dUHy0^l`SaJ6~SU2h8L;9O)oo6s52wB1n7XFcAEn5bvik_=qZN4FMj@uLv` z+SIeK)rR?=1hbGQ>)#!eoqtZJu)qQ&@Re|lx7cP&5Ofx12 z5Cv5YiG^$@AxVi4KcpQ`@?}E4=-A%Ck|%_Q&JY-hL86M7Cr1degCLA;c?toZtnFML zVGjQVlvR@$1N0o`d4M?P$H63I*Us}v`Bq^_WZ%VKK%lzul`5KENRcFEbn5KR((dfu z{EfM;b_VYI+L@mAUhmCXS9|r=>@V~Cpa;HoU#q1G(l06x^OGq$s#nqqnt7x5&bw*R zC;~Vml0(N&-J1VlF3n3-0nNPi+x+dh{#zw9{dzhf^<`8!mKr0cvHSmXMfu_E>m$NX z469wO=93)E0u0X~$TDz^!Kl=-QQ;DoK1xR^)H|%|W7DNfDaDk*M#<+*- f-Iw1F(QNnWJI$TOknHnh@9V#%_MaD+vQ+*9RFjTD diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/forum_topic_reopened.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/forum_topic_reopened.cpython-311.pyc deleted file mode 100644 index d84d429a6e29dd2757eaf6196c09286ccf7ccebd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmZuvF^|(Q6t(2zWYD>E;ef7gh_X~x z*i4n?64l(^!5DIwX;D0xyoA)IO=g4c6EwOxL_8-zVk$`-NE(MSK;m$9_)zJ(7^^Bv zpMt8O1o`@FkD-m{nPJLvG7Xgm1En=gFa!E5OMw+&jFpE@RH9Tg@tTr4Y@ zodZkf!VcMStu>P5OEy=zG^|v3j%kJOXxQ_*r>fQ|jM&`T%8a5YRT_r&y2qi?vuL8M ziA0s%_KIF`tLGU`2CY?>^HLPR`Krfxp=6yqf1mSLwaBkeI-EniZuj?pj=cOI$sX4f diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/game.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/game.cpython-311.pyc deleted file mode 100644 index 3a2f37e63f4490200a5c0cc2e268b75e36662d3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2096 zcmbVN&2Jk;6rc5uzrA+aq%BR_XlYt13mStEs#Hp$v}xMXrj^s@zd zOq<9DBUPeEfViL@=n)lFy~B}zfP*7(SnVki7kV=a2b2@<e_J2}wvLp|dZKrasU ztWyHrNOYbP6(<`%<;S`+@sKQQ&iI3}m48U?YZl-$_^s}X=)B$J8$T3G7&lj4X$J9e zO~G4&OYSRa+U5%Q%$m0(H{TD`1zW9hVXDAv2yQEG+P-6Q$5pYLe9Z*2D@?f>2xa=P zQkwT%&ok|YGHq$LefMsgo2~<~-DQ^xIa`ST{YKCh4Svd8RjMUV)oP7E@L9E+gxNr> z)RqDzYj(?>!TrQ*B3&vGr6C0#kBSbL4dKRl+^JwzZx3^_7^Pd7pM@P`km%d6bTOie z-&Z?_hm-NLk=!mWMg}@D+^}-F+!-Hw4=Z9Z%G<;0(8WGTs5pS^Ah2jZLzEe7tvfaZ zX|T0>wpft@+a<~fuG+$n=tAK0238-A47}K9MMAXgiy(ZhJ%YMd13Sz-f%h4_$+$DL zIH``-Np!XxGxA+8jkMHh4ZKC9|mHrelBoaf2F?G z7PblmgFM%{|8f0_yHuC1;wM^mV-0#u)@?VymaM7u7MHcSEL-csgs2+^LOeUz?J<~= z*Ma@fCH-k)9R6bNv-!{Ge=Z&Blblfw_fLg~jw9c9Fr0ohoSf+!Fdf_aWio!WUm2?C zpBPZuhM1%}mYll+a)M$k#Zd0Wxfst0l;R@Tj}lgbcnKMz66an_p>zmXwTMV#w=fnJ z7;6Sj+e5j;*xk16?OL*oIY9%aD~!Exvq2t4Gbr%diE)XHUGy8=^B{|wI07b##qyq* zL9g2yCu;K~o*JlVb4qbC#Eq$fk_hR3SiOFddmXp>ga^+IYZJJBao>2iO9 z%p4Ejem6YvMt{$NJf!0Pu{_3#0}h!uIym}5bqrBoZbK&m>H@zfQ3k3E$}+(cTUB6F ziY(gbk}bKwa!&G!ts0f#uETFaa#O4e=v@*O;(Lcl_%MhP`p0-rqZI!==3pmxI!X8$ z@j9rO9Qh-#zOHFnNRISIX^Xto`!CueW^a_X^szqCwO2xVv^Pp2J<%JbkRI!eQa@AE T0KdPphi87n+28-c6d&+UGc72= diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/game_high_score.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/game_high_score.cpython-311.pyc deleted file mode 100644 index 34a6bf5b88a5bc2d60ab6caff6855572df6d8509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1730 zcmbVMO>7%Q6rS;}*FUk75-7h#jHpoM2y6*%QB;wJkTlRhl@!EcG#&4b?QPaO&dhFu zQ4X$Di6Q~wf+~Iv98eMJ1qq1@7sQ!E4jiIAMdH+(Q8=KUcr$B5f{H3Jo_T(6-kZ1Y zeecbDQ>~T}j32)ErTx8)&~I9pjC{u6Ll>Bv$VWa7Q4hNqYd#m|dX{VTY}W?a^6fC+ zb6f`_Zb=8^d|2oe-6BRgw1Rx+I`RwLxn&`A8&)>ll3(0FwbC6e)^Iw-qDaIn4n(AC zxwN|Z*6Yi3X?1z&mGkQ>skIml?%>RFdXtB|BU$gY))nr>aMr%0xb!l=86AHHAHD(d z`;Y)fF7}a|y99~2mY?IcZ!LhXgnS$L{FvAKPR8@REc=xksEz%p>lN3zf!@V#VFOM6 zYt^*6!g_o)=yW$cA$hV20hS4j&2FHGFwqgo`;sdj#jq1`BE=37Z4!4m>B2#x^hrfx z)(Sak3rQI1fYZA1vl#hc$>KALu$D+-!ora3@H1CA>4?~vM`EX5Hpb`MWFV4>jzt5q zop5FFe3tY>&J-tJmwQ`8dlHExm%DM?SM!aAj-eipQLPKvX|zPF8f~^s7Vd9z_A(`N zbLSwSmlrRRpMRX2%L3YfZ+Lv3+{Xj!2d8z)8V-Yo$tJaeC{Bxgp#q(PEJCePJApc< zd1IA6MUSCRX@B6eC=NWjwZmjbN!`M!BYB+2D7DuCeNT6g9=bgWu%-~ghv$I#6yJni zjVF58xdrPstZZEQTjS?;@osL{^6{6}uKhLs*xU%{WNW=<$qJauswUGwzD3ZLR5<6vUL)oOJd`uvGD|P3gZ*${9GGmMHZ?rWB>h0a>>e8Q#74(tPtxA-9@K!VjWO zb1RW77Lr2EnmoGNd^Kn_0X6`#7grJPN7;k z%MGv|L!)bH@R4Rur)r8NPiXD|Ahn{#E7F0|v`lGF_(`bw3Z>f#3&)xQrM~cBdxp{@ z&j+9h&lxgVrPVQp9uGqRAInETrF1!8l#gmF{RSGMgHfLYfkglLjdF#2afCFPMfus` zh2e#37xwKJ_U-B6+HmdK8ZbxrnS;VZBQ%wN2ak${5>WKNXvuiU{2Zb3u}QG&wXz1L zoj`X3Fj9AP>Og^^BeLvG``azJ_ENWc)|Cc&lktOk&$!bl+$}C-7@w7=LDcZ5&wz|9 zjPX8tdhhr=K+o*mYaSr7cYGdLCq@Y4C-&{f_m0nza|&yG?oB^g|J`W*_z%4a{V(ZJ B&LaQ- diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/general_forum_topic_hidden.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/general_forum_topic_hidden.cpython-311.pyc deleted file mode 100644 index f40accd75b7d640e2152431850e0effcb86092d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 741 zcmZuvF^|(Q6t;NP5!#h_p?2TRG zj0?mO#}%sa0%H`RBgCUOh{u56#|V9LUnh%*4^Gi^_|v;nyxE^a1%+nyv*ioOZQgGS ziz5uOyX}?>1ZaUdasYS{^T>h3n>$A!L9^ma4U+2P0=5jaUyy%790NB(?;Sm&_*Qu+`cDRclhJiW?%8 zi@QTLvqH&a9Jo(at8C|#sWWlhQ&aj)o#2(*E{E8bGQCB9mqB7lt?W9O2cy^xO%d@}lJ^Otck4MPK*Y_8v_c200yt9`VRS7^5CKLcI45@d)t82%#_TYh}^n{S!1D{PgY=ZzgjnA=j*WwtNMd&AM%2 zafCs3H{EiM04*>_4gfDA-g6+)=GGBN(5!r{bW_b$Ewbmb5S)X2b1@=L=7lgs1!$t7 z)?h$dLl`lj&qM~K0%KSXge_HLNe4$xJszJ-aTyqI-d47 zLrNv9fYQx~(n|5B^!5RzuNzi&k?WLll~MW`?flJMzI-%GUnspw4;2?OPgjj*R%z;J zQ;=urQ?X2quyC(t*~(pmNtsaoH4?k7!6aQ)G^9mCUUZ*WT(7lnfuQ=%Ft?q0`*&=6 z{lRdHt|)zDf8f}?-nb)+1DWvH&@E%%|GIM;WDdE(SI!We%?cfVbo V+iL^tc>h%&CcpgO-~R~(vOiNI(g*+m diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/giveaway.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/giveaway.cpython-311.pyc deleted file mode 100644 index aa83d411ea1d5fbc55c1839deb8bdaaf233ee2eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2229 zcmbVN&2Jk;6rZ(c?X_dO`EHwj;HH6MRgEd7AVsAD(kgs}6qHcJ*3oFaJ4v?L4>PlF zaAiRcl_(N$Lp{(VDnb=E#9zU|kvOdO6v3%Cqi{eu@!qa&56;&Ug3$Ko{x1IXUHw+1%;%@05aMCn((Rzw$V8ARH(1{xX8Vpc&%`Pjp<-xMaFD{llrL(WyJrZ4zx(2MM>FV?Gd zKaf?UVV~~LjOXp;F)KGP;;WHr!b=J$FcM8}*`CLRWD=a1m@;NTI-<1g1yLbUGShE* z!O~u-pVJ$4-*;A{Vc&CF%;Q_kyZ}CTbITCxQs60zGJ*$9;YD=G_qd4#j7@`HfDUm}b{B#9 zO1Te5C+O>8gnZX9tW`hN97Z`@w{+G4@|wisP_glw-_v3@I6tSRGii zNxQT6=9RhH`@Yz$&HI+^t=Bf2!U%l9px$cSyH#7X>osWy{9MB@H=&kg&9Hqu@718y z;Ii5;$Js_pOoQ*+BmE@I_IL0s49n{Pf7~J6X;M7##nsOiK418`aJ)Ps+TYxCF*8D)w?^a>s$}D`EylC6?SP;%T%h_5q7lPJssE z`q$GFqGh`OeRFV4kl0wQhGxsWz@vg2Lylv?VJljmLt z&tD9y7Z5MM)}1((gVg>%$f3vB?Eu6x{a`IsN|>>=Cfop!F@e9rC<8SNMV~|;uLyy^ zCy_-Rts9byT+HIdD)1K`Wz41wd^f&ilT4IhI9Ud>v!`83isG_(9z;x={2rj2Rum;9 z)18B~LoRmyjdn=6bC7n@!(Eb6PK9);bC5z>?i{3U<|PH9@^`rR@ozZ#`#-4S?feOv CcTKkd diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/giveaway_completed.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/giveaway_completed.cpython-311.pyc deleted file mode 100644 index 1a6e5d6104170d2a4e67a36b6a43db753b96d5af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1756 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inaccessible_message.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inaccessible_message.cpython-311.pyc deleted file mode 100644 index 1d4661bb40683fd5435d368841863497a410ba55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1711 zcmbtU&2Jk;6rb5$uRmfZApzB-Em}T`v7Yu-o7_)=FPm{ z`;8w~DkTK%=kI>qDdZ6PLmA@+wrcoj8{}O?5yb%tv4gSFwLlAXM-L6h2y;#j=5%TV zW|(*K7%`ojVCRBDSagaQX=oKu^ERS+mVcll^aw`QoDwZuLw518GHskpxlt5LSNd@z zY(1%5|LDCHvh>c%(z{nSRulcLsGH>1eaW~RJjU6U>Q%SfWLF~B^Oz8RGhkQY>$Vt# zGnRH;>19V{(#Sse=o3)BfV>!TFh!2`KIG@+W;2sl zs7Z_WFrB%Bb}*g3J?-T0pwF=b`Ha8zY%+h!#cn<lT>;L3Nk*-hTWW{gWqjWk%51QciaBUlYvI3ry+O|fJh7vE|TbeB$Lv}OMJ>T@Ew;%#rXL3 zt;C?N1km}c+H`@Ok~kslE_Ea6dt`6l<6jTe4)B3?pi_KLKQO+>-=v%cp6MI5&daczPb;Br`UA4H zBqus;#*+dee&kC+Y%`ggxGWJY*dgRUJNYxPJt-361+EZ;2or2oSgUvZ!SZ6`!&L1vb=hq*QJ<^`8G&AFcljAO z;^w(ipskIsejZkciy;2)p8T^ zUC1tFX{yp^C{>iEpyD%1sI1ev@j0c19Gb?YP0nlP846 z9!$>=GV#s<*fhF&nrVVbWrV56f&hwv`Saiss=Sx^f?5Tf$b?eFPaq)MC%>U)c8~dTYJ4TWbU3)qyeJ+w5)L+8h{f49--0%YCDo_1}!@z}Py>KRZOTIf93C$a--& zRW5>x{V)T)%;Y4uW+o>Oz_Nea2+!lkS@Z}JOZDoDkB5JMefJU}n?PxeDp>p#68qRai0 k{ZOABB8<-tjD`NmJ~Usz3e3}Gf8pYvsq3$&EJ!o>2OAH^(*OVf diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_keyboard_button.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_keyboard_button.cpython-311.pyc deleted file mode 100644 index 376d8c608242114da4f561bc3fd70478663e9dff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2765 zcmbVO&2JM&6rc5uKVv%q5|RK(wn>`cQj#E*wu%rfq){3Hfd~-AO*C42$BD^$*PUGh zMn0q!QmNGTR&i)Al`5)=d;ba!wp3NCJw<9S++5K^l~doFwHH#-N_71E^1kNn?3>?v z&X1W)iop8$+b5;(4-)blD%}+g1m)RhAUq@nF%*+jl)R##95EvmHLq4^o>rpyDA-hk znz2eeA6E!h#SrLGGf_$AlhPM6QLLy{|7|Hv@Nb&e1 zm5|5q4OYI-=($RA>8GgX6u(EeEZf!HvTZpz)z4hJd1a9;e7Lx9VR>cASI=2>KXJK= zZryyU1bYT9)m*(`@@w4W8$z#KF5Kcp7m}qHbki*8#jPd1!a+}5v^UDubzy>h^y;0m zTijf>%(BH-Yh2V9Hf@Jn3!6G_P2J#ybJgmyRkDl0NdqoRN{I68chEnF(s7bk43dvr zhZ5#hBf_bno&jHy7&IR>qM*k@Jtp;dsK<>2_>-ZYfC5pYC)ATNJ{{^Qsb@mH$H+o_ zZ>Xn@KF|+@dd4^i`k_GQSutSHmp=X9C5k;-y0&%i*OUh9+Gg3&Y*}zk@T%ZYLKiF+*9tODvrC$8X=PbwZL5=GMq9kA z7hSV1BO%1yY7`xLU6Drc*smj9_FfD z6Gc9+ZMtsNnV+34+Jeux9aPNNVq>;oyUwg$El&jJ=^iJ@B6Ikv;|ia;{I0vQo9ROB zV=%7!YE77arq}@$Gjvzq?GHnqBWB%?-{A$OSF5`RLw6T@>weNi7&1(D$dM>y!Ex9p zh(ll7$H9H6Ju+_Dv*V9^^S3=6SJG)?awX4d|TRY#3IsZ4>HH z)$6&WfT2RfA!Gx{29XUR8%A~%*$A>RVEz=_4@Hbs>xOQ*QpGyMC}dg70Ja2J2SnF(M765oxFm+K4t{jd&x` zNH$W2@?EOY^MmrW9D6W^)RkOH^ugv=dbgiQF5*X>T9pew!Qd{-E@QcjfAEF3V-7b< zjJZ>je~L)JIR^tfUnyOtkYA~x|o7z-5c5O;%2(U9= zCWj{5gQ1Fh0|!daAV0|s1=Z^XIk=w#C`kZHNusbHZ4!!yQIdF+UI|JmNn{>DuY~6@ zln|q06q$w$Q7B$RHV!Oz0Pod;R$$CeF;=mSnu&6nLCfl9#}jAFu!~^sW$cBYF}U?t z=@dcnu~>OO)4BB`H%&m4B94RAK~TRhau|i(AQ=iy89ZP<{UFL$y@2b&Z)Qj4C%@as|U?fE91Y*OGzEjo|(o2qwdwMi$M6gX0guA-e&@69

    Fgu` diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_keyboard_markup.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_keyboard_markup.cpython-311.pyc deleted file mode 100644 index c9505f901802cdfa5a4c8e176872dd979c92ad8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1651 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_article.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_article.cpython-311.pyc deleted file mode 100644 index 6bc4c671e939e0fae73d6ae6ead4061a5b1d63a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3306 zcmbVO&2Jn<7O$SE`Tp>C9NTd+#<9H}6AuAa5y4`KjMq4EoREb5=(Sa9Pgm^5{V`kJ zlVElv1_^0dY2k)Az;OjaNO0S~Vh?R8hf<#+amsB_IIMhF?W^jZi6>*06*aHl{9e7+ zRbBmlue!b}mGTJMKR^H1z3<8heJ_koOGQ9=@-2YRkbw-vLbjqQiogjgVJEeujWuki zw3MCJ(soA6fG=raD{JSp9N?6Zw(@pCD=3I2*?F)tR?#kLCF#prWqUvykT_=z+C$oq z#CdDj9??c5E?A@Xm^LPH(K=<1YvT$^pfzNaK14>D7QRd(^bK55(@q-$caS>xSeU93 z7IepPecd-*$5T^b>FytIt&){DS68mDZ?1*OtIk1~*)V;|bSuo>tcy56ska>fj}y@t zW9yD(I`pjuWe2yZ*RcG%2X*>biM&I7UYK??>by=5c3hnqH*~h&s6+qcx>IlXE3V_~ zHU9?nJbjl6i#mSSyYAd~%^L0VPRV;W+?rfXpL<-o@6vbs$2~1wzoSm$nNe%vEp=Kh z0?L#B0Qf6poFYvzkd}BGGOr~mekW!GLR#8L(2S8>hR7T;FyPcNoQ`n@`m-_4X;~u= zcA;zMj3U^juAPT$W{iQZU6B64u3eP&P}eRQ!w^5xwad~Tjchu=CXPR`k?Z-5eUUY$ zK0@~tWAekYHuw>GSJ8&g~mz4!AKXt!ydQ4jLwRrCr(?pJ)b zqB|8mimJG*@__DC>X6{2yu9O%+h8?%rLyPyb?-{GT5}m)@~K64nQkw+Y`41O`d(G9 zo3o~z`_F=KFbNPY9#xKWG#?Z8PkoOlc)4`-_TBZBjn(ZC`(TDi&u3x6G{Tf``W8L< zSaKWg1tRvd<@w70U|H-ufk?6EL}JIj6KTC2j+x>?h#l1esYS)Gd33f@jPWXaOKCeS zGFrC|h%GDYsML*y)ozE$2D6UJ-M$^ywYJ0To@r15p0Hq0uf|MS?P1B^YuG!EZd$^3 zY$Vh1x5I&_-Up`P?}dX;JNBr#yXUJ}b_&XXO$&8Ss2QQ26KYndIico3g%?O)#$r+t zQa>pBf%unD22 zg!=hqevQ;bnDQER%EBxmrepeqsO50@*dmEXt$T$0!Wq~CJV}@%q-N=!M~DZXE+mSw z+geB4Z(P~>z03BuR$Rk$cDME$O!r+zpvJbSbAM~Y+}ZMA9M=_hx=7olBi%zXD+%0rl?|YQKz1(;u(?ZSC)C4~u8o zs8lNRu?aph#!pT0`B(Y0%16if#0)>Pz|Su7N|n!CYL7#d3~irABj?)_T~pj1IRttF zQy_IRdY@x}nM~WbKr(j{$plV{KAFWc0!hZ66-d&yB9P>+?2`nRNV536@Cqt3i9{MC zQQ5BqQbDQ1BIk~7Q$oT#A+~EYEP;yz-lcBEo(v&|TLS`!<42f@w=DVi;Q%4WKH3oT z^OR#)%r9~hmSR@asAU1|6jp^^PZYrG>;(}u+EGKou?HT=&C_2yfm7Kw5~_$^URNHz zbgT77fNw=|h;MOR<+#vVYps2-#_?s2%dKmzYad+Wc)FcPr_ycIQ9npjMycodOP5<4 z0lpl`p}6ZWd}6w_65#1b4)HX{3;f({>&*bqMskQ}Io{$kbFJ$Eo{QuV&vE=~KD*Gm z5#WVL4&g@p3ZGM3Hv_Cja)?z9q4O64JQ`roLJsi-j^`g`M%!pHRc@Ej@>|NoSO3r+ zMa!=%Fb`i?71Uc?CV0Qy@up~Ib zG!!0GYLrW{{js!A8KJTwAO!~)+lweOazcHwqKG;bd-mhASNw@!CE=WozBb}30|&5Y zzdB6pBb^vCI)?Sdh@Ce)8;xVdhq1n(K@l_=1^I9!>kAO%3#X!h`{H2M7cmSG5m^@n zlJ8Cs_$a#^71e8O1x&$gZvu2XsVE9Z&jr2m2>mAb|Kt%;gI?k2#h_OnB?p1u%5N2p wmxEs6cs=NqlX`&3J;E{6K#y>|8uUs#eN$0@OegE$+zUTQ*N;CDAYa{o0a%Z(jsO4v diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_audio.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_audio.cpython-311.pyc deleted file mode 100644 index 299a86d1058d25bb7211edbe6197689645a473ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3735 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 O`j(r%`vC`j#{U6N146O@ diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_gif.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_gif.cpython-311.pyc deleted file mode 100644 index dc38aff11af861fa2d333a08d42b3d1c0aa31dea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3857 zcmbUkOKcm*b(UQIKa!}AWqqubKS?OdlpvPofh#4?)5)_c!Ct9a2nD%k>e;G(n5Mz4C}ne z>k%=cN5!Zf6JvT@jDtL^@LEDoib+OCw3MC}(?Ca+n3mDAVwOWVOy+=(YXkbAILKrP zZAj0FIYuY7VSPj#VRT9x)yKp!MyIuN`nWjG=!|w=pAaV)oz*7wDRGKJAyh)jz!yjv z#M!4|gr33YH*s1SdVun|mz2$OUP?9$)0S=3G^~8o%RKz~{i3w8T3orewpsGRw~dC! zud9~r#nx3D6It`(KdDh|pdyb9AYO)iOR>ASD%Uj|jE=4unrh%r>X#TIlvY}D{e z&Q~1jk;0G>zw;h$luel^8#39e*Pwr5&8XGw71OZgioJm?OWwhh!v>wmm#!K6rdq*0 z(n&UU-K?qR%-o_W*VN=BMbvo{69pxw4Cul3JBNgRLe7 zXrJO5!4^b*muDsI}2sgwie`?dP!xT{w2*-@FwJH zg?V~Mtujl;7lXuq+;b!}sSDuaZI8Es^um@+ypXDRDHtqK$4jcRd7SAKjK?6~_9Bor z8uns=o4jOACKi@-Q^Cj6C#tNp&;j#8P*=9MPl;(sdfb(W+uPn?U{Zo3Qf(Dm-ng}E z9!Q;TxoqykL|9Sf;|phIDx0Quda5__euZh%)uhOgd|lo*|H?b$^cJGSEn5w|KjfQ z*3V3`x3yv_suPz+f~)shO|I<0z5N&qon3zbiq;mOe;=auGRjQMf?@LGNsWwVy zvhL`4cX-sDde%k6j2DI?#}@1jNYbeX6Ug5L z7zFm)^N8?NN>9Se1kq5zng)@^k?YWF(P00Gyic{xbo<^e#BwW;zwNmx;r^@SakRqA6op3%g?#f zvxg;zpY@@|&$@isU0nKG?0LGiSUg%R9{$+jVGxBDUu=g^LMv@nS$ER-j@i*Kj$q6l{-dG^n3*ODa zg+vCZaM~~a^vM8^=d+IuGI&Zy^`Fo^I`IDx@-FyxwBRA#qm-jc6TXrS&*>fo8pz(H zudq)a)jb*`R3qDY4zc^YK}Mm|&xQh}n5$`q9LI0^Y5O5r1(v3cbq8=e%yFEHE;`-t z0u`O_1252JryE?9ce=qv*PU*75gu%#7*}xln@%^l{F>7Z{d(>>d>6R-O!GH!a=~J{@9tl{)&mddy4||@qYn%DrJoT diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_mpeg4_gif.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_mpeg4_gif.cpython-311.pyc deleted file mode 100644 index a593a8db88f892f9f5109fc6fe667eb5ecdc2aee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3940 zcmbUkOKcm*b(S1{MN)rR*2h{Wwrk2VWjm^ED6Sn_R%q3h>cmQdt|cs1+@ZA5e%RTi z6t+C5K!Bz|+FN0u&9QJ0_|jA1W6nhnOF)Oko(%Nl8x7}B=+rl}OIj3V1nKDQ<9qYo zy!pJ(jK0lg(+Ju>|Mu_l;{k;J!eNM^&t+jI@;IbWHCtGExTUxSG(jMo!8Jh(zf$@JYSb=#%=mET#7w z1JVGe)B2z>Bn@%8M;|suq!CVM^b^LYG|K6$e$p6|#yFkR$BhYTLO>BzL~8GsNbMuJ zr%{BS!51`XQtf|)@&hj!n-}~Z#WXEPaWu=c^Kn1B`s;^_^1{8vh5Jh@ML&AmtoitX zW;=f3f#wjZ=zj876{ZbT>=P4+myy6y;w~vGRowxj!%L>FndGA?p|y{R4V|mC3VA66 ziv3+u7%~)e-Y2yUOQGtrLbt0G=pS1$D^+K~G99JlEEC&SHVNa1$tDVe zMLvPJk)i~D9>xP{+Q^N&R1;F9d1e5o-PBC;X|d7+FwCTSQ&1kj=TGR#yHB z`%R0`J|-1PYzPNiR78lnZPBrS+R;=3zouqz=Zoj>6|P*Jn_YgmSiCqV-u`qU)Y#RW zEvxE?wpBINyl6WXC8}tdqO(QBRicwksu-e8=nkQFLA+BF)ga7gKtqE$`3x{5v|QG7 zBJOIsE^ZJQW;)_VjoYe%4G=h6FhsP%6cS4crwZb29kR=WweAqTHY3)oD#%O`Mv2oJ zO99ykf?qBL(Lc@h2@|NW*-#XiXA8G0q@5a`#}0J(QQM(@L{t4NwJtMaXS<7|H|kFUwu-?@VJ^uGCZo4!k69 z?<#cDrmR5vaY~#jHGRBdnWWUJZ0wfK!PkS3@cJPTe-WO*P3N@a(DM|&XYd8>^R`5d z)P;Ja9dAVlo>ql#()FId3xDRfIoyiTm3%tb+&EaE6AbhDBqo5`^=)- zYYUdDnVW0dRjNQ4lObc*h`F=&K-*Ze;qty%QA*ozecEe^X0ft1%Tmvt4H8=B87&7X z4N=dktsEpHWOboZqnBXj-=6;wj}}@7@IGkUYk>Z{hnn*!JNc)@KNi0(?q?>ND3i^3 z!zaDLVeixhZ)DsXo$|)ddZ#aY`P<%P-aGexa~M>(UULKuo@t(Fvutc2VAN}{kMg6z zv5o>wx#Pwd#l6QV?!rmd$HSFVB4bZ8!~^#oM)Bx9%P1bg=NQG}n4V{dIf92Ly}+m$ zK>0!Da8ogeEcIZ2-b5Tk z`rEUMVkTuy@v~ugl!&fF=n3=+^x7=?KcMe1trIOY$OP=}1h2gLYesM^*+dLw(AE3G z{?AwU?z(t2fCgUm@MRD8>=pNlzb|_DnukYR4h=lw;W=-7YH!iSQvo#al!vFi$sqDE`~u28hEi8K`}MrU7dIFkc$B`XyADd*SuRF zKHqhVO5@hX{;drcPq-K`g9hI4@VfWjwY>)}z7{}(t?qZt0hG!%`%!GHiITDG8}y2^ z11R>H@FFqPL>FVZW)9taB<%lUtr7f7<6xZAiy;J!_ABN6olmehf-_-d=+g(=UUEM$)93TRjxuYgs7rX5cqLO zTFCOi`>a~hI711Bk_@p&sGlq88eC+B@UcQ!B>6FT&l+|Rg@earJ!RF^9|(K$PCwH*71+_kw|SQm{2zw=u|Uaz7kZZh3uJ#h zP}pJb^e&AdrjcvCn)t0=qr=b{WJ7^b{HR%m93*c9$$OLD1D2(ZeFtzeDhPsy-f=tO z1zL1}3cNsP+)nUN-t7brU2!|%MYOMp5< diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_photo.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_photo.cpython-311.pyc deleted file mode 100644 index ebee0bc418c1417b0bc0d006e75bb27cefb26738..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3938 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_sticker.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_cached_sticker.cpython-311.pyc deleted file mode 100644 index d8982df61ca1f7af63e331883061f8c3a519c5d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2987 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 GAAbWW>Lii? diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_contact.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_contact.cpython-311.pyc deleted file mode 100644 index ef8ecf43743219693d4edcae5ca96bc4f4fb9007..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3490 zcmbVP&2JmW6`v)C-(UKoWl6ELj%+EEWilTH+}cJ{M{!iaw&d7KlWrsoR@{-a(SESA zOF3+LV1NKkfws58hvXQfC<64@zoG{U@L{nh13me+fqN))DEel0NsA_f6dAsKdT)Mj z=k3gUZ)Wt@LLrNw{o~7j?w7_8`WIJvEfEUR^S^`e7->k83}i}*Byl-r#LT!7H?e}v zgpx3mO43XzDZt_yHqvHB$$*^Dl1A3dDLDzzIJ*RT%E+4qr691hQ8Y_RNyr&v%p6z7 zg`71e%t>WZ$T?%mEGuOp=Z$mbv@$KB7+ObK;d7)FY3`diLf^s@Hs!oldWb4x&$wEV z{G4i8wyV0jZ8?>MU)cWj{o7>im$%pMY;3Ok@mp5QPu~*KEsG z>+U`3IO+lA8nxU$x?vsLdYulTbK>2*c3sS72%Z-3HvM#X-17qZ6}6f#jauic)N7eg zke>e+gx^ENDN-a2DX|YA@=BcIPoj)KNJ(ljn$qGo!7_t1407U(oIE3^A~~(3wG7y0 z`+7#`xxSv&@_-lmdJdwS(n@_jFYL$qdO;fpe4?)xg+3YTw8Uo4ezBGw_)UG4)@Hvz z`;s>Ec~Ker0(~ke;}22qZ)MJhHG3)OQPk9B2z*wC_JB4Rbs%((tjhH;rt%}*Jp{FJ zXj@dan&uv5Rr#HktkHcHGG|qG4|V5^wPDD6ROX||do2K|+;sRWw+u*13qpNNjn=B% zvYT>UwKyoR=sbyt8Kw{6p5gTs*|qsN8hDSO@MHLxPJ`Co7=b6ws(E(g6hW|m-#VW^Ydc)NVt4{c3)?XODxr-o2P|d zk$w!uyMD${Bgju2*P+x-=lceuYH-)jGukj(#1tiY`nYc`N*=xwmUg&^R%HQ@>$>IP{tehUZ9V3%{}zTUUVE%{ov58 zq}e$rTJ{QO7dTts>>_8ca(0Qc%fS29+M zFMeM*tG#L805gXG`%ec2KShNLf4cpL^*^pZ$-feyLZRrDXS~U>ccJ3VUG`=dy>oM1 zUb^AUU-9Icckzv28mxqAa2`!w3TFB$e?0`a^c-BE%51ovWssQ&+ccL%?1Ur&C?pZZ zIgW~q6_QBXdEO^-SLTvPV1bG(UgUi|m6?!u7(}A7WiGu2tTMr4&Nmi9{461+tu+lU z=LxK(YD7qi5Y4Vb0`SX{pNe)Z@%esp)aSkv*AT}?4K@2C-0pcu=ezGAwdFy`X-7dZ#(h0ur;hKkYo%PQ8XX_rm z=HYTz&41r$g-0tFqkWTPI5JQRgV%}TV zI(NJHT1Y2+*xv;cC{qZ=QDQbg=|tfL`%b76D6u7Zi_4vRUA!F9310T_&%Dc(&Q=#! zLOKDT__DXO(#2C<44l&mUh(kK)6`Uet|p2>5#4-WdUE5VAdOyIg(1BgZ-evkvUjEC zU46r=z8PGpWFXsq9LsPQ!cU*E*Ly+OtjzE<*>A!=2Wi6M0QgBLL8#d;g${fe+bZ;2`iNr(}=GHOPSkd}z$cKu*4K;T!^;Qr$D8#ZU$|L0ZMq ztFG#QRdvtrv)MF)@~7Yaedo`k2>pW#oe~Rx^!jfAo+2ITl8G!yktB{IX2gmrQ41^B ziYYNGuEec`lCY9W67*3Wn<*=;qy>(d16D@K0FLVkGi&9PoPM zc-3${Ke1|fgleXryi?)UfMO490IwoJPl-jcqg720I?b=xreTvGR0*wZ5Em-%*DBr)>W>igug{(i@W>W9Rx_V=0%J6f_m!>g6~K6c7L0HoI&u+(3GzYwHI zI#MDJz;Bc&!Jmfygpd-~BP5|mZ$Oh2(lOxJAsj!16Nhjz#3?1Ir=iV2AV&~M>6vFR z>T|xyq9|!S3l^Dfivc|c@?clah#rQza#kM({YY2N>7yWzb>%@}pYO^;`Z3TS@5;kM z9uH(PLeCyvubw(;j(V!+@5EPW{nQs|N7AQ1&ncr{pwA>_>>ld;FUbChKHph%%2f-z zL94;a(=wC|QlZ3!Dp%HI@WXxCa{%oaCMn4`YqB2r=>^%_Gh9(EKQ>HL-X=0{C2!Y2 zL*%MUC@8!=S+iv)^m)0g2~?6lF(Djm@T^C~tX+_6P8D=EZzUHE?z5^Dc&l0t+_lK3 z0R!kTmrxaS&j)iWq-^XMM3+Nr*|1%YXu9m|h}i_QU#L6!7V-8Ry_6PPbZ3n8tC8!tLKm<42!7TaQz_LNjDFn$(El855P}XH0l!7a&&Sq)wK~B ziCbQf!*sN@bx6%K*~6ar-P-bp!Y)ksI}EmK3B^uctu^P^JKmY<=dV%Ahk zWUPayUF%>fZ^xp`@o~ozo1NBTjThHmzSGoG&@1$Rgdmiq~=z1X+ zEOZijq9-|<;%u5TnX_-X_&=aR#E-ev3ZZ^dRSnzlRJAbdj~rUL>JoEDRsTN&(h|(h zPpN9z)Ld6p-C>YGMpU zhnn^jn2R>;X*7DaeX1++egXwYuVE}ykb})02Ta8gPjDp8Ss-!P0*MnBNaiM|I1^`o znj_);XE+ieAhaS5&ha`C4Bz2MM1;_ausF}_cx+IC_>l?6r}G?L0#?X#cd<1{jH;hj zdE%>@9A{M6bj=Jk36<|U_)Z4e_{mP*6|3_HRrSzw4~%5qJ4Da7_Fjs)F+WQ`8+ufk zm?n6zMBj&6mj~E)=~ZrZyu(Jh;;*2ABYpGNj^J3bjX2Ao_ijlq-rZ;{Ht|M4Exf_- zC58tY%Z=qH%M4#-IM=wR+KGuyb`#Ipgl z@GQgcv3IUER-5>0KrKG258ERsm2D5B*hCv8W7#+C8zGLM*s8?N%r(}UcrKt8o@01{ z%@!JWnz#^93l|s+ajqyP0-RF|7a2bHGBMUh@5FNL9QtrWdT~Q(r_s40yY}(diN9o8 z*VbNKTVo&HWQB|DgO6b{!+Caoo?X1mN>|#K=TqS7{~Js3A;q{|Mz3|wbiFXmy>O=r zX&JnbMnU1nAr(OG2%LoHZ5rn+!C8{C6fi$mHVwFHOW`|A_@5txx3=X5UORe3E}=Zv z`^Q4fe)yRX-nw*x2hu_EMiA^D(Nz$6gt<3? zx1*9IF?71wOE1w<^S_~&=xno>7%DV-iJ>daUV0fFYNLcyV)#b0ml$4Y_R>)`5Li6~ m@zCrg)``+?xH5dP*-P!XDoNm^NAsq9`5U47=UWWK9{(FDg`q+K diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_game.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_game.cpython-311.pyc deleted file mode 100644 index e731d0d31a2f00333bc29ccfea55aec4436d14a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1997 zcmbVN&2QX96rZuZ-@Ex}k~UOnSW%?P63Oy$NQpw#DhW%|G(b{>Fk4NX^(5WKAIsPa zY{?-=6%+{&7t{kiq9Rm@BmV*y4jU;4YYr$9r`(Lf0p-Md_HIa&NFZis-u`CZ%p1?| z_s0IARLT=5KY#b@+HYw>e#cI)q!K{)T>y`WMJ#F)hZ>Y3R&2#l4b{;M%}E(4CvBu* zT(vYi<7AC2;FOiNb57pKQ^Hk|hJMB_I7OpKi9)Kx%03`gj_04Kggk|o6r*J2SBPHN z!>&$c!E{|OFoTBY`no1dx88eep3S~7KYQc)QdO$g+_uatHUch8TV~&E;ylydQGFSA*@$`n0C|Uv zfp-iQ2RXRdRqOo|?4vf5)oVBBZ%ZuzELA@cQfXMSAD1)#t|tQK0$e&6?@8Sab6l_6 zvM6}dZZjvAPgleMC?H0_$V=?R#z+Wb&9-H_L8Hz#J~G9+FHl997CdMPS87Y1%j=jp zSTF^$&N(npZfLC+5(PoO=8mXv#k9!uGzo64rTsaf=~wwd~#ejVQ@$a!^1 z*OCW41FOUk8hqp*iLS_$-)eFpvy3&|M!=Y!k!OxPGxNE<#@K1g#aW0UbBxt()At$k zGtkGZD3`YmjJfIByPnvn&3abDU9WAlgc*2(K@QZo`(bUdv0C%tdQCLV`i8mA{hHbE zFjFe1kY7oJX0g&Nk(!}clg+jmgMIFgpUU=R?-*s6<1c{uYl}qZN$J8@^IufItnL)Y zB9bokg(J^|LnC3i5?;`w91O&xQJxGv9~BO}I5Tk|+J|UFFD6v<0~RrzgNR~IV}!(t zVKhijEVej@XcUZIM4~a%7?XL%9M5Xmh>Hx4YT8{-hB3>l1M4|hBQ;Fjcvsoa*pb&3 zOo(^GtcgjHrLGutZrdOw731LYF-NY7XK_|v&lJ(|3mD+%pI@YCscb~h6v<1k)14O= zw&pt8LQ=Q2g;0AT)CybGt?H-MP@4+1(N0{qwb4*3hp$X+Eq1i2q;8}Clikd4M9!u9 zqCWEK65YAH9Hq(3RT`Csa=`8XGdYYG2R$^R+&kHl-iOq#wcvgMwF18YG7VV;X((c< z@B#|>C=r1fD^uKUIexj}uZRig zq6Yp?U?P=L8j|Na$LlV+-1)b-5D`jW3$>Zf@fxKsQDE()>5NVM Mfx~~E;)~DoH!3|GvH$=8 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_gif.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_gif.cpython-311.pyc deleted file mode 100644 index cdce8d0631ee2e852ea0b98a2b1768c1be7ff051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4304 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_mpeg4_gif.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_mpeg4_gif.cpython-311.pyc deleted file mode 100644 index 8549d039e127fbebf96a73767fbc74c69c0fd5e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4328 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_photo.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_photo.cpython-311.pyc deleted file mode 100644 index d7cd99ff436303b2560163034126d9bae10a8f39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4131 zcmb_fOKcm-5$z$HKk*~#YgylsZP}(QQ}!+#dlh57wyemCCD~bf^BGGRj5sZ6toblK zLu;8Z02f#wyFij#;6wHpI0$^nDe!U6K@KFKLt{<`ax!wE;XMR8rMictC6hjEkWsPp zs;j#CS5-apmvp)Z!SnY&{d4;_g9!bL3#}&-0O`#?06axH(j^mFk|IeQhs=-_R>Brm zuoY1vR#b^vF(qcjl{o0bIyMtlkJ2M>#7tT#B?UOD$IP^qQ8E%DVLA(P-0ZcoN>=C+ zW}nrs^b6c$4p@WApukCU$Qo9L1x}eKtPy2I;Iw(t8dXLG&X{A?xH2xG5L!lh@0Uo= zlFYL(LeJqBJj#UL_WQ{qD7!*Y?l zk^;lN4lQ&U3>xo}@|L4feNCf#r6RPCuGqzrx9HfOR`Aw{>uNiMOT^{_1=y(Zkd6UIj^OAK9BX2TDm?*qJ#9H5@FHA=~cJtM`LEaHPlJJ3X@c5LgVhd-UnU zAfIT<{rU*VCj*%b(EQO|(BrMYZnM$jqV=5-MUT;MlDhmA+LrXGFEh&ESLky|8G3+P z|8vv+a7UEg-*r4ky8w&rk>UB26e)2bj$B!jAzb%l&jD2AR(bhWS=NJio|C;@!wuTy zeZw^6Eh6)N@>UsCL@v36g2LOCon~gp1x=v5eA9%au_6AR5VJfdmz@&mY~DqlHF#vJ zRuI!_AqeVOJ`3=!!&I88z&9VsEs}z4Uw+DdwH%!sPP9i5_307xo|Bu! zX>;?4n%A{Q$Fg~I)6X_ts&K-FXAsvPad(}4wbiU`IZt39q8r-bnH% zGnunfoSo+E3}-W(o#!ma*&JtiVE%cvBbM&-tW(uuS=V6O3+mp!Mt5Aw%cUQs#4AzT z$Lo$w3awg|0aZWzk_bs}eh%P|(o?wiyp|qXp26=q{DS9kTcd|6QYBOgS8yd#iB@8j zcqLKksU$0@O1hHKrEfBo-aku!5O+M>mErYVCRpkic%tK+O>p+TSN>O&3;7YZR3y}o ztEyoeo~q{h{Qe^=S6yOmtLpz}Kspce^b@LDFg4dzRksghUi^+e)x$@(7dC$8(7laC zM>p)9jlB}pJcp`KAU25oWMkFX+Hm3ezgW}?dvF1}8=B$pGBVH8-klHXhbjt)8dMNf zq;kGkrdMFdUrlvC@qB9&7Qx6hfc>Y68n+~rp7{OJ*UP_KK1hu>P&S=mLnqn55F0(s zCNHq@b8I5VhQ~Moa%U~5kis2A@+lX8Xl}+;GF7sf#EW{@uL^} zwPme-W9#6?Rt=BWFmO(Fyv6V)`|v8C<<)@de3id$^rJ+&(T5_V4HS>0-?G<2>_?F` z>1AxNfv!X{jSO12CmnqBun|YIc?NX)9Lrr~GdXtc#*5gusrt3GgKKN-<6CTb{o8$( zoqZh+-H|fiA!#;M#^*u8iVxukR!3xJmn7K*Mq|FF8Ks2MpTm^;8Ay8o5;Tws_))oAolpb-KwSX diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_venue.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_venue.cpython-311.pyc deleted file mode 100644 index cb3e817a3aa9f5af7bbafac779bbf8de0545ba8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3776 zcmb_e&2JmW6`v(%`TZe^qCPEY{V7wD#mY)xL^hhZimJ+%r8bsRbS+`A;*O+^_Jf&S z+F{EB4FqTkw7C^NG{+)E5unGO`X}^20X{7DWS}SC7`TT*r@on`C^BS$rs(kP#B0K(h90CQWHh=l1ikfTP*Ov`Dmiy0X+D`z>58$)JJ&T*VD zhRwX3=QwGMm<74OampAq$K){qh0q4l(w`$OLy}*I5&8zcpvdD|_Ax3ByKfU{lpROxwKUrUUxVgRIhwoc8Kf0y6gsO%g+o>=+K;jb%z?)FeM`6=4 zbc_6~N@(pP;#3WHw^ku*=4?(KJ^$^?~>2@`yJ=1kBL?NPOoLQOXnpS0O9Q_ ztnAlt;snWphUCx_IC(it@F#7LKuC^gArjTX_n=7}X&A8B#u32LE*$H!iFe^d8z<$M zmV!3vjvVK5rXwe~obAX-E)R9&l$L|`!yP%T5=*U@Z6!c>qd5Fv7flP9A zs(YncvhO$XRYIHn0v!t4%;y<-_zU!zAm<;W^Z%mckM_9)-+MIy8=H`zd_*dgIB@8W zq)N}&xhzRPs!19-RKdFzCHI&F)zWj_Fr)(_F=OeV#x+%k&?V`<0bXl?FFYegZBeS( zRjI665-6p4oq3sJ2L7d#0|%RzT$}Zy!I*6obnhPXKAj3F>xVkgq_(xBTaHUqO|lO! zrn8jb(|>GNX_>4_$F5s(R!gO_P05l=401$ObIGPhr32e_N@_*Fs`JqKl!Xqg7#7D@ z%X>My)(*UO zr`_YKd0?r!p;W2SwST(h?)%vb?Q>mokNu&GiesW59lON@9fh1gXBm?iyUf@X#;!4T zgRwcrij2(z^KUAB4!{?yD3zL~TCQGJPM)ju$e}C&`4LLoDz$vPZCj+wvM?)I_}~UZ zki~?zGJxL;FX5hW&-GCAHGJQ|7nDyr8ZA^8>Y;kLj_YDQQjgYS^>{r|Pu5fQbUjng zYQk69`p_SRFZs;}w@Y}tm<`rB4t>!{#-x~#bDN&*t=XDx9qpY| zsp{HPfe_y#*0a4W{b0|58}wF1EuX-3=Ip7u%@RS0#fwu4GJwKUfD+^YB}jRd8eN7l ze>pq&_?OPNVhxNO1K7VBsP%z>($l|N|INm4H(sSKwNNgd@d^`OzTiz<_9m}-qf_4a ztT(gZNhL;CR=nw=cjIom=JIlD7FzITEeYkXwJvu=)>WWj=q-$gidTXSF94?etj8GQ z2R^|NKXs1y(Q_?7e~!2l%rHBNF^+gVaKwXxBOV!7nF$Y%>kRQ2;aVOjH(4Ev7RnJj zJ01;mk)d0_iX+TiVH0l!bc(k;e9Obh#zte~#fFFPcsSqKY3#h%@$ia=N1B{Y@rZ}t@o=W` zpz+|v0}o&F@K9r`vGoF)&v;ko8jqTIE}&C9=i&R_^-3@swcN#FwI{}@tsr{-ojN<854vCX36cf`I>{~7lBk_?iU^?#& z827q&W1g=LIHOZM@8KJ-qa!W!u9#_M(CUux>b+gqwZ$KJx0V@|R=m6K!xVA_Z=u90 zmTtFJmgC^({~L?5f%s@0M&CU@&h6p^bG*YUq-StE8U}?Qfh+)NBk&KFziEWAC}S~Z zAj0#?IGcH+!iSDGLHP(_r45Uiy}+{`nsa_}2X!bu=@3 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_video.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_result_video.cpython-311.pyc deleted file mode 100644 index b191cc0195c0f30ab21dd44d0643a4f450be40d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4664 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 MuKL#-4EP@Z2er*PZ2$lO diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_results_button.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/inline_query_results_button.cpython-311.pyc deleted file mode 100644 index 06c3c872e0fd6069fd845eb6515852d0283c583c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1803 zcmbVM&2QX96rb_OekHpJA)o-QWD1BlQg+o7QdA+@5QPPl6cVUvHVoeNY~sdio0)Nw zts=BYl_(N$tBOPq98eMJ5ee}}AdyNORz5}I)SFQ_pqzMP??(&d!g&1r-n^MN^M3C) z{=Qr;A!t8+^Go~vJVL)qW7zae!N(thatArc!5->h3uCD(p3+e*wWC>DN4InsQytCA zb@EmoBdW3-*t%Ef6s;mg3R*=@?j~~bG=EP;=svtzvr0~31DVB#(ll{AVf%g{Y~cnz zH`TbjdG+!NS$<<>`K|ieYOG%LyK!MXly2L5h_f}7P3qBYW_Q+`*Jw*Xl+qR2ycmXc zza6x)eKM(KAAH;f5dL|Ze-`+_?lD5Y?@~k zM}wz$S8=9pp*D6ZH!D`*7TU*FaRUv%=5#z)_dVCA??jY!-=#eA1iuss5%@QLEg8@@ zcU*1+>DdiNLq<9E1vhM?na(mqU^J=0cY;0Nu$#ekYPe}Y<6{{SmZTx8#?>G)78W`Y z7YhqU#Hm5|?UwMmM&MH;Xd7Y&J_GEGwo5&SS4-&$HiC$?=#sG`M97zFwN}7rRSZzA z25h_53xh)!2&jd$dXHFgz)b+^}XV zp5nr0f`m5IkqXL8g-t;r*b^Y)1#%jMgoItk_J!LbyL&d<=1kHy&M_(?=EvF^<4VAG8_R*?`rD1&h}j}w1S->@{`JP&ZnME%K^H^2wQFxv-mu+3-in&&hLqQ` z!jZIcWKcSi)vg+L*&OV2Ah`)L$nM38XU#@(<`o-#RlV=j7lq>zG zp858bpVt!=^lV`Lqp^{WjKwj8L1rn#U=s8U!iv;n+1a!d5|Xs2>`AH3f-p-GS09K% zNL(VM6F8A4^+^Kx+1|jDC&UR_Fg!)bBfk|ueZ(v#{|IUBae07xi+UcE3$tgz#U%k= zW6#N1z?w`*h5rZwFc?3HqUnVMNim7^O0V9le_HQr=lUU zFeQroHi$&U828b+!^is(svVx*kC1Wrct2976NItZAHq7qH^~_oa{jmY`jbE8=%4@L HN{{_F<7?+p diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/input_contact_message_content.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/input_contact_message_content.cpython-311.pyc deleted file mode 100644 index db146dc64152be0fedd182e188643221bac13926..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1829 zcmbVN&2QX96rZuj`<2~I$&ywiEio)ru~f1b#370bC=DTeY!E3zm_<{^o=r@=wmY^9 zsrIl)l_(N$Lp{(VDnh+;h75VT)^{Jr~n0ii#HF>Xq(;G;GucaeoG?4TajF&4VyNIhAXdqgKaMOR=>wun>c z74;%U5?Vu+avNC%R=h7G^Z-WQ^paKFL|W-km>N!|4A=ESBeXp?(B!0c?UN5y>B`%y zEAOti*An?ncP}Yz_`+>Chd6(yvF`d&_&y5)W1FpbZphrw%(u@a$$#(>2jy#sogp1t zNS8i>9CX=|7_sDK@RcDC(8)-LJRo9X6(@EfvrDYEc&wxlS)6+qv)ZeoVH?&Q<`-Q=`11{K` z6gUeb?k1!S5txELq6vDGU`!!|kFJ991HKEC4aa_%xewz3jJ$n5@mNwH_ocqvClaD8sq#~$D9taz5~Zg+MgZiF7Ez?2SiZ+70Zw>p6xvR8b= z+=a^$bPU@Qd}@VzJ_}kIk?5#^bX3922EHu%d;A<6cB^?h?u+Au&cnjs9T0yFP&$Wd z7rtBlX6@Uxht=~bD%9%n1udSx7|%81v-4>gCbHSIf*LQSQxj9H%pF2Ig58i-%|U@$ zjeyOx4Bfhz6V%|DCVUyhrX(psYoK>j~b78_-|O$47GXVlip0>^Fy*9vgt;=7&{fK0%?93pY= zIQ*5MWHx8l6RhF_lpLa2p=DbO*p5rfd3mnzi(m>ogFc8<#u&%w#o@_*fLg=T`vH1w ac(SL3OBnL{w-~LW4z=Tm%HbbkY4{O!5` diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/input_file.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/input_file.cpython-311.pyc deleted file mode 100644 index bf05a261d92d930f8b9510e04e20b5e92b9fc31e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8127 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 StI?fV|Es9_+e;dVb^HUj-`0l! diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/input_location_message_content.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/input_location_message_content.cpython-311.pyc deleted file mode 100644 index 64acb26a6dbf800a3f87850a7b9c4643033920df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2060 zcmbVN&2Jk;6rWws`YU$6`$3wNO`E8!Aa)N0swh;TP~57;sR#&RTunB+V`s^F*PR`g zI`Y9tl_(N$gC6J+6`|hwD>yh3ht-}UajLj13P>m?-t5|@fe<0av(N8ic4pr1{hs|@ zKA%M}e)#6c+FKcfeip`HD6t~#mqB@mOk_$nYDg7H61r^5jYK8Uz!lt3Dhl`#CbpA} zR3#-L8I_Q!+(%}TrXD8{dIC>8Drqydj;C3 zUA=L=TnZ9zIPD<4))Zmgek#T9OkH=HE&ew3JiSg=U58VL8}atB9NzqEus?;nQ&f>m zRFU6<94ZM@rr1oZKr91!fR6h*0B%{17Vp`D8C?9fg}_DF2g3>!C<{wMbc zo0AVvO)@9$k5;k|&^@U#vW^Dd+Ej2RO5>($MA;usXXlr!3gaExWYmN7Je6-zb;F30 zRadq+Z+gqcqTw=H;MAsdrZ);Ms~0z2?iKZ>b>0#nHDZwZ?_Jp-s#{Za)$Sjv_Twsd z)lI63lTGw8DVUvDxv^6-tKtpcTHyE+fj zHXy-UCJi#S>(nE)d@wdB|A*14+riY9%d8zhLbr)-7%iq7?SuSqmF4i;!H8|$rKCxj z<(ffii|VH3)Ps{v=H9a!7H<>Xri>E?{+6dn*X zN9xF(L492S)494bz>X))~o84D_C3P?I!h#5naiEC8SRi(r0d=*=93v-p;}?H7N|z zQ(>id3&bB?6rM%-xi7AMR{Fg3Q*Jgy>HMhw+`KKPr3?kH&=-ktxyyqgbQ~7$dT<6GA%)Ld%KL zIC_H;5@ZQ!xMs^1dXA7gE#2-%QiPbU0q!wEp845?!W~g}hQ;mzvmoEEnL%wEYA>-_ z@Opw`ud_L^N^mn0X%YAx1OWHfCzP?04v`Q!q)d0$x@(`T`FP34)4gc!;%Ofj{1=No ze5!{*in)u6KCb%ni`^SNyco}2yco(z;j%wB-!1j)S=dbW`;U2 z@%I%ZfvCXj7+BHmO!RedB4+O22+IVNF|enF7HuuSK1i>`<-NjQ08>=K>wpLok|g=) mT<`GQL&e^|&pq@?@9+$hMG5lyr|6w~`B&lo?TA=(yFUTMO)dEV diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/input_media.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/input_media.cpython-311.pyc deleted file mode 100644 index c39aaef8a4b5e06bff2e3749520718a8c6c30c5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1071 zcmb7D&x_PB6i(XtMR!M7!K(xXWe(fkiwMgu$bz#9yC{@mCT%h^b=syT>B8PT_&@By zyCUBGD?H3m<|KI9+sJs@lSw<{&Y%b9CHZ*oCGX42OY*VXb%2&H@4pTw763ntv65!3 zz=f}sOF#jIDac>|A)pquQ!BFr8v+YF0krWB&?d7#*Z_Riqn4mSTc@DczA|PH&UQ$i zb466bb9n`8-<^J`NR+ZOma>r`*|X?1i&b0`)M!>}fs5N3F98Dqq#&>;3~Xv?etYH| z=S8Xdj3$H_Vh3qC8z&O+iVg`@2qsysBvNCBVxB8)AU;F{WhP9clw`z^;wWOsEOpVb zLUPQ@lo}V$^%y!8HQGmhoDwPh0ZF(?+f^3@lWt=2z!f7Vd6HFUb#JmeSosG3&qH}! zW+tB-nxmy_3l>t+gs)K?7<-HOV$9Wg{BvV(5r3XgwjTe&*n_&9r@Ry~^U+wTLi(N; zbHQA-d=M@dBQN4gdZbA1R|T%>TNUu6*O+xM&Pm2Fo;et2oR+E4cQJlbl5{!K##omT z<4<5=p3-&y$PZs~F$oVjP4ZDVDFsnnV7*Vs^7HU%5`{8RY`-A!L_Z4|F7Mf^?%7+r zXScWzZOvIhODpoOhPQv(+;WK7Uu8F8WE99nD19J?;5QN zxuv!1&ZGL2kHwxg&F_$}G|X)X;Wuz^y4k;jhtthIZ|y*x(cduLd+^h^fBj>w+W$8+ C&OE9B diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/input_media_animation.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/input_media_animation.cpython-311.pyc deleted file mode 100644 index e01448840bae1bc2b2a0e23d552f365bdb0ab636..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3081 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/input_media_document.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/input_media_document.cpython-311.pyc deleted file mode 100644 index 8d4c173be6b06e5941dd2bf7c810d3dd72969f91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2565 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/input_media_video.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/input_media_video.cpython-311.pyc deleted file mode 100644 index d04f2305abcb12f8fcd6b6cd30b75e7c4feb456c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3095 zcmbtWO>7&-6`m!B|38xTXW5c0O0tx!YEyQKw5|}yb!}Q!V=G1N#OPYYV#!@eYwvQ| z*`-wlJn#^pDbNPJ6gecl6)p;2dJ25ZA;%t;fDVH_3Fx8lje&D0c_9T-_hu|Sg1&^J^|%Zq7z-Rh%G6SgnGn^*ij{F zQ-#_wC1%H!xSdcEc2Y@#KdMtJWv7+2&|_A{&MH~Z<9fo%*?A=|5hKd7U?;5+dsG<} zzLa&w9#h675+R#JPk%)8jFEp9CFD6gVN=HS?0q8VUZN>WK}M_998dF1r{>D>Aot)G zKP#y>@04!7yS2R;L~qm%1A5nVy&!Sd^bDq1LGryiMuQf6zXr<7NSG;c%h=T#mIq1m zTeW(_yJzU8_TaE?yp+O-^spO(Qo_1zS_T-odxq<3dq%0|nciU)C)aP;P?28gkmlF0 zkp@vDohXs_VMCRuK_B-vnh+(fM~s9XeFt7i5uJh_>*;YNsVBfr4(ybk0y`br5n`nE z%rh9_IZjqIC8K8{A~Sd+tLMPZpLk>BwKsD5C`615-pK1`z#bdeBf=gZ*rURp7}#g@ zNr;~s*ki&z8`{P=E1p~}9De-U=H2UkZEhId``MCFM|ox9WAZCWnY>T> z|K<5$WOz~^n7ZM7xSuXS`?*nPhHKP3x1bfCqNCtBg^E$YzG7O$+;l$+n z)pm5FJ2!|qF;z}L^evZz(OyawHpcW!!wsh0edj>!cWV{rDGY>b?_PLq zq>AHMmkPt7hO;$m9xU>})V=*6zHgX&`(BXL8%&gMH$TXO8Op(!+o;za=D8}Y($H+P zwijgfH8ATA>hlbwww*uHw9U~`y&5B}`p!d# zJ=wYG=x~ZVPw>bcra~p{7`3N6cg@O<3)l1Ix>kJxx2U_LnGV+58di(DCJHTNn<`4J zSU+S%80f?4*ABASU+G)mbt?e>Y>`fpHCa5}xn&4{zH9^`1)C6;dCg>|P!Qo}}B9WQU@B{>3nT*;hfINj~ zUejztRfDvOH$uZgJ*%p}Y-m=`lTcONsR99z(m_mIQDPavh^n6WutLPJ$bk0$b)_+i z!FW?%f$^&yXrufPLGH~i~FXe`+w2wC#IA04f3v~Kxy zBa}AX;Pf)51z$*;7CI3Udl=)(a%;<{awu&oWA|Z_&n>hzeYy}zn=Wvw@+&|5YvM(= zeWi4CrPTVVPfMY+X$fC?9N|A$_vwUB0a4m?ozp{p{q~Cke^YB;uN+;k_;l8%fGBNR z;k3+W=39_xK9n|{=P=l8p>;c)C?L$0(?xz^v319%i=nikgRXJ;vQMXc3W(Ci1wQ19 zE3J2Zx)Ms8u5hXyCnh>Xj^#Uf^8Fjq(Ob8VFJFa~^J~{%B)-hHuiZPkc8_oTgl}$t zdB8_kzm7)kNcnFFVkb^6zR5vWR{7Pp`D(GVu$%&J|8J1ONr;&YfMFquv)z^_kcztv zxKe?NEDDYw4h0T3LdX-mb6FfAfsjN<0R;J~W#SiF4}YOCq+k#;Y7N^Bshc@*Lonn| zkPdrx@k4=EQjoX9UufYM?U3OO9&+vyYGRtm!*24Ouv#|Q4KR_Q?mqxJQAv_GS@ciK zF)8`qMUKfu|FryjPEMBm({dag?U0C6pDa2o?N zYX^1^V&|`5=!kAYV(NCNOr5Zuw9-K0h-laECRlF57=f7JOi;9MsT%jtS=K1$ERg0_DHrfD(zdFkGGUpaPRM;(;QE`y1u|cMpp${vP@3|YGv!v(%V!fdx@|9DXpL1)fbw^K(i#v=mH%zj z%u7BBQ?9w_bm4KW_ldghn*LVnm(ERN2;p~d?`Zb@0UjL9zSFry=ra1(9oH! diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/input_paid_media.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/input_paid_media.cpython-311.pyc deleted file mode 100644 index 79c686d579fe337c71f360fac035a1b7093f9124..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 812 zcmb7Cv5wO~5Z#RvE(&)k_yDvL4Usszw-C)CAp{&J?gUa~u~~cPk|mDU?5nVM^HY$`*Qk<67t<|Hqu!e zs}PNIB8j9qnb9Goq($x#*?L1{0Q7x8$R}Kl3|q2&Oa`4Fh(-o<(LaG4#zxE@r!OFL z*(T3_eTtXWHB{#W$dF2c0CX707J>we{{5n?+>uc75lAJ(O+3EGOdho+HkCuKyj8lRB2+BgZ)xuQ!xgctos$!{faL4D=g>6k5aAL zXxQthUjKQPt({JHNw$=^x;b!&Q_xO@1>;Ao0rDf;WbC4K(Y@W=?2hT<)(@3^fNB{~ cO1}~Ib^Bdj=~68Bw|e{hr}zH)N2o6L8%$>6%>V!Z diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/input_paid_media_photo.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/input_paid_media_photo.cpython-311.pyc deleted file mode 100644 index c43e53911d9c009ee5081ae7eee3643ec1d37c55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1745 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/input_sticker.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/input_sticker.cpython-311.pyc deleted file mode 100644 index 39a479d25f1702baa30b6b62a23ec709db158443..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1951 zcmbVN&2Jk;6rcUF*Pki*XdBwJZqiDz66{=%Ac`tbNYg4!QYoo`jib@pGfp?&4>P-_ zq_U8aA}A6dE~p23L`A4aB>oBxj?}|yPmwtFwkRBsPrTW+-9&(dn0@>9_vX#Ko%y{t zyFcb~X$0+;?|-d-ok4ygr374H!V+6Td0_R z$<3k=WOUnhJl!)K+bt?VZu`S~D|q?#%JSNsjnzPU*FFg3yN2rp>SmJ<(#=4*Zv%KK z!~yc#)TDb%w>GQ$wB|v`)E&Fo@@^R>1tYtzyN!E}Yw*dncnz_Ze?FWWiaH4G$2z6`Bs8Y9}7uG8-q>*1FwSnEHt4}ahY`0Zvh$D$b`ex?1)t^$Ewsh9)Rx-{5uPgT z#1FzZ(Q$!tmNtqCI|ozPC|BcL4Hx_qDvE*Pwwja$D#nIwco-MeVD!||u}jT5#{U|F zO+v^Zg>lW)T^D0l1)J9hv`%mHy~WD=4r^4F9b(vfl}3x{p2INYwnFWXD|d}*1x^5c zqp8;#`W|&Fy5aCMQ}zy;)GbG;$NjXHng{GEM1M4KnA;nU!9*FpW+LE&YToBDd? z%hj(|Ut}+bD4EOq7q9vkru<7c{3~<*g1S zVm1XvwY^Rc$^#$(WH_O$I+W_!@O{0A_YAEKb7KvqG&_KW(M2bD2{M) z>n%8EKrWNO5hS3XpaNsw_-SJau995wk`3gl?o!5oOhGy>yE=TR863!ddO3SBms1=? zujBmo)TKC&H(3cxPQ3dws8A9F!AH~GvvQ1ERg6dtebUGH!H2;nc(rOu#Roh#|p&WXsQdQ}pr-~!T9(r)394wzAaYE{0Q8-jN^^Lt7vJfQH+40-={NB8I z^WOKyzvlB91mn-2{+|9BxF=j_4moCo^>2ZBfCwUji7Y`A1kNYSge7XCC25i+YqFKp zl2%GfMLN+`thAN}ULvxYv9ekg_#{c0IV-Q_1w=)b16eT(R-4uq>C$Gq)uD9=D1k;0 z$=pLEOY=)2Ld)>PL+d2Daa7Dd5)+n{r?OBdee8+K*eGrai<53V_qF(a)11I*WuM2a+lAT4nflBtO# zK_wy%f-VimrZSP1Ab@2aL^QM{k-BvjA)eFgyydnHv zSc1bY^8?4eGo%gHX5+Oq%MNT80Td~@tx{y~_^=?r0dL_=XI(WnLs_sBvU&UdxR54g8tYD9$Eq`}>Z%7Dstuj$IqDQu`7Wv+?*n^6og-6QHEh$csd}qM z*?cJzg*EQfScML#ZyE*Pt~HX#O(?n^3v&$(=2l^*sxy~j%OP~5w~5GW5g@OD^#^JL zgp-qFTl5^j*GA*B#t5673>7$$;ThE3*thBERcua%JK%h?7!u79i=C(o+;A5$Tz$%< zc#cltDj>XR5oQRlN=5f5xdO=Uxam4Jb}KiirDHe((>L~S?iU9>oX%!k#&4Z4$*5Ojb|{TGHmx-KfveK+WDye9&ja(L z@BsS8YwF?65N`Az{Hmh zo1GYPh+)r6%+{FhISd2bC#ZdU;*v2n;Tj%2TGcDFP%U>tHyqv+ecpVPx_wbML=eMG zyfvDlRGnuBVXM39Ytmn89_TPwxuZb-T|{*i<$J#`e>3vk$ZBq19i{Sxptl(8JrwMI zJ2-SQD4wfl;a#Mt=TO(ddVW*n#<7BP>);R-3vpgLfsYg1&AA96J2@A@WEbZ+R#-15 zJYf+O*jt=affNfo|F&*XjKd7(eN+Ps<1mNut(tB&G%1XUQ-RlQ7;pJLKy?5%uT+@B zDc)A%98Xr5Z`7$mO%qBjuy^6D%b|3Zy~nLOnxu^@&VUB8_TpDhNU~B#oaB(a)0eto zu1MX1^ht2+<3Cc5ax2HmtH;WVpZZcco-0zhocw6v*@F4%d-D;(GR0Oz7OIR-YA z!5Dw1*+(F9aJT`Gx+n-jfDZVra}5ppZ#LJ^9=~<2p@V+w4A61Eb*_o+P+XxDNGJT( d8AwO{)>%*XLj}>R#NYqnGyeMdHoEBK{{hUe&guXF diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/input_venue_message_content.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/input_venue_message_content.cpython-311.pyc deleted file mode 100644 index 6ef6fc87e9b15183cd9a0bc22fe8aedb528f3e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2143 zcmbVNL2nyH6rQzb?X?ppY2$>@lxEu$MVrtVs031}Dj-y$Ax#h|MHolZjd$!WS?{{D z>q06Y9H|mT0&b`WdPJ>IC64?G4vxfOwWmsmLvM@10rkXtvyMq79G zsFP`A%UOk_$Re@S+r-N7?EN$$4`C#&tXbJLVrY+1HI!(;bX_kn1KV?bBOMj4eEQ)< zw($PNg%2*REJo>f+^tAkZKB(B9xKT+qnF%fE4a*k->mZm&keX6RFmZs*+2QupnnBt z=cKGyq@4N~VkoDr6sK1DJos`D2VmO6D&WjMob6$)tXetn<@H~c}EA_#?u1UR+ z=sYJzEUot&x<{?z9a2-Q(c44i{2lV8QXW_%d;i8*G$F&g%H0+}7~`!!@;bDScvEm6 zV)pgmI@hmNlMLwRuLnWXKUXSMJ;CP#?(n)W8}pv1mo~h>FPTky+Q!T^lFap?#;@wy;1S)fS+la)lInKe#Nvso$C!bZP`Mn@d!!-XYh`&1|K1B*IeS7ii#cvjW8$2G9d|@bj@nm>xIvk%2C#J#^ zbD>_se(G#|1e|h4e3Xoyjz{|{K9x8S?ZV2$C?-k63?#*nNLFMBZL%y9$=V!2o1~mX zl6Mjz`GiE6TuCkQ0-^~J#vqo?H5;62Kvs%Dz77a26m%!=uc+)%^`u=+^Ix5X6B!cT}4NNYa_9!TlGzc@uzEhZ=iiCXNe zc2>7nLpmGMVpsMZS`6u2NQXL0ou%!ikWPklq_f;v-d+yriEw(RbGb`rlDfJ9G}`UP(R57GpA{4#nf-l~=HY!XqC4dP diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/invoice.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/invoice.cpython-311.pyc deleted file mode 100644 index 82a1f5c7f56320edc4b192421249134626953393..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1584 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 OR=+^?mrt=J5%~{q&zune diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/keyboard_button_poll_type.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/keyboard_button_poll_type.cpython-311.pyc deleted file mode 100644 index 406f3b5f675d05bdb4f9fb88479bd5e7fd898659..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1522 zcmbVM&2Jk;6rb^~KjPS__((ZG+vP(7Bd{foA&r1EN>RbBlpw^`Xf)m#+gq=9mYFfZ zRSrR_M3E>r)B_wipd!>e{{s>SBXK}`io~fmqi{eu@!qZ-S`jWh&%F6~GjHDS_n!Cr zdc8_Oe*F69-lr}hzvE&d#e71K+Az6G1Q9eMBkEI%^FmY@IleP;eRov!i?HViH!6+F zewmU2*(RcRi-?je-*X7L4?P#ZBFa0YQF(yN22GcF94pIhsAAJ_()#WP*S6T^<*m&t zZ@0Ho=goMMR<0&!=FtP1-&uWkYU(lO?p&RZ>{*{+vF4KS9Zu^Y}C@TSLCFt zxE61XtyS?g6-B#~MBeVfPILgT3{8c)kaOCw`zJPRj0)$_QQ!1-6ay+IfZJUGgu zNbO1CS><)57ih^XtavOuya?xH?AZZWlm=gkibWXry>9k2-p3b=6wPY(`i>gwK(2WM zYZJ59YQZhpv~!M{O7~k`Wlf7G;q${eirf`Og)wGc+Q;<;-`9=RAEqvv8dTSSsq`gw zIsuF&6TxE}25h*;b>C>Lp0uQ;9qTxC+bWg;rVj;2G%sU}^zny+V@5_j#t26`tIx_ya^G?|9n9#~s6CMnC zUz!dN6;@&kxiYNinNwc6I3xd0Euojp z)rrziE#hkfH9$yj3`GlsX#8rWB}g0;K@J$pR+n(w?Q$bEBFgbShO^8QVm_{{=d^C< zXJLtCn0-()hf?|*d2ae>J0z{?f44*O;`GrrE3Hz1@ozOf_u3!0{pTsREV{n|_XeSR diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/keyboard_button_request_chat.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/keyboard_button_request_chat.cpython-311.pyc deleted file mode 100644 index ef02824f6c10e9563f2de2191ad58488b57646dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2870 zcmbVOO>7%Q6rS~te-k@DO-bAz*z^bDq_JDdsj4bk(}q%-KwE?`X{T%NINoNx>&~tz zL6!(oC5i;xP!IIb11hR|=faIM2V3H>+EXM>y%~iA%8B=8ZIh~rP&=M|``)}a^XAR_ z=BZWbFp3prhEzsQh_cxQ`D=)flagYPQsg6uw4@plP7U=m=#s>s zz(;$0tQ3VfsF4`RF)1epa$L%(ft)agzFH$)Y+$9l zcG0dnqAnAv>1C(s$@wm%t>VE{G}7*vmZg=s=GJrpV|PriCaua2=xW>!T{=Q=x8c}^ zX|HHyxn~V_*ML#jL>~6aH94cV8o*=S=IDLLpTix#^ZVI=4D6l z-bQ;9(H(Bn)qeX`J6-d!C02h?N5Pb_-Pw#|Jw)j5FqS+n9$F67yla zfZ8)RSw1C?_Nvnq6@E(lp9S@Xd3d##s4(c>w$OoGC{Rt?3sSvdW*Px4JB}5MpanBs z25;Nu*5X#Ce{()XgX=-MZviQ4)`KxA)^wNQo^8F(x2+){Fm7y350)sx>N{Mq>p>Q0 zGkyE*W8ujMQ*cH*YtpEJz1DfX%tesyN8_2E#e>nlIM~?0piy%?CzljZy@(h`vIogt zB(ETuL^6dWi)0^=V2ebul+2(lA}1rx%LzG08=OsM~D7i6$6>YUnYR%LL=wf@A>ADq}C{LF|V;1xdy# zmhQTYxfzhLa17e|){S>gEr0BY)#ajtS9f`}DJwFAj4yNhv*q{A^0Eu%WWJ$SR`nI` zF6*X)HND`iHMm>oqo0NFXMHRnTJw!HF%2%iIJ9d*^Zmf*!Omqs{#hs88InHu-T7}8 zzFqiZ_&}GW(;0vNQC}|0P9if~^mAuXgg$)&Xm=8^aiS4n&+DDv;X* z7bLeYJkep`!^GjqgxMQKPC`|360eezpq)UiM6To{e5F=mSaK4`l0!5L$zdWSRK)@0 z4g$%IVb<{;GZv&6t2;*1LVlRB+fCi-Y2u6-P6dWX7~A&s1x&oioe~t?VlIMo4-OS> zS%5c19EMRBk^iwBKBtgbS4W#71UpGRdi7r7hOrjI(OY2KtEp;O#YDavUZOh)F zS)U63$jtiXHk}E3ht8nY?T9~ftWEc}DNyVkdJM-uRQ=ay*O%IKHtZcb>(ej&;zFAq zY*V1vJ9GhUP1Qelp-m68DNyVkdI85*)E!+eM4lV=Y0-aUu1zP}6e#u%o%891oeVeP z6J2sNn(2;{`4j%}xBUE@{-q`Vy+!}naqNYYK)d^=lYp|9BS~Ccx)=~~w4VhiFbI!o z6Te)LcKmY|#NhJ5Z4J|kB~Zk0INiIOd3iTQ9LKWqyRlQj7fGBb)BPH9(j`J*D{(qR z;~8-rM8t;s5J*>56vZcp+Rye4QfTkqH^@x;*}kEUc8Q`C6`!7KKij*pqN2cA>`WhK N{*s!%chSoT{smlx8QTB= diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/keyboard_button_request_user.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/keyboard_button_request_user.cpython-311.pyc deleted file mode 100644 index fd9d84200a02b7383ca3a4150f6238e523e3809f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1988 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 DhkJ7- diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/link_preview_options.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/link_preview_options.cpython-311.pyc deleted file mode 100644 index dc019e6c4cab4465817d304b544f54d1b60ee59c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2611 zcmb7G%Wo4$7@vLknb>(iNC?ZMg;Qcv6#g+s-u-}sS-lah8k^Z9$v%(uUp z-CqL%KZ5q#&wr+W2ktK>G@Glztb7T~Go&De(@>U6a9KXVXN8226%!(d6kZWDSJs_y z11~Br&6D*eyd2`u6jIy|k>VlV7Xm`BVANZ}r+BZSi0>^EBcdI+{>|01c;fuoiHjGe zr)=R&Zr=7@$(yR4lQi2klLO{0&wM%CGfC1?K{MZSbvbyQXe2|W?3L6lBAYTx*=!vR zX617T{tmW4P=ZrXf}eq{Bm^E2QQ==eqE{?gttDK&O0>oipCTLwy$`mU z@PlvL2AivHt7Ue#WNzO!vu9njwJ(_gT2V2!e5x3e?P1my0 znyzJjrTw`}5k9^Kg;joCH32pseG-aq8++R}_5kTrf{K_9K0;|u>3A4SbUi|MxkUFh z)clWh+TEAb+}u@4ZmZ-@9g@bqhyF0MNn*%UO%Wq(-XvkY23I3oFo+UP>olxETsU73 z3};A=P>BIL>aPV~(+gB4@$gO4%p37oOx7uhnhhvNb()E#bkm4Qd3Bg2YUF85Qp;fX zF#~Q`uxemMHKdeA6uWJmFl`G3s@X#uoFOPpC^oW^rr|76RLSn%Lbqj*CeaLO30kik z*f5iEQ@?|ylzy9FliW4!juypB7Y)L3qU@;BE=G1R(gVcak1uViJ;wQYMar3~jOXsa zN(|dgiCLgIxp{=yt>uH!24m$Mkf+=;xQooD9W*asyn<10w^l6*zrZc<3&Mi9;8M8f zt_Alm+>adGY6xyCVVdrOfR`x3+b*M!C)D<0tmae`$U9*#L}psN|2cC=%^6Id0QbKStW6-bC8J6N%DQkGzB`!UYy zN6(;2-~?GXp~zffO#C@=pbkf_Uup7A?DTIBpznyhgSyFVeRMeqRZm^d0ER7Z~TZ4zJp2KBv7J5aTW$7{h#K~N2+Je|Iu6RJorxF$GPBp#Hiy&ky1~|T)t7dZ$(a6;ge1q z(|2yxcQO4gGr&(K311naaIWp zH^DL;@!M`VcyLnJA#M$|L0MBt&WtMc&z2gp0m_m=DEsoNqpqKEwUi8rAH2uw=i?;( w6hsD5;{gyy;5e>|#>(6EH)wx(W3Qrcd1H6n2jMBA&17lt9n-$w!c<%0KW2@ZPyhe` diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/location.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/location.cpython-311.pyc deleted file mode 100644 index 512ef25d949261248a442c1cafb76b75591088e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1829 zcmbVM&2Jk;6rWws+H1$oH*EXPQ@n+XHtq2?#zj=Nivv1$~y*K+~ zsZ>C)e*XUH_Og!9uTmK-EftibDhLmejcmn5O{JzNQdV8HnW<%(xQ3frO#@rT#%{Km ztK}4=qE%#T50IUuxyKoVp1@95O}BF!$k3lj)lkHU>3J+PLx*{RkrAcM57$@7@{N_{ zo9|UuMdlr^E%Y^Cx=r_)l0GxKNnP6DW^--pF111{jhymf(%*sp1*A<;O|el;{Q%Oh zWo(sVJ98a;c_;y7+?SyQNEX|~l^2=Uvt>4lC(c0VzB zBjB>3BFkym;-0`&=21(Ifm~VGa(qV+QjTtb@U8L?MlT%r!SWdP6WHmxJM`FUN9m}Y zOb2(gPS#c)Wjnbaly8#JhVjf)jVv$1L%bx}2|53S3{_}B3knxHA&%#Sgcx}-`CJ7g zpzbyy{~d@=!y81N5X&`#fRG>$x||8Qy2tOoyHvl;_-=ifNnq={(1eh20{yL1?_T|u zvsDkAkY4spYu9Yhpl&)$-i=Dw_GwTVw13fW^BIV|H!*;EagcQx%)vUaKf5SCi%N4} zuY9@s)#@+B*%;}i(dgy*Xy#mW{*7q%LUiWU=)#+E3CxKv9z|2<G6Vc2DV+jl6eZ%G*`$Ps0wGOiw_GU~ z3Hi8Xx_wWM5Sv+G9wX$rj|}wVgm!W)qf3B9sox5Vx-PU-;j>^3^gkI~tNQbD>`*%7-<=%@F WXDbSn@lUq@*>BSN#|f?^xxWCCpVF-W diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/login_url.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/login_url.cpython-311.pyc deleted file mode 100644 index df163a31f4bb22c6416811e324a6e20c882f2b08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2158 zcmbVN&2JPp6!+}RekPlc5EVp0wV;i(pzI#13N=Cq6j0IC^*t;1rGahVj z!qTWsC8ScR?XBWajulnKz5hge2x|DYVu)Ej3aq+i89w7@0=sSpPTdKz^(^RY=J>fF zU(Z`8gXR&-K13|X^G|Jrp23%ndV%GaQKj(0h!rayp%q?7< zyY|u2d~9D1yK&)qWX#lmVWoSD*^x)6WwG&xWA)-A zbl<9%meKHUWg;#tinbTtls>(kL8ydb+*tJ#7D>oh@o9EmXOIID?=1<5-Pssu{PKE!m8GhnyuAbA$e5~kgf{Zu5BbMRLwW3U0fk} zW0i-AFLN%2>|7CeVH>xk2=LH-6<_xKgH<8tOqnd0FgrAjYOe3OYY^)oO&T(A6t+AW zz&3~;AnD=_3bDgBI2`bqO%WYLhiMcktU6I7WU^fGfwKe!Ky_uEO9f4YKd7ERNbyj1 zP4HZcq_DFb@kuIObZwB8)P@|D|CPBX={p85lR$9h3h)a9r;XU~jba&!W zDD(z&57GR-jz?iXF=Yy&)%M2rmo|m)@5ED*-|KLt$%gbaC)9Nz!-_4(;G)QJLneU4 zC&=QUs|ks^3@YNeWDO2!D`{SfI48O8$S`)6M95upUCl6evH;%*Le}mTV7|8=!xN#0 zcF;V9?-_jQxVvv*nN4dmvuSTS%zEN%W`DH4OP(KiLhPlABS&Gwf1>;uRWflFnt{u> zK!_K5nvhC9o_r~0qPX88a;-5Z7&Llg zts|)xk^s039)<^=|U9-kd+OWR5#&FiRBSP3&Px(#sA|A8sXSdLls}E)Sq~x$i@vEO`P<%5=ab`Lu2)WLLV72iL&Lbg{_4z7y22Ly`1Zvp59vAcBa$$+?nnf z__hPo%;!$6=lDDMsXjWE9qS)K=W4yP)!zH(`{koWK=%KUqVbhD+$ZwnFuSEn(E!`( zzzqUmr45ES2YmyLmcnJOn9Lcq)1+{f4IU{vZy7G}WDwgcTu94vQBH$spj4j$>D!iN n_0Z|1NpSxH7He8# diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/mask_position.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/mask_position.cpython-311.pyc deleted file mode 100644 index 9441953bcd9a53667bd1a550d6038f34f3306af3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1548 zcmb7EzmFS56rR~%{t??3ju1fzXhlfj0=qv&QPAaNI1VRLE{a$zjmA4;d*k)4nb{@r z$%RjfM34Z{pcDj&0tKNoRMh+d6jxAKTb)FeZqZSoRJ_@>b3SoR#yg+CH*fa&&G+8; z=W4Z#VEp#|AH7d4g#J>-a+o>6N83OiA%+T1cVMk{gH<*3}d?myT z;N}XqR(K)j+!SS2eTaIPRUT9v>mj<29Y}lmU9TmTkEtBq45gq7-WzbiZEBAoj4cOY>@&Ly8-4Hsn?Qgbjs2)m&O+Y` zW8v}*dk{rqxzTL8q2P^ZAxI+>{bo0eWRs4)ODf{>_p)~rT}C1?$DtQQiP`f*8YPAM zL=LANx4DV6VmqIl}VhJ9_B1nvO7;snBM-2mJ5#||$ z@X>W3-{D8l3DMFID^FlPg_)1LFFZ_};;A;(rv}51jj8z){wC`%=oGzOHw1)4qN<># zU=83G1npwVc+5poB*Y86h>&_ASzpPSNbdItIqh|E7GfkNLR_CpNr)_ft%_*dv*$Oi zZ*=a2V%XUXnHTgs!&uNL6a+Nx@Zj^#j@Ru#<@tMK>JDk2%MSHI)tb#{GUl?WN&w0aE^Yd^1c<0yt@3&JO ztbD0Wj*V>P7>*zis#o$8t81OBR#7aIE@MhRkujx0R#WkcV(S3)qS7;~y)p!!Ds z001f+e^Sjbiz!l2LFU?Qd$zs5Jva8|#`>&1Ywx#H4Vl;U6Qy z=Th{lSxbv+B~b5Wprl^Q-hBb$!ZP1Bs07;dVz>vOjZl9;i3Qb%cF6_EE{f5mk_**Z z`BBd)mIYDAe_p(ji+feP3#QUV#sH~~F`lD$4o*IY=<>m7&mpo8PClu12}ADxhi|X` Mtycdz#g(P?AC3f$F8}}l diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/maybe_inaccessible_message.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/maybe_inaccessible_message.cpython-311.pyc deleted file mode 100644 index 1b3d5602a4beba955ab12ddd47159bf47de57cdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 831 zcmaJHV%6u*lT8il3<6H|2(3mIzf5n=%eRnRiD5>jO8a=v>_Ol)7cyHv`882UdH zi5-O4`70P0QC23lpfGjfo$W-4sCc&Dhwr`L`?&Y1+wBmfuOGf$Tv0-PdSgwkT3Lmt zToXkU%}7oMl#&K{MpWa9r~v54fRHcvRWxX*<{9a=etEM;7YFB%!N`dGW%3%NleJqZ zFkwlndnm36kO5T$0q7u54Fm}m_fNz;f#X6*3D%}b1}7-R2*e=~XHNFICB!sMtef?>5h} zvDa!Z$qqAj*8!)v58a)6Fn;SQM8CzA>pp5X?MGF!kIey^e$VW4WXph3`hz_DzWXlk Uv?=EOm%V@c+yDJ@%Tbx^FRTOVl>h($ diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/menu_button.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/menu_button.cpython-311.pyc deleted file mode 100644 index 6d1200f7c0b8308551ee7bac283ed27c1837f6c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2161 zcmbtVO>7%Q6rR~#|He+zHlV14YDFRvORbH#REjD@o0ecfQ=|l?U0kN?opG|wdUu%_ zHx0@mNR=oOa6>)NLl3BcdPiKjb8w{|qCG|8)SFQ_pqzNK-K9A5JO4uJ6&EVZnfq8%^qBuZp>|m^TBQV;gW40~FYG<4b=uBz_ z*>=v!VZ=!4x^h#}K1qQiEC4ya2WWqL!1P8IZFFau%Yn zXkN=K$A_r}pTa|fj@(BrOo#6cJNf(QE_MowX#cx1niQ|Huyd&+CER`0K&WWLSX%Xk z9in6)4gEEBg>_%BRM-EFBbOYUtlF10AiZgjsplj6qL_s`=YcOIq)_GFK1hy+ zU@_`&kImYvQpRGoR`Vjxs)ZdyO!Z_^hD zUJY}hV)8OlAViPZ_Qm{qS0@U(W-h z=6lP1MvJBEyKo9siaMwg@EVh0#i`8kQAJdYX_ojY#f<@}6ctdR+h&9$MMByU?F5Q1 z5%O8b4f>WGAvE$pJwnK#HyU6(C=RaP)ik)I+=tO)K>+w;ei}?dW%OPCn%V_rpowC{ zZ$KdA!KY^wGx;7;WE^FNx9VHJ60&Aff+F3#nJ_`w-<5`!Ow4h7^*m4)g&a$yMzq zSttdl9SxFd6s`&^v6`-69R7PzQtCGxR4qJ61+^uG=~cz0&J}cf`3pKl@9=356{g}5 zke-P#-bQb9kIo%b>mEOM&~*3c+%ZRc2;&L>dw{8Cdf6$g@cVb#J@MwBsp+p{Hlz{! E17OEyf&c&j diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/menu_button_commands.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/menu_button_commands.cpython-311.pyc deleted file mode 100644 index 4e664939c141569a72dcd7b858688c06c2d0e102..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1562 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/message.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/message.cpython-311.pyc deleted file mode 100644 index 79bb2f16c234a52b828483dc93efedfb7a70a151..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198575 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%0A0c=TfqZ>0UGi0Q#(tEqKSsclCQ45EKDvIKKwPxg zVE=D|_Y?4dhy66c2M9hyK;>HdCkZ6w57Q;NU874<`6<`+({xF`KjXTdab3^S^$~*S z2!58}qXZJ;=jb9XYJZ&Ic>=OYZKD46FA#i!;FAOthuWVac#+`K1X9w^(Dh3M92NF2 z6TC$5D+EF5|<3$aSS%SH^Yy30;3o&`%(3|EI3&D|G!C!B+_! zg0B$_5c~zfpA-Bg!T%xnD}q-E{+d8a^>w=bFTvju{0+h16Z{`H<50+~&ceivW63EoNY5yr9U zy5h#34p-x1TV}#z{B+U%e#v$HpzG?T>oS2iuH|A_$t7omOKIN4z%u59MRoiQe1uX0Go1m<++5ITXTBy`d^1~IjaG~-qP-~5}_3&-z^~C#_ zqO{Ug*X8xZnA>%s8UwNhzG>wuvJIuIGwlzs9XRssr(M?v-M0CV>l$<0MA$ZS#woud z>#WQ00*Ycw|9E{r{0RCPw!`?$y~S*Y1!{MEL&{KO+eo=4+aGmD!3cU>R_h^GnI)|0 z^bx0+Q|_F!hg=IJmo2u;XBo#YxHb5M>-q)P^^0_UlHf%GSqnZz*A)(mPt)~F1fL<0 zufOcNKI^)Eg{~`%@sjKMRoC@vbjfJ>b=UPd*Yz8&>+`PbH(l3t*EQz$U&{91{(aXn zMUEqBtvU9~Z2#XQc*S*zg|{#A^-Ba-*zaF*kcRcz%t~tO-^Zs zoMTe1NlIwZ&x#LU({=_agm)}w{icpM9j~-ribIxB(w=QU!_JX)z{94VrQb&go+J44 z8`q$gL2_D0E{YXgD+e1{fkYeUjZ@BEorf>OknJF)nWHEz*0*$w{L^~=(Ah2aL> zum3`qr1EXLKEkixq3a4=|4P@t5xhn)KKR5cq}l$-UHnANR7u+}BxN;TQhEmq0_GeIJMT23H)Arm}^{XO&sa7G8N%mAc6G zmzvB}97dUsUi;5xdtG72cy!^I$7VBIZq7L6S7e=~46_w4bp$wp*CJ!C{TkMO-ni#n zWIIS{st%Z6<7}lQ)5|VT$pXd^;8of~Byuub%5d$BA=B$|CLjanNxEdo6ZBJD9&4_F zF_s}Nnnd#3$aK8eBSqD`5?)}6g1+UHFb8?{YLc@F&R_>k_aU!d4YsgwUR?yOd6xD2 z2!Wu|KTDTvwL-2Bi6YNsF0}>gT&ONNWt_*@rRX&zA&OHwSh7L|^@@^{L<5tk9$lO{ zj1xw#l?CJF4|()KDQlT-W( zP0pMetz;Qy+T)$GbdxLwh4Q;LP}$nr302hA)`9BQ){d@NPdnYUt*!6uiMH!66|Jqf z*&5#Ut*vtMR#_u!ZBHdMPZxVcqKxA?vj{6Q@MF=PIx7YdlT>=rfiL5Qmfh-cXa=JvW zCL%TI_sR4V8JdXCrtx(;fym2d(Pc5c1#k^iLM;UczET(MC_kJbNDw?qP|tAZ>3T20 zj}iO?!TSlW5&Sg4vjoo(JWufR1iwS@y98;1KPLDJ!B+`hCHQNCzajWLg4YSYOAzAJ z3lo$PR1nk?Od*&-FpFR=!F+-U!D5091e*z32(}a4POyjIE`oaq?j_hqaDd8j+nctwswZP@&4xo|CrX{g%lqz2Tg%mx zv6j>Oo^oepQ`(xDwgCBLtR}~L)LGS>wq~U*Kt36(nSn2aou;*EYfjn%P3>}ZJ;eR{Cy_c^z$Nn5ki79gLDwMI%6mI5GfumBI1 zI_o#}9Y|Z7)RVC`Io4%o(Xzff)7CQeWY9=f!dbqG;Z~_9W36(moz8;AeRrp=#p=me ziydpbvv3L9YKeL>))L3sEtPEWSJJWWWP%6%39_6g!p_o_%x9%~GS*7RdIUk!7Rv5r z&aiieojD8o_N1)^>d9CO9BaSRyuRji`0{`7CF|vP>p6*E7X&*RyfvuXy(3q{jKa+N6=4<>mOlv zv5C=i{wCgAAdmG0{G{cON3b;x7AoRCMn^XOVz)V)TBJ1r`DCmXR`H&&v*y;cH7{)e z^2u1YI@Tc>%$Oej!TeBx!XI+xE@WRUR8PiQ=vZ6x{Fu?*;XH4)Wp4X2Xf#})i4Qxg z*Gc&S`DCnh40|kGXgc&17*5-rwHr9ZHmE1VwP9PKdhT)>SIbNWewzjM2s?W8K5x z-Qm2Bp!bnd>0zuu!5%&z#$1<{^CmmPr?@us?ek~K>AA9ri<`gS@62B-8UJLs@cinv zFz@^J2d90Lvm4`ae%b=$ldNeE+iYa$chQbCu41KtQKeUHt_`HlR?M9 zb0bz}RM%UdIra*A<}C#5`aNh-Os{w-v*Mxt6%R4&L+Z&`4`supWqV3sNn>f_GaH|u ze!VGu=xBP^vGkJTnI*^jmmFv4%lCk=+}lCmXP=(ia-SPJhSdLSzw2G5q3mfcyB z4duaViCj{)IU6#-jY$uccuCndepkTveH)I+-(7N`wsEjDe0NFpcS3}S7g_4G z?0RX%^`=bA!Ty$mY}u7f*(p=Yss}>=*&NUuLYFMWwOp__vl@%EvtiqdcfYhRvte)l zhP`aU-S=MK?9?ttE_);wK;(jcN4qhj^c_bsEl2xXj-pZVp>7JgFxz;fq^w~uM3~Ko z-Qn@fl=lm}C#Y!{RsLjaBfl-Qj1AARNiuh!1NN_jw5N^+DLP_h>YHb{Zxv#2d%(cO}f z2ea7HSWkfuj5#BJZPAg-?vw01m<`dbA(rmj?ksuf{_Brqb{y{CahPZVrtE^nL^^;h zV2JL#`+CJIwV9pAU{{TJ1-uR)=R_WE_^&=8xq2`gqFckeO2;+VoEoo-O5PsKhUnJt z-cn);!-5S12az~G%H-@W&i__#HHsIQ#*@jFY zr!YRWX0RYyQ($p}*Kj49dxzA|gV_+>8iI>F;v{p*dc%DH8w+|K+tk4$go>oWdUVU0 z!CAXY%XXEZioQR<cR41=-=^5Wqw zgPkQq)_={dgB43zH3PDADR77-9V}bK&jw`aQsABv^z?ltgQauJZXXO8kflq3J4#3y zE?PENW7)+S(I1 z58fP$pN{slr$pv9P!@;%ucSSh0m_wS9XVqWQz)_yx<_9psHR=!=lJqh=h#AEhm#`r6OEd(Oi-AdPWf))Z16mNrTU>drCwx8Q! zd$qg$B3ckugSPWajk2#S-u4d05;^Q`bct;CcDh7ByOS;v(C(t^w+Zeb5P9uxx=h_*MAb+128bXU}x^-rsDhNskI|&Kibo6-^-8HiO%kx zRO{(Pd)&T{9y64O7^r~AUR$!X_wgHSj5DzQhKtC$?EUmd=AJ*~{XHERi}r!MD00)G zeK5~o?me^*(I16nQZz}Y^HGt0pzuc(^DsWz>p4=7(j_AFV~kJ-qpmP~2m4DlZV$7M z^Xqd2_Y;V${sFo~5dR=t1CzA51a(X0Mf)Lo&NQA~xF<&4??F4T_QU)*E&pT6euQ7< z&2V?TE|oh|fDncT7yOhFVZ z&e8R0f=3BN(V-o#fofUe-r3WI3D!XmOIo9op+w!Fi!M=z=%(vsf_D;phQKBeMTR6@ zqRo(^E6kSap-Xff&eQc-f(ryM5j;j9st*_G`Z~cSf?k4oOkgp=B7oN`w<}eb+w7+? z;NTNV{tqnW+0v4d5+}4c9eiF5)%VFiCv-=8G|#J{IqBe&wXBjbr2nG;wV{$_>CjUD zR0di3Qvc&n zSRHsAYElFq$LK-03K5QxGP>eM$4Ky9QNBaTU*IW}vQ~R=^&cFgMB!>v6iQi3on7&B zp;-B0v=CH@LIDevXLs5PJdjPgVpipFjH-sO%vzkNgo=QU2-THnUBN;=TGX00GFQlJ z)4>O-HLiMtazIk+ilmjpF=`sFG~KcCYYK6D;3*Vqo012+5JFVftsI471-ckL?id{n zS6QP_dGh=HP}&MSj*-2(LfAs>qowe^(GuuB^k$*4p)~_sX?>wG=eK-dQecia)*b2K z12vtz@snS|{E?}(Fx&xCsF(BmJ-_7x6B+Z`5h=GjEM;Vlq+ToBS*#q6QRQ)UdJ3%@ z`MGOd1m7wFO@_czXl&%SPkx#6^IGZZJ1Iwg%GvU}cb1fZE*$z#deZVi_4zx)gpy7A FzX7lb2U`FD diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/message_auto_delete_timer_changed.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/message_auto_delete_timer_changed.cpython-311.pyc deleted file mode 100644 index b637a96168049f7449ac8cda87171a09ddd3455e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1472 zcmb7E&5IOA6tC*;>G^PGBBF_h2(2N3IXH7)7Ihhy)qG3@*94n^qNb~Mws-qutg2qK z%N{%kSwV9Pd&nh+UR(ZXz0N(LW(3Cu2Hh~Wsu*vDA&R%FGtZ^w@BfNV1-s>H7EVq~Eu z#42|YbGiEvFdxAxhhJsY>!?$Es>Ke@kI^Ja6;)xH$c~k_mTz8LB>gLk{jaVLmU4R` z*?fvi%l0yl_*l^R+tC^iR8ZoTbPA6TFM#|bILeWa8S=a~WaltzX#N`=W-b{hu!dYXxV z&v~m#P2^m!7o>uB)inHWD#pE0s$`E&!q29+Xvh-L0G4+#1D4xiqVm&IL!vE7X-c$h z-Xre~mypROqlpRwvVNP2u@t%|a#wJbi6nOhX~F|tB0cn1tB(O|YVkAPg=SDQJ*XbS zdIYN+Yp*oSVt5;ec-#67|76+=+Qc3RfI@#DXpM@@CS2q-Lc%0egmj$z#B0tG$)goQ zjJ;^Wp}bB=5K$=!kq*dEvpX+?%X7o;Q?WkmrwkH4T+akmsUVQgAx}1jUx%Zi3>7~= zp}{(|fE>~=)lJt^n-ea3@5-Ve)0B57o8koAw)Mq(v)Y|S@iExSi$Gr7K}8$2&OBJW zw{(B$N%PYJS*^Aq`<;ct24R2kJM%r#9C3#LfjVv(zJAXp2c}k{rNy?^*L3<48goMO z1|f0EvPknyLT+U=nrf!Y6a4yi7MyzoU<_hcFyiQ{e$Ys0<|jbqE@d%0zQP)^)Yky6%jha z#+w0z4?(YF(6|t^(0>}a3w4D?C?hkS?Tjcq;p*&^IIcMZqT_m5n=i9=L3kkQfMo`x qurbE_=-l3$^8kIm_qKU}yuCMP;eLX__y3b$2ha5G^S7vsTmJ#BBaQa} diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/message_entity.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/message_entity.cpython-311.pyc deleted file mode 100644 index f0cef5085623f853b096f584bdda695636c6631d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2475 zcma)7O=#Rk6dp;lzusLt@n3AmvEux7+r&#rC?$l@;5dov*h%b!Qq^IQSL3y8{cL8m zscrVKft04u_Eu784s8i(OQ5t+dhVge9@Y@35CjZ8<+i~&v_AEXWN*FHB^`~PzW1JH zM)ThHM&D$!X$0-(FMgZ*^+HVQ*5kZJEq0J zrWn|Y+X*dUC$%K#F(YoJ?6j7a5LH+l^n}%BXS9rjWONZ3$-Br%(ext)p~rAXP0JeT z8I*5(Ce*wXwCRrHdb(%24$mt=_WHY5$H?fVvC)a~sf&Sf&RGePSIWYzThC-MMh3<|U)^Zca-Zy+-$4thL=k%aWFX2<{8AlazD4M8_P@^j21X zOsmkYFPL0)!)>aJmKo*L@xbCxm6vJJ)GZYZ@V;s~s;+u;*;DOko)Pte%T&6o+hvO$ zR~K}?;OQlPT&+N?939>|uHKlw43c`qk#xA+j9XzvdRkrZyfQysC=^{rN4%|QkGQN< zm~%Z|(97nbtyQAc!@+^VJr-bZrA!0Gbi5$$&d+lSPm4MwZ((XPyPf*?;LV$XQeoC+ zu4xlFycuBec|p?Bol*s&5wsU8+;eRLoLDr8Y2-2MhP1I>A@&K;2O=0EE#V`iykh7O znIc(wUuPxG1R;Vrqh5tM0iJ>g76q$BOTgV0-O|R}06vrM1LwVMKUf~Y{TS}3EjB%d zT$QSFRjJ}?tQxN-4Cz6lntUjI8de?TRhh~sSO*Madxhu}Vwdm#P833nSIT1VgqV)$ z5t2^_dv|PvaB9sH@;_!{{jf}sBBW^PoD;&usUheTw%X>^^QULuaoN)BsB4%`X?Cf? zbkAi3k~>SC+q0L=xmj*{^h8-NELaNj{+Ei~G}6S^B6sPk}R zPg4~`B8Na5Ff9Vk0q=|AIN5G-0B}f28>;~Bx1`c*9$pAlrALs;$IWzB(PDEJLs|vS z?6d%GjurDpZ+svN0!FQMHb}ob#RR*6v?+M7q!3LaK+3VmDLVpYE*4f*b_gCp2KK}B zqDSVLYp?dV#&xIfoEUi)L=8P{SD$A3KR>mWQJ-YgFS{NNe0%Gwp&!owH1W&fUte20 zHCewly>@cCesKCpX6Csfccfn+5Dg@!((Euyk>49ps~vFkk$VIRDI21Yw_U;(7GIA* zVFiXZ5d{_^!M?EG*nmL$K|lb+CRsRlXcZ`*6=WA@5g|dE5Zg5>mcSW8ZdG(^%ab6) zaEoAWCuGO}1xjI;N@7^7qYCi~h#6doMk7$ zCX&Rz2hmU@N%GNfy|u5SLjAw{I=WEbt^4R$y|u3^9StN&13vDrxAsQ-O$h?`Z&B~c NKNsc~yZFNW{0;5DZb$$C diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/message_id.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/message_id.cpython-311.pyc deleted file mode 100644 index bd94dba80a77fc80ca9dfd8e54a2154412391946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1325 zcmbVLy=xRf6rb6zyW8AFiP1)dMM-gmcb!EDL5bmv#zZh8E(gPAXYQP2Z}&2@t40K) z2r8)9ND5ntioJh@MG6bqDqxlFBo<=jo87y7Kx}+F^V|34&Aff@_hvs-DmDW7^6qPE zOh@R4G6rJi3f{Q_$~vNm;sAB9i?PzRK7CF>3>2 zeukNgTcCv-s9M}sW)-JHUKmEP7xO5TRV}S7+`c|drY=uUU7eY0r255hbsOh9hZk7D z+QRG1FD@}Z_Vai-_QT_yNwA+mq71p1B3HW!3A;Mgm_hXk@RblVg-uJ(Q47=J)3R$l zNB6M{DGlCLJ1t#fQhIGRLm%9;9gu}PTsl$qSx2z0V3LKgbUY^s`AWi^PQKsa6xMl* zGf}g%gEyi?_-x#{6USXSUa$L+V70hkM=cWV`eGEzy4U4r`!P7p4yHN}C^T zWH&29x~tTKFZpEoo+sK;s5YgRU~wYC)R>Dx<}22esJC(tftu0t7Oz8p;(;Gr8!$h^ z%w=iULp6#YVvZkb@A2!b3^nRJ;*i-hoy$AnakbYx$0M6#eoNVZ>; z;ZRy4#1A|v36TcaK<(O}*-PWiTaj39PDPZ5?dEbKyf_jBm}#=`ZgZ9|HYJbQxvu9g zLsw+e; zd>O_^TfNUWa%&fN-~_5#c?s$_$?C}X78PX{em4hf3xQ?iI}vAo?#XWfAf?`%oxyv&`mz3Lv1Bz(oWCg!(U2 z3;G0&&8y6AsbJti z2jK#7#BqjlJi!<_=o#Y9IpVIspIwA5VKp>yc<&gE`oFC@!mGU#k%_rt`BD5%BqnLM z)gRm{oBJSKAb}>BBLKh?mpcIBu7!)G#R;p!mAbDEMqh+O-k&41mktjYyFVi^EsS*1nOO`MlI%@kD)cp&({qxIH zWkKf3RF$HQ>$P4;p8$6Ej1;;Ik(2P@JQZvX%Q diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/message_origin_channel.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/message_origin_channel.cpython-311.pyc deleted file mode 100644 index a41e8f1c0e23e299e954b767fd364d1641efb8f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2032 zcmbVN&2Jk;6rb50+w0Gy`2fO>_n=6$5;@4d5Ztk&aDdVHIP6B~!9wRknyqtdyFv(rOyU zWu2HAOHmcTDLrjwt(=;RaK_AA1+{q`su_pdb;19{Hg3NkB($GBz&%4$c< z)64@YUVQ30b6u^?R=LqO?6s{9JHW9;nb$nFW>^fiC=Shn0aD-4yp{-H&`1pM;Wq$2 z2Vxjfv5r*f10YD18M&Jfhme}qC6>|Ut1vT*bOJb);56V&f)&8o1m{#m&qKcu_gR*Y zpY*8b^x`8)AAf+>u|9Ucq~;!=&#($K4gM<=!NkxZ-~hJG%Kg^L7H#59={!oYF%%`;nX$Sw&ry?t4RD5tmn@QCl~3^zV-N&lyQkfpR`YOYJEt3Y2A1hn4KNAt7I4;{YQtUJ14x0{oou&&n>y?hy+JsBwHZ{W$nXid#xwSz`;+)eY>DA5_e-XCXKKm@*tAmrA zhbiuLP=EGNIE{*DzgqZW@yo@%!gPo-#gaccmB^V3{<+t}Jd8z#uz<#23X8{GF*!B} zbO;Vnr4$n~3YbUCio%NN6?GMJJRy)Enm;F$U@EEsJ|)m;P?drp-qtKeX^^ATa`dh# zaDmcKx|*3-GL-603$h?eB*-K+9fc5#P|$O9lPjv{ zU4Bl?8W|`NxZ4K>eEt0kC6ZD?Bvb*tI*0daOTGC%S&HQ;S@Oy2J{jvZdX3$NPu}!N zskhu)-d*;|J3bljt@c)TSABBXzj&!nCi(=lkf-DlOy18-glH;N3QOq9HN5x6jZi_g z%i+jm78w73Dl6PYK93cj862@u85K0Icf}nBuEZxHNJFhbaq@^WaS?f1DEMrlAjRyi z<;J|HTV2<4toR*L8ZJ#<5KE%#73Du7by|!?dkdnEl&f)i-{v*wiVV2FfC^=dv5#i@ z!?KUA^#4ot(S`o7_-ML6EIz9Ahh<+L4H3p?d~&)!EMfX(4CMV&efQSyV)Tz^n4$yz E1=f)g-T(jq diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/message_origin_chat.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/message_origin_chat.cpython-311.pyc deleted file mode 100644 index 5383c4283a368e2a991056173b4b35c52e414dc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1972 zcmbVNO>7%Q6rQoi>wo8;LI`wAfyx!Ng$fc1RYmhdN+~W8^vd&D3HwTMkMN)e~5l%3YnHq)4$(K5E8DKMTk zn3c72S`Ki=P^`RN&^cTjDjdVNE7l1zNBd* zM)4}CmiDk)rD0Kb9M{)<({;Qm3(LzNf4Io!FD}l%|6XG$OkZ#|!t7TCkga;t0_cBPFs%`W(#66N3TH^sxds+s8nck%xXE>5IIaIO@g7 z8O8f4W9%+jrN-!;idMKwZc`1Y8T_w~hr`Fipf|rQsL+8S8wT_>c;2SEo(#d zgyXBOqppZG-C9-MRaIA8uu}D1KyB%EJ8{2Oh&^3(yRs!_)ivMmc(e6-%ax+$3rn=6 zZr5DduCKVhSJyk{$^M4PUg$D*aB#ezo$Es^V=ij*7cVT|2$>I97J;si8IToOMp%SE z4Iw!?Y8;dYnZ54$@1U@lYD3^6j30H5-l}iJ5!C zTIKv{%jGlRBg}K&vUJbm+{;2AYd}@E53ViDHa~LZdUM`2OsCyk?@HYV-XLd9;e6V> zY_2ptxIAY%dTSl-iPzLk7c*POoOtzqN_mpgI2X0fhMa*dHm9E;xi*OY1lYYxp#I(_ z(KIQ)@b%)COJ6PRlx8BLlq3xCC;%thUi&P)e`dS=(gZIEO2hSM%O}I;{21YZuKo$&JDK( zWanWGJOxmr@vh+r=SSWmn1I=nSS&FiVY#1!mar_yAeAqI$-~lkM;^ynBLju8dcT1J ze*XQ7QY@2;2&xh}bAIQwx$T7>n@i*|n+w?4fQ@fAwi}-{0`_*mrh2hFW>W#H2d|#) zvB@3-jq;eC4%qG8>|{iaWhzmHy!kHOdE-)~kowuEJdp=#|DVdEyV&QUlIq}Kjp`^e zyV}J&2@K(@9x6~vP<#nfcHQhi_k6G#7giYY$eKP@T+NB{r; diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/message_origin_hidden_user.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/message_origin_hidden_user.cpython-311.pyc deleted file mode 100644 index 1f53c68ef388dfcaa270ca61bc501ef506a79173..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1780 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 vwgNz~a;9`%nJF(Z8M%3X1bD;A)+l diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/order_info.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/order_info.cpython-311.pyc deleted file mode 100644 index 08a96239d11fea8ce3939aab39d1ef60a5e05ea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1747 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/paid_media_photo.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/paid_media_photo.cpython-311.pyc deleted file mode 100644 index c723aecf002b7bc637945b39d71198604915dc1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1690 zcmbtUOK%)S5bmDGzSj;;AR=+3B|M~w#BM-Hkt_>>Y|Azn$HGP^lZ{%F?Y2GkJeHnW zz?Kg_L?TFlxS$-!fddMlTsXm>;INT=SoO&gC*KyC1M-Qg9`D+gKpd#)uBqzks_y!# zW`3wvO9bebZ+~0eun74bl>ynAKo27j9uiJC4M<2`N>MffBQ#wzv|KB+T|3OVIaoKj z739N$TL9VSxu6)9+!7_ilsVAzK{>3r6-o>;OL*Zv;YCq;Y!dPWW=3w6mzIfBK0wu> zs_aEkoO-DrM~P#p>dNh<88$UHGxhHL;;b^?j<%Gw;3uidFZijDUT|P!j@2d4=kE#b zdn;RQaX_=x;&2sW7nj!KG+y?%MGH?G5a57B57&Wz2AK=uQchgs13H5+ha+6|rMX)xx9%z{1?6ZI0lqT?>#nkO0EfzRkhiL_p|9S< zSbK|mQR=tY<|m$9OC;i@a#Exn87XTqjzkOVfrQn{!7L--H$nJ@K7_?|V272*FrUE8 zXk%#M#tz*vIDKU7nBUW{bX!8}n2U~~FDA#p<0s-6%1%0MAyt7fKk`$?99xZ@x+P0Q zu*%qplROWes>oO?@REeF1QWnw>>j;8J<i0_p!6&- zr;PYSUMLt-CC0*-cLJ0vjD6Jcf@4dbF&?)7tRna*Tla}RLX9$Z>RW{!_#NroRP`9i zmIwkspUTT%O0bYOCFUnb2CRaHpMgQPCr{t7>_VR)tB`9q_MFMx>8>@Iji=UR&$`~T zE_L;IYF+AC=lAm$`ef98hxSLv>u>G7Hr>yci=dJJ&5Jr}7W)*JR|Y98IwOeRY6rR< z@RRs!Q#q(Uv`dBwc9X=WmwB|=BI<-m259M|KO}q-M3r=xumpZm62Zx!x`>iK5#c*3 zOlH-3Q(glVaZP>&);B4oJ#w{scI=Zky8kuy$qU`Hqjy#X>%MuePbht*XT97#JNmiH U6v6&y{`KuYwB^r#vFpVC29Kk;U;qFB diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/paid_media_preview.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/paid_media_preview.cpython-311.pyc deleted file mode 100644 index 93aed1e0f8a92d00c3a6543c897d8f4a576acb5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1827 zcmbVM&u<$=6rQ!m_S&(X&^DmZHd!1*F$G%!4iGAoDlth#NFx%c*gA|ho{6)~{xGxa z1Xn@wp%O&`gg~eVdf-qMs@^&C2XJtt2(9K6iBoQdazHupX4iHSsD#Ax%=3G1-p8qUmK+%p6F!sE8rMaa`Z< zP1o^?SmahdSgMej`O3`OR~F|){Ib&$sRh$#+^~dtwITBi>mU|AoLe$X`VOO}vC?X= z10{;42ho~5q%VW=zJ|!BP#{CPLXjSO4+_=e4BzNwAfzX0jHPJ&5@eH`Rjv=Nt{bd?^fQwQn|J& zun+FyVXn{1b<^=zMPl2e{)R|yFtfhl3zar`$nOKphXGLjgjA=bIt@w`$YA$g*@QG& z)Np*WMmDz%UiY|UMkG1&o7@q2(REl&k}U8s!fQ4d7b+p9WBP;?Q{vRID-w@c z>x4Y6Ha-e_h%_NJ%kVrxycGD7QB7+fuFOtVuep4)I^$B)saH28OfDzDNtHQU)dh2{ z>Otqf)G%tBMxA+8!*nHcWr@01mXwi@Gtwii)M)XuaKg>8e*2cu)(kN&vzv)YY=7ljs9kDM@aq#nUWsF;mP&x0LtJ0h)+ z;LwsR^U#uTgk16`rS%l3VqOC47&aqBWC*cc+O(vdCFG-~Vf9v0giyBzD5v2Wk?M6| zc(52I!Q$bOjS<1#DPSMnI|S5Sb{(XSiB3AKx) z%Ayxv-@7>7p6%f2Xzb$Y0KXiZooH7&cp@6Rcp|`4!8xt{RtIa**u`3a-w4JF?fDKa zL}M2h0(^Bpb*76>C-U7qdiAoh_sV=Qc_DcA`QW)1y1C&r(DDCNT5cKcJ5YS0U+7{n zD`8)6!m9IZfM(c*q>}Acyy_hu@gA!UH6xhw7z> z(>M7=a3$E@H=w$4MNtA&=$st;=(Wy&jeYb?=i~@Zy0F?!PAX9KztvZ*-(~dA$1H`H F{u}3d*?<55 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/paid_media_video.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/paid_media_video.cpython-311.pyc deleted file mode 100644 index fb5515cc43f42058676b7cc3d4b9fd5d1708c0f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1643 zcmbtU&2Jk;6rb4-+v|@cq(B8tCG#PnMXKF$sT5gIltga8go=iuE=Hs6&cxYdKg{g9 zkSYfwRia3MxS$^BfdeX_iUSw^3Jylf!P-+KPPr`#2b2?UW^Koo+Ed@oynS!pyxI4D z@6G;PsT2{=A3yxL)zlFBTPS1FGXWp(fN&pCM6ri_Y+)>9#Z!FMQhm+ReBIJvO{JQb z^Yd07WS!=`f^S#`Moi^7(DPo=FIgpw6x2kta2HX784p#29>L7WD%0Y1WR{MEYT~41 z2SFIyu^R@FsV0@po7dLJ%GI@%ch@(XiTZZ1m*iV+%((3xDVa;+;&Ik*HtQ=KXo~jMlX&|bB ztYUP(CMI0kfk^a*A zWN8H1$CHl>sA@OXSJ&SEB++6}cnPvgbm?SbJ}b0&?M@HsmQ?i0(kt2OeN8y9)zA02yp{9CdAZ}#i=Ms#Jnv+PM!EO;F%bNIG!Cv zghV0%QGou*2dm5Nk3zoNUJ0oiblST;ZpR@f0BoBDx7#iERy%^uyU?|rUAx1gw(W)j z{+bQhaQdCIvmn;Su`Yozx(MvQK1!cQmGj@MebxNBc~D*&l-GZJ z^%n*&F)m*n37J}6KL#IU7P747K$dvO0?PbkRrsPXoDn-q0-wP486ioL5I>|nPsn9L zKJD4w$dV_7h7N#L03Wz9qBpWOm?vcFR>BT(cVuo!WrU=|JP**v`~@&YqL5eki(*%0 z%*w*>8!*WB^hp&>FQiDYGJ5^;f!XM<4zxx#{?Zyl?cz{d=(qZ4S8yI_7vym#_?~!-39QrdeG_s9v6SGBnPF3UdaFvt;9vg zCprsyev|=OJnaiE{<~APlGr>a*5p?NUMGb{R-QNcYoH1squ+t0D#mz-ULMSjLsT0) tc^smb2D4*0tAh1VT}Tne=ZD(TV0NUrb67z8c>dkZf28H#C)j05{{y3sq^ke` diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/passport_data.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/passport_data.cpython-311.pyc deleted file mode 100644 index f6ae9d18a9dc74f0e908fdf22dada175bd2ef0d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1657 zcmbVM&2Jk;6rb4-f3BNSrBx}VS^=%PLfD)`R23ywfL3XxBp?=}(Ryd%Y_cC_W=wIF zLl2b*5+Dws9^k+M6`@`b2mT5UuEfFGQ>31HGYSWk6K{6Ci6fB<&u`woH*e;7-tWDc zpBs%D0{Z>?KQ^zK2t89qL0~Jw2iqVYA&MvtQG{KLm9B+aq`P`#xJG2UCd}#72uo4f zEn~!VZh>uvm8j}gGhZpJMRm81k%m?fEk8uG!pe_zgr302$+c*84LP;v%5-pA_u@E_ zo(z&$IC|Px|L|^`EWOiSy7lhrN~*sd4^!iIAmnqLuRpWSLe}G6bf>$`dsE5_~1RTKL-dHaxq1&wgFJMI@Op# z^+oVi5j8+JbDf#IM(cZM6Vuv5%PsAp&#+rwL&evzQmgpeWlwtd_i8rKG7~-zx=h$b z8g{YDrm)NwTOK4~-wWiHEw`B6O{Co&X6isN-mGO|){+7D*@C?#WnV0`T7JS=Q%-?t zCcM{zeWK;{gID|0+*R~!@8J~%=SQc3^KojZrMwC$r*;1r(ew%_j;azOq(7t{fbEl= zdmirzu39NAaV7^mPL0(hX1=PKA`M0fMqPEi&BEZijIcoRPh zJJTv5eh3&5B2)sZNDmJ0EH89ENcc`?DWO5!>+B4;ClgKp)eeh4?c5H!9T7ApUuPCKpiS<*(XbtbDoh zr*(N`ZT$G!ueac%cxipAeB9cBE~xH>i#_sjDWG-tk#CzW~?B>G>n znnlRt%t(HzIOeL;P>^g6pmzZht{#Q71hs_X=XtB%;HrgFqwB#%tSI$7D_$Nlb5ZiE zbLrT3)D3V!)%(NMbDU!|ue9tK3b(_`VqTRS{2G`FQ1KgxiHH6a2t<}w?-#)_0tA}FMgRZ+ diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error.cpython-311.pyc deleted file mode 100644 index f4eca19091e6d3a5a99ce0071582da1393c0da9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1677 zcmbVMF>ezw6t;6oTZOg=1QQanU_cp~AjSx>&=w&O^BeU#o(F04S@}EfZV%EG~; z!c6pamu_LU7`ldC&;~BXe~}jy?_eOp-)1KFR+cJ8ycM%_)P^(33 zqD)x$j$FWb^R%cq{qvn>k8-Y6!Ku>NBoKu7$IgD|U!LZ-a#6KZssm`UzO{*IHX4D_ zP`4t}Kkml+#O-0~@u9o1mN8RO1BN-OR(XFYs=1 zmwS%9=%Vb%GDas0_w#`t=qtE%cdvPaZsbu)e~?>;)6Y+G=WzNN&0VI*=zn*3;D&Rl_?AW diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_data_field.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_data_field.cpython-311.pyc deleted file mode 100644 index b9c89c67f0f75c9975666400700535bb75ebe476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1999 zcmbVN&2Jk;6rZto{gv1W`DoLU&{bQ4%!hpeR7IsC$`=vAt&#v@F&b^WV|$zRu9;aU zq{_jODp91;8|r}`Q4#8$|DZPxM#^Eer$~rHZi~VJ<;0s=J2=ASzZhN`PD7dI6< z(Mak^z^a+BQ;oEq#wdnXkeR%X%oI&OjU)67o~Y>=GrfWGnPV}`<6y{e9M>~E%XN4@ z9%MH^yR$?VK3H1#aJ94&#OIy8Ah~9Flo|GMEP7??j=_1;W!{oa8`SZZ7<1X?UXvc< zC}3hxKt(LrYf1$0$wL5N!$B$1v5EB9$8cahPL;b|A`sFOW{f7y_)UmRBU1sa_TfYy zPWItcglUS6^=C8FPp~=i09CP>yPwn3571Xw&upOHcYZXO8MOOF!!wpGYMb|d&uGxr zX_HY7hv%B%Xcp%!s#%WaI#hG3npdZq32$gs@d}5r;c2@D*P6`Tu}o@eTYEC7#VIRj zn-ER~iI7OEfDjPEAP81)?HvHSb?V4?neR2O?HD#JSg9LMjq*Z9ZfV19u?n5j>Ymr+ zbH!rCWwhW?o7R}oD7dUv+;Tl$G@916W>-LP3IXNXV!txIOm;fk75(!;YzVOni}RcF zUjzv*mkr|FV}as3H{tj3uri6FtK*J4hflz{7sC^*rCD-F*OLil7Ez<2mDTmrA>hnc7FJcB1{ch5X# zY#;B(_T&4?zG~tp>VDz}{77CmxF+#ZUX{CLqwpSkNtiKV#=-oA^07eWttMqbiV(}O zJVNrRV61QJgj2gp$P06@2}l&A38~ni2_ZZMV^Ltx+NYJpx$>tj+b%D-rsdSi+bw2z zE+ZghnL0b=HEXNP;c~v!G%DLbEiW6EE95Q;A$YN;GwBLVq|!ucB1I}R_t<4v@!srz zYEkH&?h3^6kHGxZM&UHd&V0M{&C0`-!{O-=C9^sI;*39e$$$A(|ME3|>Pk2SbJ7tG zqw(uu_G~DEBZojIkPzi_5lLCV5!)jINy;UXyh|j=XA%kaWL>aHfi8f_4+$|u@evYa z2x+)x%NBT;kS|+?-Ss31G2IF%BM1)^QOr?Uju6uKlL!Igw@Q)}WVrwwzS@)G$U&*#t+p7nw zVGOBW%vZ+Sx7)W5Zu`pHzB1M>wMz#jU%BclqwTf!+QFKyTs%rngy@o*3v=k!C;0F^ zJxorff!_aT(jt>gcV^fty>pd-UEs9Zf;$MDGV!+(B%s)!IwPXQO=Jl%tx~7e;1RzU z23H~ze}oZhQv%6#1e2$!n~`p}*y}J96!S-5!Z^m*M^`)N`w=R1Ufhq+o1OFBM>jg> Ydzg3w!?FKuI@fRfA*TNv;FJ6P8+J<`ApigX diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_file.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_file.cpython-311.pyc deleted file mode 100644 index ba22cb9cd84a3df4d281bf5ee15634286b5ca1e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1885 zcmbVNO>7%Q6rR~#du=CnN*V}1jaXW#k`dSk1VT}%K#3D9EUQWah{e@tyF0PB*&j2r zZb+1aBUPeE&>QN39yp*P)C(shZrtHuq#Ud{MdFm(qHsVt@n+X<65(DL&pdxKZ}!d1 z_r2Nup;#;+C_jJu`{sHUp+9A3Trw%Z$0mRW$UzSFkdIA_C00DeS54K|OwG@j85mO? z&CB|_sRPb9Suf}3%{)d5T1Ae27dbhaf21Px7+PA)f|FlI<-(Edma&+!f*_2n$PEKt zRz-2+lN&X%^nPvWgL-pSsP6?kLT|VcWtMlOq>ns*!{WRfvZ&@!p9WElv5;--bm>^9&IzruY{~!y%k2hYIWT!-H|ll zl$%O+A{R>HoLn6#`ROEqq=J=|dZTtzWO=fpP_gC9U5 zM`J&XJc9NZT3T*D@i@vJ-c$C}JAko!kSxdIbF2Gal8EIz0{D{hm z$naj5GLa+14cv&3vMy%N?3r-tZ4xr+adr`6h&&;-2aFTKb?D1XF^vAn&E>_`$06Hl zErpI7v|C#}W^JwDL+$cVyU=g+8~cr+Hh-wk#pq(D6qnHTkMO}eW~|TTf#3gU@-k8q?ulVi z*yKP>U=(=V?7?jU9+`Z}i!9_2Bwb35ylxD>F-T-+(DQl9>2s44jLFYZ%GA6>$vTp~ zliambtLv-`T}dmy4<=SI#zS;@aK0X*%HZks5WO}yUx(=J!TB0zuV6U#f6d_KH~x~t Ke^2lw`~4RW!u@vu diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_files.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_files.cpython-311.pyc deleted file mode 100644 index b0712e9c0b54f45cae5092ee419a32c1bf6d9f5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1941 zcmbVNO>7%Q6rNe{`ZrEOk~U3f=&B$^R*QY907X>+rA`P~p&~{VTeqX_?%3XDf6UCf zAyE#lREZ)1Cr}Uch>B3}oH%pp!4)~I_7sUzZi~VJ<;0s^J0!vgiSf+yH#2YE%zWP) z`-fsNkD&bY-Sg%zX@q_goncWDfDi8gc#KSBVjDSF!&qR+mYkH9a%4?*6iso`S{lYv zrfg@Ntd<3=m}xubh(H2*Y(&@*UB(F$g61C{azqFcgYL3drx*L}-# zc}Wh7^-pe8$?|*E-s!bj0`c=j} zR^RT>1DrU_jB+rth1T8hf|29zMArA>)u%+yuz%pp?- ztPF4(aOT8#Ho-K@rcOpMb5F22@d!1sIsR~5%RNG$VJ*LbhTo;haBkFzS1g5=Uu99S$u!tkay~x9hSy~VT~gb=-{DJ@is3O@_Nh%< zOn1s2YgO)gKCkE<>($OcBA65s#RrP_i31%i4kW!b>fS=i^2%DRx^X*9^LWoN#eEja zKFl2DL{i*>{_U_JLXx)5+mweHhjOmBXbH0k&?>w{Mg@;aC8V=$>aK4YWOGYrEzX48 zVVY6D%iK_2_grd-WD-T>N)}oHA$)ipz_<7@q`5zwhmohyoz2g~E+QqxlZfaLH z@e_Gh`5u2AKPh+ysr8Z^pOd`=tJt(KGhlv1B`H*Rw?kQ&B?JWV2`Od5sS{@=oZ3x7 zMlEM&AV!!Y#IQjDLU;!HB7s!3cXa3aQsbt_HXF;H2|716yG-{zMnJU&b?-N7*4+k& zxAuBRH#UJu-q0;iXj>7)^U6?EGEkMovXWTWa%Y>p414Wd{8!e?!|N=7AAcXrpFI@K zqvFC>)h|}RT-_TxAE9({JeXYw&ddep7lU&bq8tpwqfs7BzZMmayTUV>5a2Wvtl&eJ5}CI~t4lLj6lb7E4$;y@6C+BV3ESxkY*lXuuF!mBtmA}aqG3~=-J zCz50(8zEuF(3>CPy*KK;mA+h0>I=CZ$cuqo?5*|I9;`(YQg)<3p6|!?g*+d~mjijS zSL@Xt)B<^SKQj}dS!FyLM{nQ6d)FFKW;zFC{y&owk>YU2hFut5XT3BgxNLUeVF8y+ z{2PR6NGHg@gdg$p82lk2CQ>z2sM~dTLhjko3CG|i4j7vgDBeu4c$B@Gh<1%#g07&K ye*-2;VT=QGv46VmqbvRYs{812|8xz|Tm92DN-tty;Gd?iUin=N|1n}NKJ{O^aS$y4 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_front_side.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_front_side.cpython-311.pyc deleted file mode 100644 index 2e2b9ee336c724918868f2f6798d8d554d86967b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1948 zcmbVN&2Jk;6rb5$e^K@8mX-kw2D01B)>$2*SvU+%VvV zDhgX4T`!a6cgxG~RjO-3eJ9uxnRPd!%<_(vM|KAXB*k2R2oz-5L;qkePNAnsL-6h|D2J1Dv{m(-&|i z!8FTeE@p7D53w_G57n_#xI1Cy?xD}Hncqai|Hh=4AGPCE76#F#>(D!YDlW%_!Fx=G5(`6*MR>=Hq>BhHYlkMZFnCExuSP*&(CFhiwl)UOlT3f zMXnCVAWe%mMaHL`TMcSpHUaX95*d~BjAuexdyW-Eu1$7!E!N;nR)I(}8nsyF5n{rG;t zy-=%$7Vni!!CP!vni()ZAVU!;-fmGQvV^#S8xdk;#LR^~6HdK4A){Vr&p-~5BgFPV z0YZ2N#n`>EY>~@*-mXabljj(+i5c^3K;>_YBacATX%2PI9$QkTb8{8Z1S4r zhEm&-6z{O?3yv?r4sPUo6NypD%fSdEbzM`eFeI(5|TH3;gZ*F&1 zyV`crpJ>}XZK0W0$OW;)eQ^`P3*-tTEso%PQ8!Fo@dJIc)V(UsIh ze+Eq(hf{C#$EI^Y^8YhAnJCV7W|&krK2H^B1v2YxxLrUdlivuDhMIyROt_KPkHIGj zi4+amK2L~!c67lp`Bh7Znv*DAN0N7%T}lLdiy1JKtn&L{`YOh_hhFMl?nkKDeR@Aa h3*F1Thpu%m_kQ|S49EVr>ArI9PdWY92w%M4e*lMy79Rir diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_reverse_side.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_reverse_side.cpython-311.pyc deleted file mode 100644 index 0f4c939c0410c5ffd764a0665629e1c52cb4a915..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1959 zcmbVN&2J+$6t^>z&nEq%OF?X51OhP`G~lG2ax-4m$YPX08^})ILUx8`?<)vBfEE`cXJ_k3&z;Dwj>U}W`$1@iPT+H0 z5rwS}u9eB!+vT-)D%B04yy@?Y^rjP1X1XVdc*zsjOwKz23(GF`s2`RY3)t3vho0cr zVQHF!B{v)wH3s;!2jEk0E^H`Ny)hyJAtPlcXxdh;fM*ujD&XVB zhbwc<^fia`F4gv&u&sq{sFN14G-L1 z0DEofM^T!NJBs=Dcyf<%M9pfOev9&AE;?5|=rW70YV9!W@YPbu3K%Vh)TJ$Edc}aX zO4~umOJ>J;t~1gOCgsthLydNlhl;|T6-SDHIE@ymbg@>xUar;4q+VGsenGGVvXxL@G zP^*DYEtzYw$W+Qen?VSlt^@cI--Y}S$MZ09AKC+Gak=qm#!ejIgT#SypxXGJdXW4E z--+HCybqJq9sE zmJrJY9SGrR=*!H~wB8wAUv0b}u${(QU^{-RvD0N{7%&3bHK@Pa*mSlV9G>FK9n;zY zK6%4*0;zCGGR{k5X~{@i5{XMj>Jlk$v9r&fge`Br_#YA!$9G!+Z(auTXAcdZMun9x z%Aaj~zHyYlJVc4Y>|lB2>-8ThKkp3{=*2@d>%0?&t#}Sf5 zvj|DLBJtUhM3=zmGm?1U^e7=BM~D~LUC1;d@`QZcHQmunnhSFd3OmUeuZ?MbKD?c__Iq@SHVCVdAm{60MA(AGKu3pDS zuW$F>>Z{vveW-2^)Z#!b^eVl|VP&B5fx6hM_Ns@~f%@)1o$qb-HV-!k>hf`VX^1W* zXNQYuK|h**bvUz-1&;rp$;v=cv`26HXiv54D j$LOX0#X3N*^)J?8>Uj*;{-^1`u==|k{$t8qbl$%JfL9yH diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_selfie.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_selfie.cpython-311.pyc deleted file mode 100644 index 3226ac8e6be4289e327a8faba96162ecdb0e4779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1904 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_unspecified.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/passport_element_error_unspecified.cpython-311.pyc deleted file mode 100644 index b01c7a47ce7b0b05309ce7fbcb479b2970c0af03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1922 zcmbVN&u`pB6rNdofA1z~nvg~`)Z&-0M0SP50Yw3Ul5JQBQA83U%%X|wnIvw!wwduZ zq{?9{Ria4H8|r}`Q4#7LapNE0u$6MKe2T;=H=}SsIq}BcO}AnZ5|f#iZ{|I}nfbow z^^etR2|@e$``>m%4x!)WWYDrHz-I=42Z$ny9n{7K#u8_oOj|LOwrZ&DtdWH^g{n@j zoj3A;voz-v+C`&?Q3kCbn!k%^ffXMq2t9_8Hlsv~8%Qsm%BhZ{vgx{BUf%iggWz5Q!RgZ44=ITLVY zp_#5`3(;Yk?MmEv8msw^X|bBNxyLjnsewSv0(x!AIHMY5@SIx!4)&OkKo+K7MTryxkk(UhV zTk{Y3EbMsuwf|6{Hn`dxM2io={MAMA3#dBxZR6{eZ&r>gS7Vf`j)gOG;q+`cr-xUr z#YI?1R^t-7{Bm5rn99i1A<-FRLwY5prwTZwcwC}{=LAWzd4eQmNdfRFiKfBmWl6qk zwizK&iIBEOJC4K^LcZvjPT!L!gnAYzA?qV54^?eih~tC|{iH#htfhpYsM?pvVvYj> zWBxq2gshx*`BfQJ8JMDU`~n6Tdiob<)NCO}(p1pfTljc!yL-K-Zm0c;x*e+Xp<3-W zyUjbzQ2i)Wr+Z0%qE3hEE1^2kUG1*kSq;^hll)YSX0v1QB)X&@PrMnIr;9-6|1(9I zD9LtVxYRhg&l>OwZ0>a6H3K%e{1QYtC@!eRlpFaTa`+ITD9hYVTcpfBH@fn;{C1^8 z%}A8&Bgs22ET)RR!*!TSR>gfVv4SxU(Tlxj`w6P`{=J`|*L%Z!8Dq2CryoX4InvXPu9>Xe!Qzh0qYE_>IwWZ`!ZWP7b<$fHcEj4d!e7d%b7vEc6 z{NVlWO0K;V4W20F&gKRU=oWLs8=E(&$KkBCW=vU-BFy%I-2~prt|um zo2E(3_%%PEyMNSd7#rJuYRB@XHlqonDUEn)yLKP;*jW<9E}_Kcu{}x4o1w z>)kk_p6CHFbXX$X6hg}35`b@&htO?&;s?tkSdU?ql_Pdm=eK#aVK zu@?Y?7^fA`MRVBp@ac`Eh2AGI+vzRF#E-UmI~j9%%rLOtqtWNRRe!UW`kY=)TyMwS zqG`|dW6}N{K1gWVnG^*Jp4-WQ%|YFAk)qp zV~#x<1W+M`y$G&Ul>TitFLsHqofK8!_yGh^@!wOZx?vSah&nRP3|EJ%cUMRH`beMK zm-9D$u27NjnL5&EhTUQJZg-@gJMJCn?Ssnm1)4LOg*96Rrv8tpievKZkzg-PuH0?a z1U>x>-UpzEi4RSskT8Bx&j)VflVeU-fq zs^BTT52DZ%MH!)2_D{|O^xFPu^8nfVC+7&A+dnxA^O6FoJuAMs`j@c&eTqw7^k2gU By%Ycd diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/photo_size.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/photo_size.cpython-311.pyc deleted file mode 100644 index b096e8642fcdab72a2b85891bf14693fa8a2a44d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1761 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/poll_answer.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/poll_answer.cpython-311.pyc deleted file mode 100644 index 6276b6661565a011569da396ab596900879281c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 zcmbVN&2QX96rZtYzntA|K3dv*&=^Wo8Pweqm#9KiNfanyTdAoK?nZ-SPZBr&SZ2H} zsd8APN(2cI7t{kiq9Rmr<;0)BVJr1u`4ov$Z${yOa^j7h-6U!yB*t%^-^a|`dB69@ z`*W?PAsD~?_{T=8h|r%>8H_?M;DZ2!N60}A_K=TFjHRr2im#fgPfX$$%z|Gui(pqB z;+6ceS;mN|yb5~3tN5C!Wxk>};#bWoMhaR+PU#_X%B=iEMd&Hae3&(-atj&S3#l47 z8L@&OjI78F17VP)w)*MKCA#pz(!xg{ww4q1TCkIl6<0(_`9?=Bvb+~K-&tQ}9^2%W ze`EbFvm=N_7PhSHeOoYY=f9V8lE3f)2jMG7mLU^6$W(4a(x&Ptj5z95@KumQKrS4~ zMYG_PKravVqEi7~%XL=bb*Bi=$YaGB+d~`J8GTqc%X{bxY(koYw=te*H$%_67KrZ(8KKPI%gfu1PdaeTLF+pN%gnYBP9!8>Rb=*sGR~|jvnW!S-Nl99%>l{`j(0AM* zT1&JrLmRB3byy!je@6lg&U<0RIJH4J;gg`RB}5+BQ1}FZ$Mn8cW3pTL34fP$HFTcZG6+8d8~B)H!*l+E3?(UuZin%tOsN~V5v4{c89#Am zDwwxH>8rN$*C1L_q15&)At)6k&}Er*y?6NW;(Ys)kZ-paLdOj@+uL1kMIon9mo^LT zwO8Erws0eMrDNIK)+Q5e%ME2~H=~^n6V0qZdEFYF9X(nZrx}4Nbh2jto_~GIvPn0HPtInx|X` zIfrdjN*Q+JQj&${XC;#`WJTrYrE~$9p-Dgk%V(4(8l`^dbUi6oDgC@_c}JcSrA}yr z`3$8eJ_-Q$utr?AM3#P1J3`uK(7V*Y{35u7Y=HOqtXx$au&Q+Y4h%p!eo}=L$|;hp ziV9=BmEOviD>2byGTG1Q8JUa;jo+B-UGI~*oSu=nn5@Oqv%SSWna$}LnT^S3`=zrf zI$x-#1eCcvpo2USa|BqE1(vE9;~2f! wKTZ4S-Tr^kKGOTAXpk%FgVGSxp#FI&>$WekwK%)Y<)m$d%<3RjlSzwAQK)c^nh diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/poll_option.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/poll_option.cpython-311.pyc deleted file mode 100644 index 26d011cf9d1459a4fa762956b96d63c96b666e6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1679 zcmbVMOKTiQ5boZ2>_gg>tOtpSWQI84EWx{nBnX5EP86YtShBzh!Q(ZZ*_oC+);u=d zy|&lrpnxF?Bq5jJgMCaKjPLmsIjkXvWljR0e4C&gj83VV(Mnbl2&AXGrmCyErt7P( z=a*`=LZJQn@VCvM4MLuyF>GLCqX%t}4~R!R8jz6Ml%ie;3ZZ6ep>FG;VH=@on=r3= zdQc2Yc8L!v6VJR)ydp0>)(CkDBX9PISGr2-N z)m1K~v&EMp<*S~Xe=wJN{-Ot8fbunD$caroVi!JxOl{38aNW}uz*i=o4!Uuqo3;Tt z=w2zexhbli>6IT*Z)}fjQm=NuW*7I!U1~#C!*_i=sjSCAke~S8Ud4j8anqMpoE_D2 z<48GvBrQMMj76AbZ#nI_tE@QUmJ`W4Tv&0IFs!j0s{`R0l`PQJxGP*fZ{1X?Bj=k< zHx|61j<9INVyoGXm25g4|2*!>qhvc1O)8P-ir-a<=0_?Sxg9Gmm>YK^wRSi=MEE)a ze*F}fH*O?V+{ZX#>vLJBVglewX4pxljCFdR0}EWXea8`7QXs7oQ*hN4QKGLwaxPX6 z8#1B@V+2|E5hy>>2f!OO^ux?!7*Ap3?bfl!E9}sn!j9(AN7|156a7A8DX>agt81bL z%f&bfJm3>jFC>QScDP7NjQNqT7^|Df#4Cqok_VfN{cWe1gzZV0F*k6eWK5c1Ve0Cx!P2{4wp?V z49hFi==8){h_o&9daaYsFxAF$O$=P zNrka6_PPP;ql|sob%G;LkufiJVS0?QS1vYSn?=W4m?fK3k6?8<0KtGvZ-7f;g)fO2 zTs1lrzz-syfB*vMU3 zrq87XVyqYTi&H6?HfrevS-3>gkuzn$=>Lf_hRI?b3xQS35?HH`B3PSU;6H#Rkn@QN z6adbM3=F&=0*NK?E+l%}kzABft%do|EWdF*f&cCtmDf`o;d~o|@+=0Ps)o!?{0j_RoKDWrzO@ D3v9UG diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/pre_checkout_query.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/pre_checkout_query.cpython-311.pyc deleted file mode 100644 index c5a47042c998900f55d5bffdba8f3eee0177eab7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4106 zcmcIn&2JmW72hS7;)g_0k}KJ=<76zyA7tfK(jphuDB?PfYPXi%N=9K;!D_WL6xZ6_ zVP=+6=(2@U7^qXYMS3Vwpg!afxCq>1(Z8Yx3P^#)o&@yd8w(d`;Zxt6C22`^P+vNl z9nJU5`@Q#m^Z2J?v7kZv>mUDCuTE;(Kd>=KnWUmW{UuaB)2K#uPxJMfu46srrTla) z?He`2&(t!iFYS%^*;*Fr2F-XmKVQr18cT~QIzqEv!5^)SsJaZ|K+f3XP z>~e!So4ghNsKrDZmgjE>%EZ;6&Y@x4l1w;wk3lk$ivIL3Q27<$#I%}DwOZ;H;8jc0 z6fwo^#b&d?&}}x*Ne3*9fz^fu$`k5 z(4I`%EH4VQ2!B%#Q}p%wT3x3{?~T_Ad5yk72|al)QyaaneWceA*HiJtVX^Q2u0SBI zG+arz!ihLM2yHiz#04aTuh1vXha zhD}*rSa7&tX4uz-$;HOPIuGT7-E>dG9)m5^4r+azmZ6AKE;VDLF1U}1wLRCCVjMt> z^Vny#Ks#~HX$ipsryZx=AdJUCuocg;ecpmr$qlx+>oBWnw>@strDw%~sr(cU_#mE= z4Y%0@Q7o=Z$a3kkBf}{}TlgR@aI^~x;V7rX3Altfi8qcMZCh+e zfvy#g2o|13(?Fx$y}q5oESEND8tRL+ViSSF^in8D&07PD9kMfg%Hr{aukH4#h;By>Z| zDi`9ZeS%n$d3DQrh26yKuz8%fEXT8@v@D5?gVv?e&a;*Gs;fWYVsrH}rvUrvW=q&1 z7Z#YqDhsw&f9S5SN;hN|nzplPZ!o!PyBr;OA#699TmWma2IgWV7T0WxH{p=GvxhZd z4yA!%xeUdBcC;SRiYI?_<&(t+i(ies*3tlE`km;+nO+G- z)NpS?JMw04a@fQr$pF@#!nRtR;+wIt&bb#CnGhh4&!mLw$0L0k7=u~PkmI1y*S!98 z4I03=I&duT?avM5#*RUaj&^6r8K`NRewgm0QNN$>-v?GF3Fi0N32X+eRKOfGwGJ5t*Fv^3Ggo`(Y4_z+pgykyA^We z56AYrHmPG*|3Etog}dGgnXD$Hfj7GV_u!OO*Iqmid~@yj#2bObNZ4QmS%5TbiJVn; zh0iE-P; zq`$*RDa$llO=^eCyrurFk!?3@^tXifh*Vybr(zO#UtkWcQxlWjm8a0~l{udM3TNk2IgwjKC#Lj6P2sWxr!dBQiV zWVy*4x86P^W}UDtcy0hZc!oe|+Y|0aBP8cHILE6C5N!)IZLfQ5p0Lm{%gPW?8sM4) zC!4kr=ceEe1G5>bOmTgpoxU}`Z+jBats@+`H-14Im%;(QG!NhW01H&fkJ*PUSHKyt zLxpcv@caW?o8$`e1{i|k4R~TnqveBk1hXj$fv)Pq>2^riM@>&X&L|9wOCBgku7kWS zxY)}?8sJRMGjqcvbIV+a_B@f?XX_kbxPwLk?>l0M+X8!sXzrj=V*B=8gn8WqP9`fC zz?noS$#%nqYqfccKqv*Mwq)YpI28j072h|}O4{@H}O^*SsEKXteV z06^Zb!Ha|N)LhvlgZK@U1I$5P38I725}!$+0&(%i$OHS-ka$5AfRv$)Tmi!T-Z@i6N@>Vmx)Vf?qnZ4yI1js*r;<1Ueqr=O4~*H8 z_(S!nAmk|asYpcisc_^t_F-5hUc&-I2^BnvH?T&aDCo@d zLoF`$BOQl%9)wN0I19ZJpWb(sQp5z#$D)J-qc8$N$n(Em%E;t;8Wv+(W^8A1XYu33 z$T$_vocNUe;qvEO-5GOt#{6o=+_~B{%p~s`CQdOXcdqYT|M+?@rDe8Kkulv>dDoc6 zo}XnR<5*YaUE^3}oQuxSca52@0VU>LV?HvjMQ1BJ*Sba}$-71+GA{0AztPi9X2yHR zw71`h%y0FM%;q8D`QODw?fiT%`+8=!r@dOC>_wroRGvf?)msoGgNg)(IPnO)tiUD- z=1R9C*qs{$*h)bVcLAY@JdR}hK}+IF%94uMZy-6SpALyW&;ygR(Q%&TE+(e&UGXk7 zQF-$3Q1sHeu1DHj_h8=B7P?=b_q5~PgLzLQ-Gg~AJ<-$B`iaPRt9vj<#+mNH92v*E a2Xk*^S=RyLmzSUZ;-6~dUtcq>#QrZSC7jFv diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/proximity_alert_triggered.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/proximity_alert_triggered.cpython-311.pyc deleted file mode 100644 index 8ade302f715e4aadf7a87063dbbc21ec5ed792f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1657 zcmb7E&2Jk;6rb5$uh)+4eu3Hom9~5cRs#Eo6jg{4qEJChrKC_6OQXr|*xqJ8%*;5c zs~lXZ5=DHSP?6w>3aEF)AHg994%YS(332Fct8hR)@n+X{5@-*MXP)1iH}B1RzxQT; ztkm=8L{b?fv2e7szW&kW zWwP|n^3uDP+AFDkF&;g@#mUAx3t5lT=>3gr%#&biToH_Wh2Mfsufh8tfcz;Wz>tf5 z-|93Ngkxl*?=>_VkvCdXSSEb5(GQx+SG>Nw*rsZ z5fg&;*sHJss_j0D*%sq)Ul1sW*@ASX|tM# zvz83G#}@6rlmoHYYIzA~O*zG~nebj~Baxy-2f+(-r@7DRZOqTza0_5dEy?K?*z&Zz zO{E7{rFsy{)bax%Y3#AoAx}Vukip2Ou?#%2xlMUbaMf(7$(bDTI5pZy%sf?VHB=$X zuoe))`)>jB4ZZ_iC1-lrxeMzatYTc7YkX}7?`S)^kH6P1{{n;1Kbe zA`KuvBj~x37!Dv0i;y4=Bq5HOo;(yR5iINy@-It%49wFCAzny@AVioTtLoe1M<2hv z*!eKwo1LY^58_^DbI7SoI02kHEZ*w87i@GyAlYjJ>TN>hMTZ87>g<*r4VY-n%Rurv zka;1RgAsok?zv$<0psQ@hjVaBECKm@jIuMRe(uZV&sM%z`MvgBhO~NPa`yaBum5^A z(}6EGF1ZInzH>nK!3}b%1pulG3jA_TfynEMC_M6t^5cp-0mQKss4DQzpbuJlH-)$f2(RKn`Cglqa0lr$Bow4531pp9YmsHGh+zQK!@=EhnnL z;&UL7`N1#KjFOchMQW&YYTO>TZ?-4K%M;_ocy+vbb9G{zKg7SXSAHr(CrgdYYE%HB z|3fOuEVrE#es&gJ+o>ufxA>v6rb6T`##%oEQ9g^E1+2^+@%NX+R9R@bcalVT=8c2Ho23MhS@i7-@G^T_PyVG zJHOQH6$In=@Bi#xG7);D7Wsg+8u<7I@Oy|NiUSm42V*5`ffnkH9vY4jnvMxNof<(Q zEILJun9dhrZ3d;V?37bmA*h5^r<%&epcdAhIz}2=L$q`o(K0LE*AaREGaJqvt!yB> z`dBS(oK)Q?ilr<4I1;v=)Hgp_UnQ+~S6f%#Yp*5x+tEQ{Zbe{yjI#rCn=D{G?uH+3 z?=nwEby*vg0+Ae))YOkSbYJE)6k<#x>}+(BPpr?`Rgw_Qu>`FC6KAd)wK ztXMFvvp#2nMN(L<#V3haE~SiGG6r49gm8Pza)UVPS^K`+vE&Z3qCvRLxD|IT>BAPw zm)5=uKGeZRC3U?K54guxtQ{%)Vx`&iV$K?Jf?gx$z2y13eEmaS_l7(wLtCtx!d~!q2K*^_(d|+yw^7 zJ$=TSVV1^7u^KYlcxYS$dT3l5883~DrC~}Bjir%s@u;{oM)T%JcwDNMfusM$%c+OV z&lKn9@;KY}yuzeAfc6DUxVlr40+bW#pCzu^gR3r1jBQsiUQ*(jC#6=ECtiA$5vJ}k zURE1U&u+*p>Y`5;XDxmB`#Ag{6YQ3ilt!oUJSknys`VDPVX1%?e*hcn7~>IoWjISm z=)&;%bcC$oEFI|!W2ECZMn-EmOC#gW;Vg}eOT$?j7tUf;m}m3v+JC2(f1YDcll%|X Cyz-#{ diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/reaction_type.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/reaction_type.cpython-311.pyc deleted file mode 100644 index 71464279b1d93a87661fcd71490d6051c88e5e1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 871 zcmb7CKabNe6n{=zD5ZA;AK+w(sS=m$6}qJ$2GAYiDj`*oT*vmcz9w<79i(mye1O|- zU)Z{dwV@_^!eS_vo8qXhgTZv)WRlo z!X@jaAt-P@~FmbHIX1zEjh4XP9pLI#s1+Vu56>Lbzgte1wg^%Bzz{ z!}z7ri+H5C%xCeU)YK|X+)1&>U&qg65*um7VL{n~&V-5Ukw?|Yqo$B*XTSt1|seT{LQ^(dV dgwS`u-*(^itvkpa_dmNh`sJ;^uW?m}{Q=Gl`HTPn diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/reaction_type_custom_emoji.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/reaction_type_custom_emoji.cpython-311.pyc deleted file mode 100644 index 1733a5bb002c169d5bb6c9fac5c29910478f8ce0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1660 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/reply_keyboard_markup.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/reply_keyboard_markup.cpython-311.pyc deleted file mode 100644 index adf898cd7c60e5d09e3cc445e4e097c142292d56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2332 zcmbVN&5smC6tAAH`P`ZPU_o?2EZJ3efSm!AgM^@hn}q-a5tKO0rs(Oe*=@F`yQ!)H zhKyzpL@`lshJ$-F7{lGa!ozIhq0^^LJaHSd9?YJ6)xAAH1WBl=e)B%6URV9zud073 zl?n*jZ$JIsnkymnr!tb3jumaQ3CewBAxm>mTdQlD(o;^Vt=IK7uH$yPo^EIA8Sv{C zcCzhUJ*Oe2^9W)oojp@q2=$NMZivs>LWa2uz8YjWkFm&_uzOUz|p z3fms2CbpRn#u5`mZJfYbnrzu{TEuGs2ni|3$&RpH7)cD%^g6Dr6e9F4c^z)DW8?+U z7`{CnVUR%6j;au)*qTzjyc&t5NHOCU7sFgKp|&-e5cg`+^PI)7WDDvuE?_b&JRAe$ z?K_Mn6T%74WmMYj$F8l?FolqOG2Csten--l%^ZvRj$yK8&#@Q}^8$(sg}KSfX+91t z<`YWnP-3SNyFi3*(Pt2gQom~%uCz_Ma?9XLf~zYb%y0(Wa6?>!RhjDKsisbmx=Th7 z(l$?n@}qVi&b&##D)L~flcn0~ z)|F3=HLiGkrE$u$Yln0vEv&Tck@E!muJm@A5h4a4@-JyexlpNVQj zn_*RHOq`0}<$K{ZclJJ`1eIhr(=b9@1o6)*8tg-**T0|tcHz5)KZ<(?C|4Q{UVAgx zcQ7E;VE=o;?1#bB^q>UpC^i^HlQV;{p{d5l0i|t1PE;O`ae+_3Hp*j4i@IqD&p|Sr%;Qy!FMa|RS@Nps)TC*WocNTv<=sTqx2%BH#&y19m!H^c_z5WD1GAA zhdMovsvN6VD8RzfcAZS-I8bkm?*p$;wEBp@p+*%G0i;AihX|ne_%}%5bZ&r@D57+^ zk7uE;# z2XjaIcuyaLRDB&E3Gj`8%&ea2rCbS0|fiRSY)`!MHjT z;aGAv(Ps2Tf{{o3GgdzX{ diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/reply_keyboard_remove.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/reply_keyboard_remove.cpython-311.pyc deleted file mode 100644 index 318cd4dd13c5c0f3c91d0723b3b331cbfbc70cce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2031 zcmbVN&2JPp6!*-|>_^CM3Y30OkgOJ3wj#Sy4^oEKG3#jf+$ugka52@i8}fM`@&!qwOWj-C*M6~6 zA)Vr7ZF-=53!!l2Sqyph6$r^IG23%kiMz}>0rnbz_R0X-WtC#gE3(0C=CbO2n>FsD zp2g~S8ea7-x@~#2IW&4VC$jyQc@p-|^L|%Q$u9FqEOYv?jnEi|b|n!pmfYvTau6?I ziX*NRUEp{n(2H0v1`3ND{c${s2K!;aW36CG7{a&4A*|%sPo)F{ypA0IV_qx_z*8 zg>K>L81vgc&+~)998tz`Pe?3cKB+>?@H?oPs zxE8h2;8VX@$xKCC!n~ z%986;#+fqoYum!?RcqB|)_r@m z^o#Xlet*FEFU`u=VCf^&v@;hH!DUt@B!~k|NYl;sy#S9uR6Rm=0+M^-%dAF7UIv6H zgWR04wXLh4Pj#*exzsr=7#y?CQYxtyk^tKs9xrz;1l^8;+hj7K{t}!%)fv`MJFlVk zOEpw5-b(uNP1xe=L$BbmHA4LstWeV+{$4|aH&FfX4`;rc`F`f<_@M!^>x~WE{_WF2 z3AAE(_S()MpV<+c-~?{SBH(e*^EAqa(M;%hrsO`O?FZ2uGt|X2;)G;lghYa+q0z?) z`6{L1&{83U34h3AHbKY>7cb13N|ENW%tOuULw0>0hL90Uz6~a2vU*Y;G^?N#3IYEd zNIe7raqs*Fw&PX@$cS17ETPhO7*Q0F_fvVG2u{ z!j~0ebGj5RrJ5P%;U6$s?#@uMRXtHq|Cu}rL&KH&2E?FbS=I)6cYSw%hCW&Uul@{u bu)ezw%7-n8=-*=fVEa!q{nsmOImUkg73M{& diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/reply_parameters.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/reply_parameters.cpython-311.pyc deleted file mode 100644 index 40ea5e2f810ace5d8e9fb39f6660ddfd4ced0a5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2474 zcmbVOO>Epm6dwQXUv`tGp+BT;wlr0=lvm{&k|_Ae)s$0PkBQAK%v#NgpoD`Fn0(eOtMK;G9(Fk*_Nw{p;T2vt!jo= z)eXIxGE$&Zm};l186yL{#&kPd%^5j~a7E}Kr|gbu-pETtCR2o^ZxNQ^xqAvB_u);N zQDE6QQp!C>u_T2#({Wti^exx%N?Mq|^znsBI`Q7*#Pr#jsZe>xSqatimgk4**%}&| zcBox;fO#w@3#88QMYC@EkEKK|T;eug5@vO_e2rIpaFKtXd!D((CmrANS1RbZ)lvx~ zZTtz$=MV@^42cm#z6=2|6ee?(DPy3^5T+U$(?He}SteX(se9n{K6;Lukz#4ENVR9A zApk1NZkv(YH6z11z#`wCk!1ytJKJ)Ob%DGmk$H#cXX^7jZ;kF+ovHA2-__ZH+hkE< z`)?JD{B827WEAE|>$h|;?7YZp_R0klg2sI=yqmYPMQCTZR}og3dqsizVy$gZTy#az zzsif%B(lJpe$n!ZWo|i3MUOlFa5i3J&aI0IKUKWy`!(;>$VkN%eAwU0(6B3(M#`@5 zjhHp-SnTAPk9c~hSdJfNx7<*R&1@cQ;owRPgDYS#SoD0cun?vyunjN@drjMRZ&26= zgZy&h{7tkhpknBhDGLl0` zjsOXd(p~waw6?-bSiM4*Z{o1RChhgA{r9kk`KQ9sEa{%Z1zsV}DsS|VJz+ov3vlMSc-A2BH((858-qNHfWo`wAJ1N~(;vr)( zcrge6ieRCl7GoIZx6)SOwhb7N#0ePn5OJpkhEa63NCzqm&_Gb1J&~+x>4+fdAX?Ar z?CR`ivw_+ON<*ttO?4>gYwA!W6RoZU@1A{lB1j*9qR11H{*)kXs(lfWHT@ZR5{o*~ zrq!UgZ*>wZlD-C}unyOP(YJqIdSI`OPCpu*ZmK;^6)5&Kbs8=9!UC{IuNKIt*3e-(x(+5@vn~t=RWxDM9?(^JDipZutT7cPWlIe@yQ2E z5AC(_xkux3!Px0w@YQI4Zw8?8|40Ts#%|k0lv=@_0Te*)7wb?!Aol`4@1YL&0WMII zJ*+T7M}h@Kq|u;Iu`T>Gu%y-s1VN~lO^*xAURY?=`M46U2>8>omEdE@#ojULo9VFx zb>req5D^XDFF+zilB9sV(%jkC$yoEn`a0=v?(6|6Hh1=Qr7I$mG#s?R(?(IGzXiD< R|0LfyPjK|IxZFgqe zuq6^XRH8`04HbzVp{VMeGk*Ywt;AvFQ>31HGYSWk6L0L@Y^%V9@yzpk^Tu!9?>BG! zi)Gaiv|oSxz27Jy^h6o6W)=!Q=zww$QABZohSjxjVH6XtYk1f^lw zDPyFe4Mfd5h?ZFSfsW847)5g`w7iMz%2Q?9I9+hVFp{qHqfpp-YF+!}$~sy5V14b< zhn$O-QX!MzG+-z0UL04c)53jdD1H)7t$zR_`m_>D@dCm2UFx|*CBmJ zrote})2mUI+a7wvt7B(yM2G!sx-PdUSF6v{taHru^?xN4JQ{6$Ne4?&7G}L(`|BgGhsqDcU;j-LXmhL6QZ94ty;c(GfKF} zR-0Q=#$vVI_9D(&atg5(@j<&6Nzry=e~C}GjE}a=BXka}8AqS`q5Lde9QweIWJE^9 z+j1rGX}Z9fQE*}W4sv#{wjD&}&(TPIl zspC*hg8{{Z77)S*=Rx@%--Agx^TW&o7>{5S?Z%OZYP)z>qxinItN(<*%S#K&L+|hg zEPaSsWGwBh*f<7U0Jp2TFnN|t$0#^t^gvwkU%iiJji>uv_ zBfi~Ti>MzCy4wkm6mbIlc3F6<`;p)43SY97*!8yE0TW%=d$2f4lzm#y1;()ZfUEW;G^DXMcMy(?KiDtKQtm zXXfGng23%5&;sAZ5%OG9xbtJ;FDUJ#T3J)Pg;1V^q%}f@5lsT6*9p0qxWUv@CWJ=b zl*IG|Afw-df(fG&Yut{@7Ta7+>y}U&_!)vynB>yJsi%N>;V1 zz}Wv2RTU_Yb|m;~v%EWYRk77ipxA*euKr$W32Fd}rXWJq6jwE$8a-Dqu8$?~^=n3ML_lQ@){p2F_)%>OS6<+J1cKysw+jw@9 zrK!+N$0Ai{xLn&lfCPq;O`eBuAktCkS)$!y1TStIJVAhb%#rVK?7Q4C#P00QOE`iw zhr?KpxMasH=^1`t-;HaN7&#cliim=ma8QwqLr_GIfGE3>hyh_lmL%l(f`y0-WN}cB z?B-HJs*~vh5^EB%l!V4FwZ6?F2H7FqC}B!<`z#hV7f(+!P~MW4Uh>i+D$O9}aXR#_ zKK+Z*+P@~b%A*K?1K&X3TiLH0V8G&JBm3jR*e@&76S<6_OGa8}s@v&ALV~B44fli` zc0!?5hh_2oWvwntRaB}d!G60kYfzf92~av~QaTYlPprO0>D!zoOG}+nE+R_5poP6Q z=l)(dI23Xm>&qaV~*B9wpI@N?W)aTkn3EU9Hf0Mvr5PmNc-SQ<}IrgF55;sZ#*nh uek5<1seKmem4Ug7G5(3}ovx2xh@7sEdF=)^C;A^gy#8ZX|6XA#!v6y~nLZ-` diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/revenue_withdrawal_state_failed.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/revenue_withdrawal_state_failed.cpython-311.pyc deleted file mode 100644 index 5a08e76f209f309ed94f17df548804574a6967fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1651 zcmbVM&2Jk;6rb5$ue}>PEu}y}MY1S8xPtW&2x)1Rq@f~;P!rU!xSCFP#?ChTVPB$wh9N76K{6yBvoAwJkPv+Gw;pE@AsbP z*G9ueAiw|kM>jMO`b!N)QYj6*?}G6VF~o3yLhNF!Y%S12-PJ?GHNuKpfjONSff-ia zD%cff2DQ*~EsQj@fLQfDVl{3((h+(Ly%g7G)-r0@durIi*#wQEIH8FjN3x}7jg`+o zohP#&&(D5xb!j2fFGrhMb5HYto1{6YwO0Mv{7p zr{)HgO~Jcq#5i;8V)1gE3Xe}W*OH_!r`v5W7TigAzf-#|jm$`3)WTvCsL32Menp9skp3p4QQ~`KeS?ag z6pG-?6g){qlo?BL#66WjCF-l(6DmU&!T13`gtAITewcX#{W0`XZXbG>#_&Dt<9pgK zc)KWEC^&toxZ-c9rDYYF_PNMvg!qx45YjTTQ^zhxBoDfT6!GE&?4DVKcmb7?5UHvL zlC^a}=cYT?W3k?ujhP?yI_s&RNh}EP+~Luk&Z2*-BcX8L?Ne`^_PFd&KUUdjE5>Ad zm+ZS#qSP5dcnw0O1L~hGl%Gb8H@}#V556jV^-iH;aWtLDIU>A6cyoi%(_>%HZD5@eFazZkjkT7OxpzJy!U#2t|da8u5 z*aO~buqHFh0x5RRP7reJZw?`f#R6W|7*gx;Ab?C@Q6N#dyd17o#pe;TX1#yd}{r*kw}xsXqyOYoHKd~`Ff+SY{}{Xb=? zt&05)m3V!0%Ozk7IO?WQ)4-8X4_{_N%ArO|*s7|9sirINiiNV|YwAVyAk<@BvhcF9 zijx#G2ep|p6Borf7%Ix-HmF?381JID2G6!9$Qiu2J@4H`GlOSaZcbqU{=6ET{otvZ K{(FqCxbMGsJITTT diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/revenue_withdrawal_state_pending.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/revenue_withdrawal_state_pending.cpython-311.pyc deleted file mode 100644 index 3e3af10529834fc7d8588e95f6fb1b621134d2a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1633 zcmbVM&u?Y6H-sPZIvFXocdk^TMifyTpb$G4D_aY+PqhsntOZdrwUpSWdW66sKe#47ycaW6G~#nir! zRx!2iO*+8sQXbp;c<^MA)0m` z(~0}sW7GAuG)=^GtL4RGGc73QJk$Eba418tph@ zp5jW0dMo#YBI7a`KjX*HLFvd3D^K8g22UZk4?R?)_%8PGUF~=LDDP3|Exn!J@ekC{ zWJ&ZB#$|;NKk`#T8iqW1>~ch~V3m+Oo}Ym1(jvqQTpF%wVuXkr- zMOSyd&)qcU1fcG+Xrp`GU+D_y(esJxt-C!Yx~>nbxnWB|CR#%#$PpDJ=YkB$XeL|y zJvi*n=l=<6b5z6!5G$IX{@F&^X;eG&aQ?@I2MasZj|bHm7{8rW?=QYAW`}wocA!SN zD7FT6UUAM0e@9KZ3d`d-CN6G?2`~(VWJo;stQL1D}sVchI!8;e6 z?YV*B6yv4g>>B4^nWr-}S-O->qN{ir?_62QOxwDYq5r2Wl`7A7sQ8DYTebl%0BN-k zZ4DrC^_i1pU>(||C|fl)FRSGee6vDP05PeVWsA{L2 zw4Mf>q$xY&Wc6%>({|3u>v@b4Xc^JWZA7yye_ui90rXh(0?oCMmOqd~4TpKdbv@tk zEzcF25*F7!SZ$EnN~8A9+s)-rdCT1i(^oB@al<}H#9N+vpWS3`z^+;TCgsMqVYk2m zTifZe0~{~O)a8WbFgW3{*~?9Nfr+Rwz=uA7Pk{u6bWD++SO+q6g{e2jBq5}yXo97w zvIHx$h^l~-W1Iq9td2)jQOt($tjbuKXPA;U!Q%AT1FlMF6pd z8A2@A@(IyWVd=zWiC}hzkbmstkHGdYONeP3LJ%TSFqU~N_m60Ov36J-P3$R+e3hJ*u8ZDsW#V;D4Eq}heUsxCvR=;`v`?a400NF0TI|lKvuzCo) zkd})Hm;)U1CyOB>k)M}H@)2c}Uy$fgP+DG+>KYCsB+L=wcr>sjE)eo@VAx|znh@%l zz;FikgxP7;#dS4L$cax0tdeg!3O+23**BSOL)tKZ8caeK!kb*i%Zn2w?<#%)1<@b> zMhP{U86l|(=#6!}zqrw_57dpg{ibdV)#^|!^_%_XUUR6vK2!_+mHx`!%22)XFnwW! zO3C-|sD#eHynpVsQGPB9BlN#@Hu4(#KB4)=Nia>VDB0`;@NR%jF5gO+g3^Ini`kJ6 zi_3xxlkh=xM9gf;4217F@hg7ftRmy^U!>Wb-Jq6esX9e+h5s_t=NSv4SpEjZ!u5Rs diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/sent_web_app_message.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/sent_web_app_message.cpython-311.pyc deleted file mode 100644 index dcb85af49588db14953926cb7f02dedf7fcb6fcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1521 zcmbtU&5ImG6tC)!`P!KYtBHyzwC3Uvo%Y~qS(Yrj%SP0Ru*oiVMk>`^HIvTvmsLH+ z2|45tF@lO0iJ;&`B9glY{{{~uc#t|Rc*?D1J;~#1O*~im`{WwvEV$P0x%i&x&o&hCP#6Q7x`} zb&L$OjhKB4u^O-6H4(Z8vl6et>N}{{xUZKztd?k!q&dyQG?6`1buPU3?iSfNx3%%s zn}cm-t|wE~IG<^lM)z@brh9=$d@N{u-oMI&Jg7WZ8j{e056^-A1j6RX!wh-GMF`(B znc-Q?^N5UD$pE}gJ3`ZR}>#SbM^GvR|ZjcJz&*zEs zQ!#e^G?(r*?$a!jYnO?WCXUaq&}ihOBXBX1T=ZMzJ9pBF2>6QgAHHZ7p4K5$KIcJ| z4hBb^1*w;0F5XwmRpey;5D8fii#AZCPLsznCnTFPn&e?X_ODSfmO{6RstKM?M53%g zn(#o^N{ha0cu5y!4UDhw9q5mIfy2&SnD<~-a`gcMg~2y)h;JC*<1fmtgU&GrWn4d^ zo}p|x$+%DrLc%1>3F%qtsbj$r$)gb=<@2Hg-c^&3Afi$dB6Xuc`EDNVZmtaXQn5eW zNLiSShx-#j^HdNh$B-u<4&M&_p$v2WT1JC?sJk4}FxB1X=F^NzS2Ik2Vghwr@Ym0# z;%Run_2(ZWufGWP8Nj6r>hGJVIEgwhe!lhT_GjC_wO^REclB`3YQ1@JzN|LeyN7TD z^=egCz$z+JD@!1{dU-9F_PDJS6NU0hc_zo1L_3$bT%Wf1%t2TP&)tPl_W}T_V zuhyBuK=!(MP(N9quDyqgE_(fqqTXtPiT<~4mM$yD$Fz8M5%B=X0*Xcx=w6^m=zo=} zL2;oQDhhP}ikjZGd4kNg-^VPcGbM=#GF9S6vr eJ$W1;XZGkQYR_R!$-nEbyMLC*Ur)fxF#iF5+L!PE diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/shared_user.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/shared_user.cpython-311.pyc deleted file mode 100644 index 999ce7070e9c2a5e3ce85c83b37e39964e4468e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1972 zcmbVN&2Jk;6rc6Z+G{(`XIltKlWmd~xl!!{;u2K|2qFDQ)6%3uY#pX+?`PkvsXNh9=|G`d5J73H7|%41|BTdAU&Vk(N%6V*gbHPsq6aZNL|TGC9y zx@zNUs-~N|f~d-pU~AQMEn{XBlt7EfPCi6-it5i)gr36_4>N1)D=43SACZDtvI{168~5%duRI+?9btJ6q$;R%)}iyrK#Epif#2W_|nM6re zvQs@f71?^v*6lRJXJVVC*`SR(pX^g?4?RNbiaq$S-^@HhpDJc{1$Dpk!$D?c(_+-V z!ztVSJ!8OF-E_F&MF%n}o+~WJ<%Z*~d#n~=WLRadAq>lCz#ciB>`E)G04)(VenqF`JYdLU=A=^g)AiL1bQDxZd%; z8#!;sK3OKeXT%!{nW)|sufZyG&e#;9&gY87ipOX{bQ)9e*hUdb;YF+NOvg3K{L#)p zbzBjoq)i-q`7qb*?_Dm~T98?H7?k5$H5#Ph03B7A@pAESv==Ywaktm{wY5O2OCIDg z8-%8^At{EXI0YgYCr6+YQs1#HS2z{2wQaEt&LmfYB%`9i+yF0oF0Dwq$st{EZBP~= z<=}l#zEd6p(M8t}E6?D04o^Jp_dIr@sWcN!wTYXWtvuD5$?uhKqN@d0L0!&ktRJ?V zRPK)`p9nPGs8bf`ggCAv2+8Zg@Jpo=POIyL{A&(&8j=TTLLwp%!ga7E*N{)< za_^2DL0sq-eGVM_28h2}C>%$*vtKWKvG~>EFMZ=7O6B_fS10|k^Zsko{^&XX%vhL( zwa5|np^=#|*E3~s?2y_4Bt-fC`0P2*V-N?V7BxQ7qV7kUqyQU{LV^;to1Kx`DEwz?DTM83MyO#2enbx&7o{8rk zp7HT*e{#BYwT-9axre8H{DD6))wBjGW+;4ImGYhddmh0k$!gycCoMnyn3VTL)Y7^uQRHwuw;* zts&32hdh&-4>g1y!IKZW?3FiByYg6?ZJeHS!Y~q!@S~8oOR2T>@tsw&a(i{n z4P2k$#tb)SczK3ba!w6a^BVWj4)&~jb=$m;KF2m(r}%C+)8^)`AIE;!zvX$1a(*Cc zEf`z7K5s?p;4MaD@X%23mebo+|BG&J0 zM}l{p*uP$6m?lu$Q;iFj*4=0r3N|8c%;n;wq*TR!qsPn9^D?DL7M1ilthD%}I6v zpk0v#2%P~XB&`uLh`eDSd7Y3?hE6c`lnL=77nYlZ%={-nd32dcYLZ&hD!4QVpqiLn zhE*<`<{frLM#%rQsS2w8AE?T0YVRqqh2kn* z5D;YB8NwR|vN8EzmzvN$&~CXl>J`+t9Zp%f*u~~0Q%R&UPb)Wb-QQ-5U`omO5Fpbq n#tC};=R&H#sbl>E24SQc diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/shipping_option.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/shipping_option.cpython-311.pyc deleted file mode 100644 index f0aceb4c7d62b31a4a1442959d3effb70c6d7a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1571 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 yoX^IOIh9RC4DHdRId diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/star_transaction.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/star_transaction.cpython-311.pyc deleted file mode 100644 index 62e25befcf6b1024925fc38d9d0e5ca538ffcf85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2305 zcmbVN&5ImG6tC*9>G|G|Y_c1(IGYGEsJoz`5`tvS$3#|VgS$cOOelK0Yd4+kkFmNZ zx^a;S1dN~}g5+S15|P~fD?H4>LsO>(Pw^lf)`R5atL~Y}Om>4{b@iLytKaK4Rqws3 z`ng;#AZWk-_}gZ+gwP*C88kHmc>j9<_mGWj>>>{v7z-@9k|!Iorx=Q-8mgxm8jQ=f z;^sWv&{M3sd9Pp;FrqS>1x|B|Udbq>T+S_f6{C`3-K}~P#zczq?xZ(mOkpIU2C@rx zkX@wu0~w)*@Mg`Jwo7ZMUVbFhI_5>w_k+lcoWKw33NNpJeE9-7cj>~pmG_zrE-(8# zTwiSq+H|>k#Ru>RXP;KqsY|z*>8)1C5eK4lk~ zx#dw`SROmbu141>18V*tHTa`tI|PHH2Mw--lv&vVGpS@hc>fCkUqS{bGO&#d=?Y}R zkZp-7wtNP-JhBzQY9DKWbA7BEs+|YDFx0hFFJ?N;v5Kw3Q@StNQ+LrOwkPjY4E-+p z3>*11H2AGg^Xgh;vXNQeY8PtI&ePCh&IS!@W^J&p1W~wTww+TUco=bze$M4EVq9`;E<1k2HPZ_^e#ArpbH#?N zHJ^MwNb}V+%U4I{+s~hf@~gFju+yfD>x4MI6A@C^`P9hNNl4vILZ0h`&4EjvC&Y5iFeD_@K^KJst^4G|^QT)M z1#G)@F0dVctF_%>W)v_2bz&DQ(QMk{n8`dZtxw#_XXwoE4w+jS}0Y142?lnEKB zlg0K9dlCNN*6cIEUK~vS4Pe6$K>X81$=j$r|ILN38ecblFP%tGu3U+yXX0b?@ywi% za|=lk#!@0Fq3M^B@=z7V86nURSYN^}kHf}c(38|hOE7k5wcjfj< ztSraMRJYk}-fqUqTge2N^%lS z&cFvCUOAPA=>I>F7p_u&L%~iB7T>HN5h35~z#fEF*q)XX@{&V z%w`XB(}78`3eZ_z=LJd^DRTWpKacr8A)rMn(kdLN1=wnj5kjrfC{&~=l7p&lO-GZRv01Vo?#!6h z2vr=Y3Q}A3QgPtWOGT-;_t3wg2P5?m?I}`E+>Fu#%BgR5V{k0E@OI|Sd-LABdGGgT zf3Mf82?U5|VPv2+#GE^bRe0qg-18V_NkNslZPf6dYPEs$Ihv-KqAJQ#*)a3^ z=I57J$;!pml}jIQtmWp1=`gp}BdMO^(tm!F$Gj(K^6A!f9x8~i&{kAz3Ytn9>M&t> zQOOVP#d{Y({~oI1D8LK_#ucb8Fqy$EW}XL|hqx`O%)5)an7MaqfpZsqgM&&NP1Z&= zU!1v0-W*napp`6DG)kpU{TOofv#vi$)7M9Q^)fx#tQKe5*+7JR*}tY#UoN*=VJ3J} z9TeBhM6b1#DcPd^=#+#I(-DgE`^PjaU(955HLp#3=1XM8K@!p*GMcI=B->w8(UU^= zJ$D3G1Ci#|MwaqWgRM!g+B^qh0pTzBJ~UTN>|lBb^D)eluD`G_gW+2^!ncgy@K41P zg0`C*q7IIKpoWp#a?s}@cL|BoNDc~j(bA1|a(;k-{8fE(VwA8TAWlKX# zrV(rQhvFzizjOOx8eauZ^XSKLK$a@i?=6vZ8YXI2HgR?Ou#_spE-A+anR|qQ2jQA zqqnUsD!FjAxH#KX;c2&`+#^~lF3=F{yXQ-QFNjm1YHZ}Mz{V!Vcn2+w4v$@QX7u{8 oi~P~yv1=}l5ytQDSnrJvkFj$MYusMVfByDaVfpVh_M(9Q0ZbE)j{pDw diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/sticker.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/sticker.cpython-311.pyc deleted file mode 100644 index e37cf0039e3dbb63c3a77dfa9f5072cec02db752..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4754 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/successful_payment.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/successful_payment.cpython-311.pyc deleted file mode 100644 index b7a01a6fcf411ae11218aed1d0596b96ca93b570..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2016 zcmbVN&u`pB6rQoiyX#GM^SdN15iTKxO-ojQdWj+g3Q=evNu>lK%$AX3PZBp?dl`EJ zDSHS~C5i;Sl_Jq2Dnh;Yui&teI9NVK;?$c_IG~((GtO=j0uo~U=J|W`JkR^S_s08E zsZ>NTp8oL5Mj6m=!srYw1NiV001uIa9PFVwHZc}h@szr1s&!(Lx@KyyraHvS)$?W^ zBc}2k*qT?U>!yy8f)WX3;6EqKf`Zm=&D#SiT=bR^$eLSW%PG z+DA9%>D;^XbMM_)UP#op{oSOn(hzRTdxo<;Wg!)^9UAf++e5cNo9nZv=Ms znoN`Ih7Z33@D=35kck~+Djz^@rs^n+IO;6;bmS1g+A$XExl=fQ3Kx#CZfZ^up6lt_ zIj0xwQf9L}FFQJ1r>xag=6}q!HiZ~3UyDfh?l(p$-3 zxaBq)uD?kG*#@xxXsG*0x9+!+Vjy~e3T7$_ABL*(3!st-dX8U88@rC>N3Kn`KZ73? za?$%qj@qdUfXVRD+)M; zCaE!hr}nBcS}hnL*Bc&-%FopdI_ zAFhJ>a}T8kDvf_T|MkK*3%~Y0pCY|fj>j&?> z_*R`!niMIm2Ts!yxR=sTo0fO%$y4eCHZ1p1dg{9eRqK|Ti*J@BD=8gU$Y!1g<;MI4 zaD}3|-r|OMN_3@E0)#0j;O^u~6`~bVBvdcb2KScsmcCp{6{PJbF&Sw~*(W1nINX9e(9TjG?LcYnbf+?5}AAm|#jB$)!Y@d|_RBive93Z28 iRu0tu6k&V?_-&t+H1`IERL`sL%fE}&KmNfbfA(K~)f8v| diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/switch_inline_query_chosen_chat.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/switch_inline_query_chosen_chat.cpython-311.pyc deleted file mode 100644 index acd895514bacdce220edce8fb6414f491452b239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2062 zcma)7&2Q936d&8;{mSkp5GWv0aMLZYN!V?nYO4sUwo97QkEB(C+OAfN9D9;A@!H$* zY#}H@IUtovw8|kBk;owjL_ys9SM;!{da!&#YA@VerH6`B-`KlLAO&^Se*510&Aj>f zy*KvHxm*Up_~rJm^S>n#`a>Aqp>~w*4?wwvOk_$nYDiV7Ay?&wQdJ~m%BEuDhFVo6 zB%?`W;_Jv%sd`sI=mFgEs3y$B3@Roc3A3mKx!JEjpCFZwCMuttpPCGm_noC6HQnTv z>*)3)NlcQ0{4BNU0@EAQbC;;WjW|>+`#Z*V0VaP3+$gF_CaTI8fMZoLiG{??Dmb$;xhH5G>cLz69aNWU2 z%X&c`%ZSr<{=PRTWs&g(6kcb9!5*p)I7rx~}!3_7mW zId6L7<+9;2TH>A7D7kE*Jm+$+tT(M!V@5I6C`7!e*fR<>6{wLr7|?Coy-WmIB2X{r zk3A5o^|krN^hA~;E2ka0qqOQ!B{%OH!F zb++II2}XH~IfiI|F~sRh!!1H@e+c3y=@y(Z-o?Rl7w!je$Kz5DG38}xSzcC_@v>@4 z8|rf6j`X7hrxn2|RHm3XKKD^k4pgtzq%24gVmTHkq?ii!?qEhdYR?n$+(%>s5GY6! zV%WOp5#pu57L5dB<*|Nly!NHb7HbvPw48<7VvFhAWdxF3qt3UrPp!F{XK{M6sT+&> z0`+RT<%$De=1WcLmE&>(GtsalsvIO;v}~07QgeyzhyAV=UXbQe_sND}ruP|$e^yX9 zgmN$cF!BB5&B@=hLm^7$^8QPQ{a4=bwX#2a+Aq8v_JJ<~!Ymprgt?w6CdYu#wjm%Y z?hy%e^adp)$PfZe-?D|CCBRy@J4lic(>1!;6x9tBkF%hk5NIfu>*DnXNsM|az;mu^ zKhsf6yigeyLOgho>m=TwwhgtD*a7f*q6^+*2gNMWK9NWW-~u4<^iO`FjMY?#gvg>H zZDr!dJFAtOXWRHFTwC~PC?oY_**`wo#`{+5>wL{=W6(#p@TiX`{9_|4)2m;tn`;-_ zcm%F3JmTYX{)w?R-oJWf6R%xsW6;O8@R*M${gF}|A6P%QS=czz#-NwBaLLEx50m>s zbV$vIc~m&zmrwhpQ~v93`lsFs`}e0I)jg3w`-avlYiGlxaHY`EJ8=(hTnlr;%A?_tdxbkk;&=mS__c74@b5+Wz2TtHp6u~Iw6x$F5$*{l zz9mtfr;5oS0o@DjzN1)Ct?`@=uN(NpcFHm+v}mCy)#KEexNY8L1u#VoJqtvrNRs5E fa{Kw$L!`BzzQV+)1RQsZ&C*}O`}co95tV-dEN~m| diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/text_quote.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/text_quote.cpython-311.pyc deleted file mode 100644 index 42524f717f1b6597b50046195107cff73517e739..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1810 zcmbVN&2Jk;6rb5IdmY=&M@yBKz(ON|5w)dA2q{zultyVFNsAIdY+a4k-m$aIewdkY zsVg5`sS-s3#0B-x9#IkMg%el)fgW6mgSDqfoO)Xn4k#zy?8c@Mm5`X7d43-=v-5tx zH|rlur2>NX%l*f#wH!jfOJm&hOu+{YQ0^fYx!6YmwlS8v;wyn_tAS=~fo|)8VH@CA zUCqx0c{`60Rha>{?wdiuE?}gfHRKw1kej3VhblskU}Vjna`W4$Vm_5-1;+NT_^2BRdh6$c z1#M^7<5rZO-D*amaJ-OPUf7CQkiua(ji@Uuu}iJb5{g0gNEaI)k6Bl?WoI|blKV!qQjSKwPwUeCw85Xc< zDJIAK300I>=iLrvah?z_^aLT5Ts-^CnF*(Ui;(9nXQyDd*d(OsJDd~3;XWc+6qYqO z+_<=0|1@HI^_9r=!ghVH%N!9g0_4PMfdrB2sP2`P+pTX zk(9h@r^n91&bMYKm{!M!eHr}x0}y`=P;v&97QR{iYVGT_--<6L$S9RZr{+iVugHGp zTw;PF^(F;0x0p;#OgS?PNbLZ2LzQBda0&Dbv=dTGk(-g4WSPxLAwftfWiLqWG>A$; z!WlXNB_u8o5=3s-mwJ&vN{)XN$r0j4O>mzevLfOPDP{ zh)eq4V=u{B#j$|mLHt(`0Lnj4qG)PEV1e5HhX>C=C6312-t_#e?;~q?yzi^i3BtHK b(#{W$_r!P&0|5UP-S0 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner.cpython-311.pyc deleted file mode 100644 index 7dc88aee9c0a97ec145582b78881f8bcedef6cb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1060 zcmbVLy>AmS6t^!4gwS^A#!^{giqzii5kf*mFo0U5rb3ENa(uRPIeIx?Z68uL2L6X4 zv4aphe+2_0%F4tR6sAr*-v^{>7W(e)-ShMF?>)bdkK5Zl1oY+o*U7nu&=0q0s8b6o zAA}1ekiaRL;St8jLr;;g$N!U6#R9<_uAAg#sjP_xW1ZWEQgVA^I|XfBDG5Jv1jgngnkNvt7S@+41WX2}FJs<5$2vUuIp_~fwA8cfppKAa(( zWh4T~%)$0b|KxxSc*=|!j9H@G9eq2`rSaEX(!7eA7Dj6S`fW}@J^p{RiDvN(g4=-j zq~5v#s;x^!nJ^oWn@T%5=H9dElSS|mexDBDHV!S`U$OE2VR~&9)vHI zJ_`?(fK~|43eBw26#RuUdmTPcqR=E(9^{Olu~?e0E_qOvJXi~-DY>7|wHu+5wLvg@ zz~20QmfoFCcZsereYZJq1l`|`7_^5QtqRDEYGttn(q;ESb-9On2bOM_%rjui7RLBH ZBHymQ%UeAR?yj?Ud%v9a_lB*~*&lf=Lh=9r diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner_fragment.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner_fragment.cpython-311.pyc deleted file mode 100644 index bc0135d62eecbf5b9f6649de7a038d78807302f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2235 zcmbtV%WoS+7@ygP-|M`Z@@iB!tpr9T0aYLoh0-c7DiSwpTvcqG4x61x>SiBicHNLF zha4&>2)Lmh=z#-jReI;I=)p)iSbK`pQ*N%p0p-LuyWYehj)cT`_Ve$X@7vv(@AsS8 zr<#^Q(Ej-4#metVgkB0KZfXSZ-uD0=A&Mxrkd1YW1(qzymUY=ybj4P6)lTRMJEq*=aouSfvRoV`ud&Moi}Y;3ut|t?61AOIdllNAC%7+Um9Y^gfIvG=pg70is!! zeIg_D9ImM8{WQ0LirTJli#W&{j^p}@%)Ek8SU;#p!9Of)I9!Nt8_9&XEx2`V zva!M)->-RNqobzF*@(|9w#p5A#O14_%dYQ@8nx>Ajz`rZj#k=J2%oh7PMhV$<8u{c zj!fUUIx{y_DlY|!4}NLij@7Ujiea%k9c{iY7P^NI*g7d8(!Hy$F(A)wm}WYubO0S-QcSp7hDGk&ip!e0;S|S%oJJ`O-MQcR~8|>cLl)D z_z?{HaU4dT!1WxisNFq?P-zoyN)$hqHs#;&PvI7attOZFX-IvBic+9@^%~3KQog2Q( z2@qak&b`WPb-Cif#(l45m}|x=^D0Kw6|xu=^m(HldLV5CR9xHuic1qWKY)F!hmpa=7_5b^}YS9n2W^~EL+zt^p_HTkr&4YzBg^WrZ7?}5aK zxwixg7g+$bpBj%ubeX>ouAtd_38p1ujGJhr5a&HUC qxQv_1T;phOD%TrFdsA6x9PO>d+gM1UyKS7i^ePPfbwWZ|gns}6ii^_# diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner_other.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner_other.cpython-311.pyc deleted file mode 100644 index cf3777c97208cd61f8d4ddcb1bcb0dd24524591d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1610 zcmbVM&2Jk;6rb5$f2?DtkQQ1bKr5gJSHed0M4DEhBuXnPH;_=o*41dTGjX=woi#IS zLaH8es6>$<2PD)395|pN)H{C#2P5SW?I}`Exh)EZDkt9T+NmSAmp;$Dc{6W5-tYIG z_m5hwfXidMt>a{h3K7LL_9LO{W>Q=I zYI%{&UtOI4^jd2vF+UMoN$I*Db4h~(BR}%`s-!|uPoG()G8SB}ZuR&9&fPPUZcjfp z5`e4)AGSe%2Ov3eF+;BL1%P!;ZrvG@fRI~c1}`yl4tCmzm*vd3ms!7JR(XKdF|+Sa zyY>V0Ep{s_Xf)QRlCzVs+=w^0yt`9zKo+?2q`$_ML!I~;C}-1;HykRQzUYc*Q#dN> zOOHE|bR_rup3g_WXCp9_Zz) zMLLx1nxpeWj&Dr{thsI6SiQRV`R&AtVN%C(8VE`1WO8$cj*#9KqayY_(%q!8qoigu zDM}vqrAVw+B)F%urA3e0J*87}1&p8ZL#Us4ut3<<7B(84TaUKE7xCj(4&O zg~~EpS#*D*x{(xAzsF@#Cd3zhOi0~IX2yaeiU;e2Wc%eQxIM86@dBz8Axf7Cq-gu- z*1~N2%Sd+H^AYn!r`_#K8b^`;Xg-iMD zSRcX(R4?ZEYG7v|vt-Cu^z>EjpVIsY8gfFC3L#;{`hm8qgnZqn!O&A8ghd{ZRfaQ3 zA*+Y%;^Y(|WB*~;p_$8oCAA@)9uERwAIl7g&fmxKoZeL(DH{y+6DUCV?3Wr=p`0SE zs_5c1y!&BmdtqR;^7fC_+Os~|FP%xzbm4M3jV^tLcV};=rHXwyMK7mpeN%Sbv663$ zf@}d-z|eXh$`}}u`lFTT0DmV^Q0QQ{lUL_`M>A* HvUvXozc0EY diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner_telegram_ads.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner_telegram_ads.cpython-311.pyc deleted file mode 100644 index 92e0ee540a7bccb2a2321a541e65fb5edab2c656..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1658 zcmbVM&1)n@6tC*;`RMuB&1U^r#f3(9m05J=upk(-%Z4P3Vhmw3BKEcvm9CmeZ~9}b z>M>^7Lk^M{4Erd+Hpa@%w-bFX+)7GIUd#pc_q8nKxsITrq^^otp&|~s=xp`*KF-|Jr`@hP zEEj;R1Rpq{KL?N;*_a_)`vAb&Iydf)NkGUhGL4s*J_|cd#LHrO(#wqRF{?a8UChh} z=WO#K`V8BZRg}LQ)#UQ&yL7nEdx8dYOy2vpVu37h=?ZU+ON&~YUcAl(-K4%1AEUJ5 z$copwmB(5TZ1sH_cOwxrD`}S1XdqlZW39(=U(U2zZX|d!9v{|>M6b0L#j-{F-YXNC z`x$@vKFVa8?C|w5=XcHk09-dai%W~`+jH-exrNn_6C;MT1{UXlr=&&Bh&cvLNPmmb zF!o%su}MWw3PpEP6g(b?Ffo>+kh`jsO4M7qtEyf%!T1J0hUSWMKdd}~=P5jy+&%Iz zjp6&)!}qnH@T0VSq3!hL^p3xvhL#lMpwC58Cd3Q9n2?5%Oix^nNbYwDN%xEMkUcR8 zaeXQ!AyV}aRBrolZDGdwFcKTie8jx4=WGlFjUz#TYlnxQI!oS~BcXlY=u>xt_PBJY z7pd~M6lJnCQ3^7y1<8v+pc>8omUtEpyZ7pUlG@BcJP&(i6V%_^XmknHFMqZ8Mf=P4 zPVJ>(Z5GB4SJeC3+u7_$A3y|Z6f>}Ouv5foWyF-4UQqt3A}gc;CnTv55=3m^E4xO> zCj;t_Jtaa|XJ`y(KQGUA0`9 zV92jQ0np>$NHYrM5mKs#W>)adTh8{v&~UQxyW#8_xAscUjL=l!#%LN{cx`9u`lwnn zZ;a6YQ>IFkW;;^ih5U}oz!>n<9YALTPeOeJlOhxzIwb?GdRr9La)F0~KxUj>Jfkaw z`etYFFDffNL{V~Bp3MqzQ(T3q;z~XOHPSK0yXfWN$+3r;!+#%p=-Tk)*hSZeC&#Gx VA_mN-)$q!jf2!rb&hVx8{RehB%lQBR diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner_user.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/transaction_partner_user.cpython-311.pyc deleted file mode 100644 index dd6a7cce7893ac4e1fa08395d435944e68c4aa34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2280 zcmbVN&2Jk;6rc5u*WZrwRr*N{O(ho5n9?2~st~A&(uR;mBmuE;I@)?C={EaeX4fgH zaxhXQid49vO3))Js(R383I~)E@9oBkO>%+p+vhj$y&cc~e!p4& zTq@-Wj9-5IZS~g-A%EbcJJLxY?fd}2BVrIkvWP8dl7w-}O4+g|+f<`=T1(rCrq~%R zV`sH2)MbNOIXkcAAx;~LRj`X%Q6gLx$6=naN_JT*$F;0AU{|zC9OtY-dq^9Kgq?==cYsXLuWIjv!>^VnOW24Lbt-~jV5+OlwNWmc$rF8I<_cu$I}~FoY#f#aIv`A zYeKijU9ncX<@#PtZ<^_(nEGTTq&~!A5HJcU-aEHj>N3CV`C=s;Fr5w8Y;e}pH!W8; zcBl92sF>wg9n1fw^R4PZ1}X2E$KJ;cyLHGsf$JGu z$+)v$F;ZL7R%%P$qK5RCZl!;czKc&coGN)vrO9@W!CeP?eoE9-nD$zLXP9NobWEQy zH4_f??3sDoT4n60+r=qZEzB|2uyoI3%!9WMLFH7d?OknhqW+mH*6UYY!*tf_>n)-C zu3(^qI(Ihev*xY32S@ipQ*W&6Yuu~rri*&1A-`U&M<_sKd~8`Px#p&L4Swg|*`whe z?>@&lX!2&j{oN+ftE6=1+o^A+A5On0o{or8DhHz{(5kiI)cGg}i8veO$?#ZI*q>r& zQov{jRwHUL!D0kr5#xzkOhA1FBUFPpfe!JB*%qfUIs;BEA<~X+bH>6vW43FwER2hc zebLgby-J2L!)*ZUAOz4kDnI_!aDcI%HzPFc3s9hTVratB9wiNKSwN^HVk}T8ABZvR z8t%FQ2)y6H0Z0d*C`HrRh@dNycdkhmB; z&*gB%c-eg?&UYVhPCbS&ueRW@0n9>%La2bmK$8h#cp8O*4&^KG^obm}FwLEo?IjEh zA0bCk!mi4}JApOv#UaX=9_mdee;5M6?(5&ce+^NAbdQi?Zq8yZehB1iH+v<~$@}6m zOp!=00vE}WBn9O4PQPuFsm_0~ZSrQP-vV-}({I~y1q30T3h3LNehcX3PQM-1bFxGG XEK*bnSUc=GXKH_9`mZBuF(Ur}T=jGf diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/update.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/update.cpython-311.pyc deleted file mode 100644 index 21e7fed8ec3899d37d6c998a2d0178cb30838b87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7746 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

    O+KmQ; zIc~GiazO1k!QhhaXmuUdzs43cz1b|JIiv!@w<6hwWCxO+NOmC^L$Vu*iewLvV2g&{ z(zNEXp*LK!s$IFJ^F@ba5((m*xh>uZ=&TLf5r?+k;aI%rFN_>w`p5x$J>c^vYl$D+nM%2J8MXvXWO|iq~D7?1(77r7P1^S;=@Qb zBl*q-J|Klypupua9warmT+`LG!eB78!DP*0R!!6X@4fh5IAV~}v?>IZqiN0{$oL92 ze4S@MIaQwfh0U+by=@z2V{z_Ei|ekR9AAB zo6IR;lop%Id_OF{l11+o*X%kBT@C~CpAP9xlI*VEo&IFz_ROP!on4a8=KSH!{^%}$ z$ArIq+~2mxA3KPA;iRvY{K*-A|6ADhOm}y{STUiylMKJo-4%(rNT@*WDQrZds6YX$ z0Q{tnqtL#jU*$s18#wCc zhi_l^l4Bev^w~tAL)cUV=5Ak<3mc*ne-*nA_3I(lF!6~94k)^-Ac@!lTT-A3Yx#*+bcR88~uaaDjG|$`dK$$!Wht_kzlrDFXz0M2MN4koTG`ZRBzBoN;pGPY`cvcH zsV~l~=BFOzr@Z7;=+n4et2xZwP^X}>eHbW~SvTDv-b>GzgR7ClKuEw(B;X6O|Wp z+l3{lT-BDV)}WBrnY&~gYFQ+~@_a9O6~k_)xX4@$-vm@p0o1gnKx)O8!MFKnhij%~ zsd~$`>i{LIP(PPdKzY{MW>9;%xzKW%Qw}i%o@xrt0Oh+pFSav{`E?bzNp%sL^bYIV zDx6EzRm*f-)vl?%!>LWP3Kft!!ZKZem7@A{Q56xzJa44P(8ZUT2Rrsd)A=4O>VY0{ zjo%*lz-e)p-Z8@~TsN=W)S+I09T-Vv^#TJh0nbsl)JChmfOxA0<}4o88_e8Zr~J-rP@jF#227^;rgVST^wjO*I~xVeh^ zyr)|&xZeflUSq7GPESq0_L|s5uU1*p#UZD{bHIwW3fkiOw&8Khs@ZT{y-{Uo*!L2D z9N!Kf00Mu+B!q)agCEDv6G&b~jS}Rai*}ChROI_W2DBDXtnvjVOq%PnPvR&X>LBdG zQ0S%6A$%?U4`pQ(LrFZNenkW4e*gq(f03l#^pZz6w#WH#FF)QT%3#_b*?MQjAKvB< zjdl|ti_UJ6$0 z(Y7EbfT-XE8Wo&?q}x#|aH-$~I2D{gsDcwPRd6Z}7TlhQ!-OgzDj!Gg6(CSt1uxFf z%i&m-xY#yQ0jiiSBty@=h3XSX1ShbB9ckRQ+hpzBso zlh8E7u0nTS(>DCQ3y@M=#&-ea9FwlVc0m&S3$WE)4offATV6);BP26Gf@}|KRvCaG z4PeFr=oP5qgn&mpk3*4&=*mG912kO!*Nssn*(FE@h%(Tb>CD`i>BflCram3)ob8;w zan`3(J{|6y>zuoB&Zn>VyT?24cyv5$t90C_C4X#h=Zr`9hHaJZ^=Z)`-`Dw>NB4zo zmG1MYj{?QEN)P+=lK<*~&N+`B2-_+>fM+@x^A8>I z=x&b!#kNY1VE^@)Up(Z|9UcXWZIvGK>Gc;oad0!{?>p$x5sw1Jwn`8Bbmehkqzex? z*Bv4ICt-L0V975``EUFXR`JWn{Uc>;rNiCb6Dfee|C`K8B%bTWWMy}ktdXx}=)3uT z*qau5NjU_#v_~R6cEn|63a7q6(y~%S#S0`y_Dq0xx`{DmTbF!0BA&Dekl8{WBfQqa zdIym!V|>M-puyiLVNi;v5yx(&<(ifgg2A-livl7cx`jW$bx2TvMM#k775y*`ide)% z8E%U3{aNx@_@s{WOCTb|aQ*_MD@&5(lf7PldrV5+H@C-Rr`O+nvd`;pK2g2?_E;VS f4@e~lS+Bo!23+ ztJNUTe*NyZ!7nx;f1)vOZl%zJ8=%}LoN$_wjE0n=ZlzXchj!+KPUeO#tl8X2y{s12 zC=s^uz;@Gm=7&Bd7TF-&yGwXY)E>Y+4`Ea-Z1DOPY5R}RY|~;X%5!NVlgM1R?V`2) z{yXbz?Tz)dx8B^`DC{fwq;Re#+B~Aw{^f0vilK_KxBE9mY`}xRwiB6GrPL;_uBhbE zjr8CW*q=c@f`pWl(7FbBg*LZ@!|jWJ`9!#?!Toz=KzaRcGxY9}PiR=%BJ;W3D3-5j zp^h)ox4viu(6)CH9mq0}K#7qOTI5CtQIJB!fgA*V3=0-G7d$W$kQjmu`V-K`;IY#v z{cOpxip6TMW6VgecDu1uqGOH{?MOB3_NCF?Xp~&QQ|P1eT%JB$L4vLyNB2SDRcH~g z#jqJ0O?Z@>BxbuGM{1}Q*1YhPFk_V$&Zf*oj6`F@8Q~>ROA^1O_o1+6jsx@n#zPoY zyLpUoi__aQp|`Cc>DT4+fs)&sss$T=CT**5^>`#yQD-d46T?{BDNdgVj%kq&7%TUy zWjIv$jKyiBHDlTV8@Ru7`0i_~z4xTr?X5|kX~_5o9!j! zU@(Sf2^=W=mkST724$`i#fPapTz2{q)Ul3g<8d*Sj~mKFPoq}4#^ev{7b|KnsS98t zEBbp7Gn-PnN1mT9_I>iw^vQjn1k=U7Z=aeGN?+V_UYIWSnfDY$#{OG=bK|cP`TGfY GnZUoDK!i~M diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/user_profile_photos.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/user_profile_photos.cpython-311.pyc deleted file mode 100644 index 8f895d21f84c4870ac541e370b534960f99883c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1545 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 diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/video.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/video.cpython-311.pyc deleted file mode 100644 index b1a1162c6349b48155d2d02280668a91a1465ef8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2056 zcmbVN&u~f3sqf7?ZV>6A9nU;}@4eYKe(!rb z{;^mr5Ewsy|LfWWpx;s18%7GW*LMIsC7f{0B^}MuG{hM<)6p%xLoM1dECXyhr*5{B zvvL{{y3B%ZxcQE0nHtHEMZ&X>2+xV!bDfYEu+m`_cz%Uc%~z;awRp_-JU_HU$M=G& z9v5%kx^bB;d~$hV=}KcU)<5<( zO63gjC1+8TQ5*pgmzk;$W8F<|d!f@}8xL%`9!TtfI4ecilU__4z9(APL^w=XMOb5m zXs;Upo@h^@al<`7Sf0ar0V^GMM;@N(YyC`L@6*1~&-QcueBb2SGqYd#LHka%w_j^~7oRmbB)`_f{8aMu|7PjTf@I50LD zYq@q1Fcyr1j(s#7gWbhT=bNAVa-+H6bH`h6ZXlb!WY8Q<;oWa8JFCsW3B|dt-P*9% zMbNYzA78*avK7=-@6@`RvI3DGmJ}DYQ3hZOZh`n~K$0`0c;eg3UoU>M_}lpLgp3tS z(cH=CTKA1WXy@ueVI-3>+lS?bEkShBG z+EncoQUoZZSeQnyYN*4AR97j4ttIDBU9Joq=dFj1%hA( zJW$_%K1qfe`GlYtC&tuZd9b{-9MP4CmbcY>Ny|xw7`HPKEe);?u5Mk8Xf2`>gQdaJ z)>1_45uF-b8(iDE7SV<1Y;|yDn^x2Ll2#*nHaaXq1y4XEx~6FnIlcYn t+#&Vtf1f*~vi;`V(I*q4Y41YKx8Iye_CpOaep@_l{DIa#4{)iU{Wr;D2x0&L diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/video_chat_ended.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/video_chat_ended.cpython-311.pyc deleted file mode 100644 index 0530974bd59ba626d93ed368b80931d50f6b34ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1376 zcmbVL&1(}u6rb6zY+_QSeq9t6MKA{w@K{8Y7~)r}XjNQ-!)9litljL!nMt)GSVd4l z#f$Xd#e*o~-M_*^4<2Ms1y9~0^&p;nGuvnjdhuoE?R)cPetGZrX5LmRB?R)}<;S^} ziO?72jK$6kymlIlWkeChG3sLK3PKnoX9)%~j6D$ce9Ns`JyMrk6dMpl`U;qls0@E<~=4EdNM-?#(``zAG*Ma?4+DF0$LQ|&7$pKmu(8YSKK zyed281Q=?wWTAaF>a;~9*`YxY&O;wWJBU(sU+Qvkz(idWNECxaQ&<};@<{-{y?Zlj zwQ-iaASh~}ek`F;303w!Z9Z;2X?-g1St*}@@v5i3ha0)~Td%s*B_j)7Xt zcR)y}<{aZY)vn@LxhilU6cqI5H!>{S9U-O4$evu9UYfo){n@3mHN_JodDihVSI{jQA>v6rb6z+g;x!QAom9kXA$#C*ZE4zzPn?SSBJek?eq24n}i3HkZ^+OLc7`}yLe9QP2e_fXwl!&<|IuQ6h z>Kdgj#|0OqOGuo>ijb~Vo<8z8B6+e&NF6Uuz^2k8Buc21gh&f)NYU*B`u5`BgIsJ6 zmU9+oqrvuAP?ZY;3=ViU8C;2n0|`lewV=^9Bufrxoa<8StDS<&eoZjZ43nc2!;|V# z=oLHS4BU0|r6*C^n?raOLS+xcpSMxvqs|Lot$eZis>rn2) z4%BrTsBO?|ymem0No}6eepgeK(UcQX`h=u88z)+C6Y}YpCNocq5SB-dPwa!BS#X7rd zy}s8vQz6g3RJpcysY3rpczRpC_fUvu<_}rxE@;r3V<=JpE%e_(=|B!4=?yYnroz$7 z){w$?;MS`CB7~=1HKx;As}I#U58R6li%a4Hn3@224@6~RjCawC)8l;)y*&NzzK4S8 k@xEuCsu0G{?^@4IkN3)X3Io=EiU&)->(xL0#Z^E1FYd&krvLx| diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/video_chat_scheduled.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/video_chat_scheduled.cpython-311.pyc deleted file mode 100644 index a0132f4b3a989b3406b18a883ed9e499f8a968f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1460 zcmbVM&u<(x6t-t(XJQoO)Xn4pmP)d$J)>%Z0c0^Lu{wH-6u< z_d&beL?DlTe7yCCi_o9OnMRG1Cvzh=^CAy?mw9O|^CREd zwX~iEQGk(y`iS|r5UX?lKHxuuUP;to!8+nXz46({t7PT! z>dJ>#*7~LULB9J0S1T7cc*;kTW><&Tc&uS>aEWTZkz_osuq%D|DSU7d{I4Majv~xZ zGzgjOGMeioCfi?7Ia1OTzVs#6h0IHDP2@Z_+#4~Y2`_+YiTwfJg(~ZL976Y@ zKZIV%wWA1g7`}lMe8c$}e`oIy)Zbl`0EK=g3b{R45iH3^gY806EhGW120Y&xe3T3aD$)Gi z35~a*Dr!IzVQy1T?@qYtSt^O)k{prQo$Sgb_`vmZ&$HK^pY~N)pt_)*-bAxS)PC*G z>Novw`@gr&Pg|Fv{n9k!d;Q8g(g&~ub^IzTQ!ksEErDzschSTH!%9vwPDt4#BopQW zg54tI^Ma;_kvbtv#4!C5A;+E*aAxSSDU|I)&SIXXKrxo5Af!x@-j}D%D)WC}Rl@|n z0tE^E`Yai1n|Ef<%lGT2W@w>y1ejW}icq-^&KfBAT3^1s5ttFUmK- zHDsvoLCsu@@g90}da~`Kccw3D`zV~AYOdx<9Tmpy&rqMErdlt@qdsh9boPl-pK5ZO2-vI+hNpODY^))qEoYfSp>OSkRQ%?**~ z$_ksP++3oXiycoOg}D~lv*{~{ZCqE@=srQCyW5E81V~6F2|Y@z-DldIOBHkeiR|3@TumMiqZdjq zqmhzHK982A7FKDFY7ykC=xH*IOk&}FA>t)YZ6c8=+J6m!9x_4c0(r>!%XQeGQcCX!q*fgdB58vIXn)%3iRmm}WSDlCT tu#faD+`2z+ULtILO6hlU_u_E9sLVuZ-2Sy@BgGK`9G&B)2;vj diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/video_note.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/video_note.cpython-311.pyc deleted file mode 100644 index cb6bef10221911528049dcb2b7587820b52d9afc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1993 zcmbtV%WvF77@x7d-t{KCdD4`=VhDv=Rdx~L6h##%L}`^rBPD?9E=;}a$;OS>c4xeS zRD0M+l_&@hm#PPPL`A4~{)!$F2?@)mNSt~z3I~)E-`LqD5sw3m$DhB)cxJxe{672p zQmKfb{rK(kje!C}zX+q(a+!h;KL+J7vXPBl)WRmlLYG{rC7W_fF_l)%%z;m~6<2NL z%{)d_W-8b@x6sl|4I>FHAX|Na>^#jsl@WRdch=0JU06eg_ClBjjt4By^Fu3ie2*J) zTw1@iI#1@V&(AI1SXqeWcfFmsa5E5L%YA{fcgpM3rA=nFZr1P8MhLTLtDAo4uQ~T= zBU>huO7_5qUx4x%A>mZfqdHX z>}fHGH~fHJyF>IV*0$xiR^6q#TgABPDbl1|HkF^0s(fCB6#5b=4^KNv!S9ozCk zr$M$pu~?HcQ6RC(XxL_6tgQGRZ3sq+rot^MYXBj9cpa2S_%T#L*o%YbDcsNC&f496 z#Fjd^BX#7C(#dsH8$VGy`S0-8Y1Kic$Sa1*O7IdZ3o$Ijh!Fiv|9}iB&hd6YSzI8* z@tlwlLyJdGWI#A|HwgLniP#yKH`WMgxEAMxa1Ct1OwqbWOYhCpKJ?jEZO*qHuUXp? z*!zss{jf&8?b?!4uW=`&(}C640;2Mo<@lmZtKm*Sc}7km&bboounREv{n0+!mEOju zz|U7f{N6>$B~-fj)%@oRUoQMKcp*WBQaL(18BI<{6BnbGUy065K~GBHPGdMnK{cNZh&R-}w{m%Gcm%aJk{T{gNm_7o%Q`-%}Mm!ruk;hW0(zA_alR}S*y2|AxE zCudOQt>}%b$;gBTp#L|aiHXwL`hw}bOjnEnf$v5e$`9~m;+GPuKrP^62A!x+CMq#j z>K3OAesCx*2IAL1M5Qyq=M1`YLeqs1a2^$Avtzr)u7W9W=8r%mGR8PUukM}h2dKLD o&;0=Dd#C$>Je(kmUk3>HPWMEuV#xTf;+yiX!u#9bgwk#Q0k}R6h5!Hn diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/voice.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/voice.cpython-311.pyc deleted file mode 100644 index 26f4d06376b683b24c098d7bcc02f5d5a03980d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1672 zcmbVM&2QX96rb_O+Pm4^kdKnKO36Zys8yQ1M->94Aygz=qy!M|!pQMVQa4_EJL4@R ztk71fM34$M)B`=DBGfy71wyIB!SX2*r{0Xh0p-M-@n%U?dSN{C{Cn^DJfmh5i=sI3k|2(Rqi3~^Pd->COYbc&y??E> zlIib6yP18xE8SlB6c;h|4HmL(?scwj-eP{@7nuub6fb=A6@af{+YGswB3Jtmw(sgx zV+Pf)fUgWk0Bj7g3Ai-GmTOWQ^zukA(F*8eh0ZKqrxrZbhZ>#SM_ZUq+^f6xKKcT? z<#lxOcBV4(qd4%{9<4NBY}^b)BUW2(aMtBauqY7?uW?6y)BqaTLPdSK9{0G<78^H{ zq$?JiO+V&rAsHTeA?Dl7%{UQFuN%y(SQV7%BH@{}6@-igG^;Dni-OxdrRzbIWH#+_ z#dYhrcEain2>UcEcY+Qh$!?dO@<0f9R3Z`VF-PMQz#N|fkbEt}?7Kgz(Y30KUf$pjVO;KUf~YdJL-=w?-bS^>JV8 z>wTkdQvA^Dmwv?GsZNA$(p!$ns}RC#QjAM6+Ud{8(K1u?x{PNwAwd)*ggACKd1~uK zuyBiz7v|v8kTNS1;)k9Pga{jSSyLE;v?UY%8v_&L`RSiIrZYeP>vyU z3Mu;P(xy0kNg`QtJ}HG{Le-d`k?3U*PDK(MdC)*4s}RzOX%Cu^WK}|L_q=fEu?V5D z59V<~PThK-eN-zhudkvZs}0HaSr|gSFrNjNkp1vBzaYPoKQ1L?EyQmifT4e%Tr*5N zM^aRgIWbrrtlnKsjrG)+IZ*S7F_UY^yrHGW#9(c(c6Ti`meRTT!L8Ovb$_HhKaB{ku(EkO;^p>ZclfoswTR! z;0i(vB*BBhgMvATB3?Y@ugGBnIV^oz@Z@b|J&32g>Yi~|P=vgxdi}oY@!s!M&Es0F zjDY^S_jhmALg=|xrex;=-u(uIyNDr%Lo~o1##%N)V_Usuy2qwT{yYjiOjl6~vLO8)9<}<%NKa}Y?3TeMXx<5yFiOv`XcCZ=`t|7l1IwziFn{r z_aX$l5be%iQYw*i&88m<-cXam8?op&yRnkZE4)jSM4rA#Tot?O5_iGeC};Us=Lc$<&leq?XpxN_VJK91+E@s`Mz?>w=JEgV9I@K3Ts)MPCX%V|-HNK}D6K`?V$4ihfYA|XK(C_?IX`pLd3iR59AkiA2q1}D=JA$~}uBt+^4 z^klZ)v=-+&7h^*ifBK~*dWpxfcmPn~arZbt@+pGv5|PWxPTXb|f=)l?e^ z&*nm4FhoPxNH)YF$b9Y49(avujh}%-eg*9H78=i>+Ogl3ep&u?`QPf%QMLW&m(R|@ zN3VsoiIA(+_AZ=(>z{X{-(7}-$RyoYHVrYOr2|={#wDTyPDolNWDv7qsO2glKMrX) z@e~MQu@B}0gzS4zfEqk#l(mu8CV=@o3;|>;J_VQ5^Ex9A>!{L{6}96IFlcV?H#RK0 zI7XUPkv+4uvbAz!W!q|RTeG8V{bS9J4P>{CoxGj^4L+kUM&Jjh!P{_x^r<`}oVu^Xdcstib;O=z4UD diff --git a/env/Lib/site-packages/aiogram/types/__pycache__/web_app_info.cpython-311.pyc b/env/Lib/site-packages/aiogram/types/__pycache__/web_app_info.cpython-311.pyc deleted file mode 100644 index 378c8bcb29c2def766a5104a1060f8c7babf9dc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1315 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 None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - width=width, - height=height, - duration=duration, - thumbnail=thumbnail, - file_name=file_name, - mime_type=mime_type, - file_size=file_size, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/audio.py b/env/Lib/site-packages/aiogram/types/audio.py deleted file mode 100644 index 8c11412..0000000 --- a/env/Lib/site-packages/aiogram/types/audio.py +++ /dev/null @@ -1,70 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .photo_size import PhotoSize - - -class Audio(TelegramObject): - """ - This object represents an audio file to be treated as music by the Telegram clients. - - Source: https://core.telegram.org/bots/api#audio - """ - - file_id: str - """Identifier for this file, which can be used to download or reuse the file""" - file_unique_id: str - """Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.""" - duration: int - """Duration of the audio in seconds as defined by the sender""" - performer: Optional[str] = None - """*Optional*. Performer of the audio as defined by the sender or by audio tags""" - title: Optional[str] = None - """*Optional*. Title of the audio as defined by the sender or by audio tags""" - file_name: Optional[str] = None - """*Optional*. Original filename as defined by the sender""" - mime_type: Optional[str] = None - """*Optional*. MIME type of the file as defined by the sender""" - file_size: Optional[int] = None - """*Optional*. File size in bytes. It can be bigger than 2^31 and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this value.""" - thumbnail: Optional[PhotoSize] = None - """*Optional*. Thumbnail of the album cover to which the music file belongs""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - file_id: str, - file_unique_id: str, - duration: int, - performer: Optional[str] = None, - title: Optional[str] = None, - file_name: Optional[str] = None, - mime_type: Optional[str] = None, - file_size: Optional[int] = None, - thumbnail: Optional[PhotoSize] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - duration=duration, - performer=performer, - title=title, - file_name=file_name, - mime_type=mime_type, - file_size=file_size, - thumbnail=thumbnail, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/background_fill.py b/env/Lib/site-packages/aiogram/types/background_fill.py deleted file mode 100644 index dbeda46..0000000 --- a/env/Lib/site-packages/aiogram/types/background_fill.py +++ /dev/null @@ -1,13 +0,0 @@ -from .base import TelegramObject - - -class BackgroundFill(TelegramObject): - """ - This object describes the way a background is filled based on the selected colors. Currently, it can be one of - - - :class:`aiogram.types.background_fill_solid.BackgroundFillSolid` - - :class:`aiogram.types.background_fill_gradient.BackgroundFillGradient` - - :class:`aiogram.types.background_fill_freeform_gradient.BackgroundFillFreeformGradient` - - Source: https://core.telegram.org/bots/api#backgroundfill - """ diff --git a/env/Lib/site-packages/aiogram/types/background_fill_freeform_gradient.py b/env/Lib/site-packages/aiogram/types/background_fill_freeform_gradient.py deleted file mode 100644 index 916f6a7..0000000 --- a/env/Lib/site-packages/aiogram/types/background_fill_freeform_gradient.py +++ /dev/null @@ -1,33 +0,0 @@ -from typing import TYPE_CHECKING, Any, List, Literal - -from .background_fill import BackgroundFill - - -class BackgroundFillFreeformGradient(BackgroundFill): - """ - The background is a freeform gradient that rotates after every message in the chat. - - Source: https://core.telegram.org/bots/api#backgroundfillfreeformgradient - """ - - type: Literal["freeform_gradient"] = "freeform_gradient" - """Type of the background fill, always 'freeform_gradient'""" - colors: List[int] - """A list of the 3 or 4 base colors that are used to generate the freeform gradient in the RGB24 format""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal["freeform_gradient"] = "freeform_gradient", - colors: List[int], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, colors=colors, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/background_fill_gradient.py b/env/Lib/site-packages/aiogram/types/background_fill_gradient.py deleted file mode 100644 index abc485c..0000000 --- a/env/Lib/site-packages/aiogram/types/background_fill_gradient.py +++ /dev/null @@ -1,45 +0,0 @@ -from typing import TYPE_CHECKING, Any, Literal - -from .background_fill import BackgroundFill - - -class BackgroundFillGradient(BackgroundFill): - """ - The background is a gradient fill. - - Source: https://core.telegram.org/bots/api#backgroundfillgradient - """ - - type: Literal["gradient"] = "gradient" - """Type of the background fill, always 'gradient'""" - top_color: int - """Top color of the gradient in the RGB24 format""" - bottom_color: int - """Bottom color of the gradient in the RGB24 format""" - rotation_angle: int - """Clockwise rotation angle of the background fill in degrees; 0-359""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal["gradient"] = "gradient", - top_color: int, - bottom_color: int, - rotation_angle: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - top_color=top_color, - bottom_color=bottom_color, - rotation_angle=rotation_angle, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/background_fill_solid.py b/env/Lib/site-packages/aiogram/types/background_fill_solid.py deleted file mode 100644 index f9fe22f..0000000 --- a/env/Lib/site-packages/aiogram/types/background_fill_solid.py +++ /dev/null @@ -1,33 +0,0 @@ -from typing import TYPE_CHECKING, Any, Literal - -from .background_fill import BackgroundFill - - -class BackgroundFillSolid(BackgroundFill): - """ - The background is filled using the selected color. - - Source: https://core.telegram.org/bots/api#backgroundfillsolid - """ - - type: Literal["solid"] = "solid" - """Type of the background fill, always 'solid'""" - color: int - """The color of the background fill in the RGB24 format""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal["solid"] = "solid", - color: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, color=color, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/background_type.py b/env/Lib/site-packages/aiogram/types/background_type.py deleted file mode 100644 index 6abccef..0000000 --- a/env/Lib/site-packages/aiogram/types/background_type.py +++ /dev/null @@ -1,14 +0,0 @@ -from .base import TelegramObject - - -class BackgroundType(TelegramObject): - """ - This object describes the type of a background. Currently, it can be one of - - - :class:`aiogram.types.background_type_fill.BackgroundTypeFill` - - :class:`aiogram.types.background_type_wallpaper.BackgroundTypeWallpaper` - - :class:`aiogram.types.background_type_pattern.BackgroundTypePattern` - - :class:`aiogram.types.background_type_chat_theme.BackgroundTypeChatTheme` - - Source: https://core.telegram.org/bots/api#backgroundtype - """ diff --git a/env/Lib/site-packages/aiogram/types/background_type_chat_theme.py b/env/Lib/site-packages/aiogram/types/background_type_chat_theme.py deleted file mode 100644 index ac93534..0000000 --- a/env/Lib/site-packages/aiogram/types/background_type_chat_theme.py +++ /dev/null @@ -1,33 +0,0 @@ -from typing import TYPE_CHECKING, Any, Literal - -from .background_type import BackgroundType - - -class BackgroundTypeChatTheme(BackgroundType): - """ - The background is taken directly from a built-in chat theme. - - Source: https://core.telegram.org/bots/api#backgroundtypechattheme - """ - - type: Literal["chat_theme"] = "chat_theme" - """Type of the background, always 'chat_theme'""" - theme_name: str - """Name of the chat theme, which is usually an emoji""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal["chat_theme"] = "chat_theme", - theme_name: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, theme_name=theme_name, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/background_type_fill.py b/env/Lib/site-packages/aiogram/types/background_type_fill.py deleted file mode 100644 index c506e4e..0000000 --- a/env/Lib/site-packages/aiogram/types/background_type_fill.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Union - -from .background_type import BackgroundType - -if TYPE_CHECKING: - from .background_fill_freeform_gradient import BackgroundFillFreeformGradient - from .background_fill_gradient import BackgroundFillGradient - from .background_fill_solid import BackgroundFillSolid - - -class BackgroundTypeFill(BackgroundType): - """ - The background is automatically filled based on the selected colors. - - Source: https://core.telegram.org/bots/api#backgroundtypefill - """ - - type: Literal["fill"] = "fill" - """Type of the background, always 'fill'""" - fill: Union[BackgroundFillSolid, BackgroundFillGradient, BackgroundFillFreeformGradient] - """The background fill""" - dark_theme_dimming: int - """Dimming of the background in dark themes, as a percentage; 0-100""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal["fill"] = "fill", - fill: Union[ - BackgroundFillSolid, BackgroundFillGradient, BackgroundFillFreeformGradient - ], - dark_theme_dimming: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, fill=fill, dark_theme_dimming=dark_theme_dimming, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/background_type_pattern.py b/env/Lib/site-packages/aiogram/types/background_type_pattern.py deleted file mode 100644 index 29c383c..0000000 --- a/env/Lib/site-packages/aiogram/types/background_type_pattern.py +++ /dev/null @@ -1,63 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional, Union - -from .background_type import BackgroundType - -if TYPE_CHECKING: - from .background_fill_freeform_gradient import BackgroundFillFreeformGradient - from .background_fill_gradient import BackgroundFillGradient - from .background_fill_solid import BackgroundFillSolid - from .document import Document - - -class BackgroundTypePattern(BackgroundType): - """ - The background is a PNG or TGV (gzipped subset of SVG with MIME type 'application/x-tgwallpattern') pattern to be combined with the background fill chosen by the user. - - Source: https://core.telegram.org/bots/api#backgroundtypepattern - """ - - type: Literal["pattern"] = "pattern" - """Type of the background, always 'pattern'""" - document: Document - """Document with the pattern""" - fill: Union[BackgroundFillSolid, BackgroundFillGradient, BackgroundFillFreeformGradient] - """The background fill that is combined with the pattern""" - intensity: int - """Intensity of the pattern when it is shown above the filled background; 0-100""" - is_inverted: Optional[bool] = None - """*Optional*. :code:`True`, if the background fill must be applied only to the pattern itself. All other pixels are black in this case. For dark themes only""" - is_moving: Optional[bool] = None - """*Optional*. :code:`True`, if the background moves slightly when the device is tilted""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal["pattern"] = "pattern", - document: Document, - fill: Union[ - BackgroundFillSolid, BackgroundFillGradient, BackgroundFillFreeformGradient - ], - intensity: int, - is_inverted: Optional[bool] = None, - is_moving: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - document=document, - fill=fill, - intensity=intensity, - is_inverted=is_inverted, - is_moving=is_moving, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/background_type_wallpaper.py b/env/Lib/site-packages/aiogram/types/background_type_wallpaper.py deleted file mode 100644 index 4ad2905..0000000 --- a/env/Lib/site-packages/aiogram/types/background_type_wallpaper.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional - -from .background_type import BackgroundType - -if TYPE_CHECKING: - from .document import Document - - -class BackgroundTypeWallpaper(BackgroundType): - """ - The background is a wallpaper in the JPEG format. - - Source: https://core.telegram.org/bots/api#backgroundtypewallpaper - """ - - type: Literal["wallpaper"] = "wallpaper" - """Type of the background, always 'wallpaper'""" - document: Document - """Document with the wallpaper""" - dark_theme_dimming: int - """Dimming of the background in dark themes, as a percentage; 0-100""" - is_blurred: Optional[bool] = None - """*Optional*. :code:`True`, if the wallpaper is downscaled to fit in a 450x450 square and then box-blurred with radius 12""" - is_moving: Optional[bool] = None - """*Optional*. :code:`True`, if the background moves slightly when the device is tilted""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal["wallpaper"] = "wallpaper", - document: Document, - dark_theme_dimming: int, - is_blurred: Optional[bool] = None, - is_moving: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - document=document, - dark_theme_dimming=dark_theme_dimming, - is_blurred=is_blurred, - is_moving=is_moving, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/base.py b/env/Lib/site-packages/aiogram/types/base.py deleted file mode 100644 index 7ae0052..0000000 --- a/env/Lib/site-packages/aiogram/types/base.py +++ /dev/null @@ -1,51 +0,0 @@ -from typing import Any, Dict -from unittest.mock import sentinel - -from pydantic import BaseModel, ConfigDict, model_validator - -from aiogram.client.context_controller import BotContextController -from aiogram.client.default import Default - - -class TelegramObject(BotContextController, BaseModel): - model_config = ConfigDict( - use_enum_values=True, - extra="allow", - validate_assignment=True, - frozen=True, - populate_by_name=True, - arbitrary_types_allowed=True, - defer_build=True, - ) - - @model_validator(mode="before") - @classmethod - def remove_unset(cls, values: Dict[str, Any]) -> Dict[str, Any]: - """ - Remove UNSET before fields validation. - - We use UNSET as a sentinel value for `parse_mode` and replace it to real value later. - It isn't a problem when it's just default value for a model field, - but UNSET might be passed to a model initialization from `Bot.method_name`, - so we must take care of it and remove it before fields validation. - """ - if not isinstance(values, dict): - return values - return {k: v for k, v in values.items() if not isinstance(v, UNSET_TYPE)} - - -class MutableTelegramObject(TelegramObject): - model_config = ConfigDict( - frozen=False, - ) - - -# special sentinel object which used in a situation when None might be a useful value -UNSET: Any = sentinel.UNSET -UNSET_TYPE: Any = type(UNSET) - -# Unused constants are needed only for backward compatibility with external -# libraries that a working with framework internals -UNSET_PARSE_MODE: Any = Default("parse_mode") -UNSET_DISABLE_WEB_PAGE_PREVIEW: Any = Default("link_preview_is_disabled") -UNSET_PROTECT_CONTENT: Any = Default("protect_content") diff --git a/env/Lib/site-packages/aiogram/types/birthdate.py b/env/Lib/site-packages/aiogram/types/birthdate.py deleted file mode 100644 index 6955554..0000000 --- a/env/Lib/site-packages/aiogram/types/birthdate.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - - -class Birthdate(TelegramObject): - """ - Describes the birthdate of a user. - - Source: https://core.telegram.org/bots/api#birthdate - """ - - day: int - """Day of the user's birth; 1-31""" - month: int - """Month of the user's birth; 1-12""" - year: Optional[int] = None - """*Optional*. Year of the user's birth""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - day: int, - month: int, - year: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(day=day, month=month, year=year, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/bot_command.py b/env/Lib/site-packages/aiogram/types/bot_command.py deleted file mode 100644 index e4e9175..0000000 --- a/env/Lib/site-packages/aiogram/types/bot_command.py +++ /dev/null @@ -1,31 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import MutableTelegramObject - - -class BotCommand(MutableTelegramObject): - """ - This object represents a bot command. - - Source: https://core.telegram.org/bots/api#botcommand - """ - - command: str - """Text of the command; 1-32 characters. Can contain only lowercase English letters, digits and underscores.""" - description: str - """Description of the command; 1-256 characters.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, command: str, description: str, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(command=command, description=description, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/bot_command_scope.py b/env/Lib/site-packages/aiogram/types/bot_command_scope.py deleted file mode 100644 index dfb1d52..0000000 --- a/env/Lib/site-packages/aiogram/types/bot_command_scope.py +++ /dev/null @@ -1,19 +0,0 @@ -from __future__ import annotations - -from .base import TelegramObject - - -class BotCommandScope(TelegramObject): - """ - This object represents the scope to which bot commands are applied. Currently, the following 7 scopes are supported: - - - :class:`aiogram.types.bot_command_scope_default.BotCommandScopeDefault` - - :class:`aiogram.types.bot_command_scope_all_private_chats.BotCommandScopeAllPrivateChats` - - :class:`aiogram.types.bot_command_scope_all_group_chats.BotCommandScopeAllGroupChats` - - :class:`aiogram.types.bot_command_scope_all_chat_administrators.BotCommandScopeAllChatAdministrators` - - :class:`aiogram.types.bot_command_scope_chat.BotCommandScopeChat` - - :class:`aiogram.types.bot_command_scope_chat_administrators.BotCommandScopeChatAdministrators` - - :class:`aiogram.types.bot_command_scope_chat_member.BotCommandScopeChatMember` - - Source: https://core.telegram.org/bots/api#botcommandscope - """ diff --git a/env/Lib/site-packages/aiogram/types/bot_command_scope_all_chat_administrators.py b/env/Lib/site-packages/aiogram/types/bot_command_scope_all_chat_administrators.py deleted file mode 100644 index 4417363..0000000 --- a/env/Lib/site-packages/aiogram/types/bot_command_scope_all_chat_administrators.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import BotCommandScopeType -from .bot_command_scope import BotCommandScope - - -class BotCommandScopeAllChatAdministrators(BotCommandScope): - """ - Represents the `scope `_ of bot commands, covering all group and supergroup chat administrators. - - Source: https://core.telegram.org/bots/api#botcommandscopeallchatadministrators - """ - - type: Literal[BotCommandScopeType.ALL_CHAT_ADMINISTRATORS] = ( - BotCommandScopeType.ALL_CHAT_ADMINISTRATORS - ) - """Scope type, must be *all_chat_administrators*""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[ - BotCommandScopeType.ALL_CHAT_ADMINISTRATORS - ] = BotCommandScopeType.ALL_CHAT_ADMINISTRATORS, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/bot_command_scope_all_group_chats.py b/env/Lib/site-packages/aiogram/types/bot_command_scope_all_group_chats.py deleted file mode 100644 index a17a51d..0000000 --- a/env/Lib/site-packages/aiogram/types/bot_command_scope_all_group_chats.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import BotCommandScopeType -from .bot_command_scope import BotCommandScope - - -class BotCommandScopeAllGroupChats(BotCommandScope): - """ - Represents the `scope `_ of bot commands, covering all group and supergroup chats. - - Source: https://core.telegram.org/bots/api#botcommandscopeallgroupchats - """ - - type: Literal[BotCommandScopeType.ALL_GROUP_CHATS] = BotCommandScopeType.ALL_GROUP_CHATS - """Scope type, must be *all_group_chats*""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[ - BotCommandScopeType.ALL_GROUP_CHATS - ] = BotCommandScopeType.ALL_GROUP_CHATS, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/bot_command_scope_all_private_chats.py b/env/Lib/site-packages/aiogram/types/bot_command_scope_all_private_chats.py deleted file mode 100644 index 54d406f..0000000 --- a/env/Lib/site-packages/aiogram/types/bot_command_scope_all_private_chats.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import BotCommandScopeType -from .bot_command_scope import BotCommandScope - - -class BotCommandScopeAllPrivateChats(BotCommandScope): - """ - Represents the `scope `_ of bot commands, covering all private chats. - - Source: https://core.telegram.org/bots/api#botcommandscopeallprivatechats - """ - - type: Literal[BotCommandScopeType.ALL_PRIVATE_CHATS] = BotCommandScopeType.ALL_PRIVATE_CHATS - """Scope type, must be *all_private_chats*""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[ - BotCommandScopeType.ALL_PRIVATE_CHATS - ] = BotCommandScopeType.ALL_PRIVATE_CHATS, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/bot_command_scope_chat.py b/env/Lib/site-packages/aiogram/types/bot_command_scope_chat.py deleted file mode 100644 index f36c4a1..0000000 --- a/env/Lib/site-packages/aiogram/types/bot_command_scope_chat.py +++ /dev/null @@ -1,36 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Union - -from ..enums import BotCommandScopeType -from .bot_command_scope import BotCommandScope - - -class BotCommandScopeChat(BotCommandScope): - """ - Represents the `scope `_ of bot commands, covering a specific chat. - - Source: https://core.telegram.org/bots/api#botcommandscopechat - """ - - type: Literal[BotCommandScopeType.CHAT] = BotCommandScopeType.CHAT - """Scope type, must be *chat*""" - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[BotCommandScopeType.CHAT] = BotCommandScopeType.CHAT, - chat_id: Union[int, str], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/bot_command_scope_chat_administrators.py b/env/Lib/site-packages/aiogram/types/bot_command_scope_chat_administrators.py deleted file mode 100644 index f90623e..0000000 --- a/env/Lib/site-packages/aiogram/types/bot_command_scope_chat_administrators.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Union - -from ..enums import BotCommandScopeType -from .bot_command_scope import BotCommandScope - - -class BotCommandScopeChatAdministrators(BotCommandScope): - """ - Represents the `scope `_ of bot commands, covering all administrators of a specific group or supergroup chat. - - Source: https://core.telegram.org/bots/api#botcommandscopechatadministrators - """ - - type: Literal[BotCommandScopeType.CHAT_ADMINISTRATORS] = ( - BotCommandScopeType.CHAT_ADMINISTRATORS - ) - """Scope type, must be *chat_administrators*""" - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[ - BotCommandScopeType.CHAT_ADMINISTRATORS - ] = BotCommandScopeType.CHAT_ADMINISTRATORS, - chat_id: Union[int, str], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, chat_id=chat_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/bot_command_scope_chat_member.py b/env/Lib/site-packages/aiogram/types/bot_command_scope_chat_member.py deleted file mode 100644 index 4d20b1f..0000000 --- a/env/Lib/site-packages/aiogram/types/bot_command_scope_chat_member.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Union - -from ..enums import BotCommandScopeType -from .bot_command_scope import BotCommandScope - - -class BotCommandScopeChatMember(BotCommandScope): - """ - Represents the `scope `_ of bot commands, covering a specific member of a group or supergroup chat. - - Source: https://core.telegram.org/bots/api#botcommandscopechatmember - """ - - type: Literal[BotCommandScopeType.CHAT_MEMBER] = BotCommandScopeType.CHAT_MEMBER - """Scope type, must be *chat_member*""" - chat_id: Union[int, str] - """Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)""" - user_id: int - """Unique identifier of the target user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[BotCommandScopeType.CHAT_MEMBER] = BotCommandScopeType.CHAT_MEMBER, - chat_id: Union[int, str], - user_id: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, chat_id=chat_id, user_id=user_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/bot_command_scope_default.py b/env/Lib/site-packages/aiogram/types/bot_command_scope_default.py deleted file mode 100644 index 33b7a0c..0000000 --- a/env/Lib/site-packages/aiogram/types/bot_command_scope_default.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import BotCommandScopeType -from .bot_command_scope import BotCommandScope - - -class BotCommandScopeDefault(BotCommandScope): - """ - Represents the default `scope `_ of bot commands. Default commands are used if no commands with a `narrower scope `_ are specified for the user. - - Source: https://core.telegram.org/bots/api#botcommandscopedefault - """ - - type: Literal[BotCommandScopeType.DEFAULT] = BotCommandScopeType.DEFAULT - """Scope type, must be *default*""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[BotCommandScopeType.DEFAULT] = BotCommandScopeType.DEFAULT, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/bot_description.py b/env/Lib/site-packages/aiogram/types/bot_description.py deleted file mode 100644 index 5d8646d..0000000 --- a/env/Lib/site-packages/aiogram/types/bot_description.py +++ /dev/null @@ -1,25 +0,0 @@ -from typing import TYPE_CHECKING, Any - -from aiogram.types import TelegramObject - - -class BotDescription(TelegramObject): - """ - This object represents the bot's description. - - Source: https://core.telegram.org/bots/api#botdescription - """ - - description: str - """The bot's description""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__(__pydantic__self__, *, description: str, **__pydantic_kwargs: Any) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(description=description, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/bot_name.py b/env/Lib/site-packages/aiogram/types/bot_name.py deleted file mode 100644 index f2dc074..0000000 --- a/env/Lib/site-packages/aiogram/types/bot_name.py +++ /dev/null @@ -1,25 +0,0 @@ -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class BotName(TelegramObject): - """ - This object represents the bot's name. - - Source: https://core.telegram.org/bots/api#botname - """ - - name: str - """The bot's name""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__(__pydantic__self__, *, name: str, **__pydantic_kwargs: Any) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(name=name, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/bot_short_description.py b/env/Lib/site-packages/aiogram/types/bot_short_description.py deleted file mode 100644 index 86b11cf..0000000 --- a/env/Lib/site-packages/aiogram/types/bot_short_description.py +++ /dev/null @@ -1,27 +0,0 @@ -from typing import TYPE_CHECKING, Any - -from aiogram.types import TelegramObject - - -class BotShortDescription(TelegramObject): - """ - This object represents the bot's short description. - - Source: https://core.telegram.org/bots/api#botshortdescription - """ - - short_description: str - """The bot's short description""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, short_description: str, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(short_description=short_description, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/business_connection.py b/env/Lib/site-packages/aiogram/types/business_connection.py deleted file mode 100644 index 80c472a..0000000 --- a/env/Lib/site-packages/aiogram/types/business_connection.py +++ /dev/null @@ -1,59 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject -from .custom import DateTime - -if TYPE_CHECKING: - from .user import User - - -class BusinessConnection(TelegramObject): - """ - Describes the connection of the bot with a business account. - - Source: https://core.telegram.org/bots/api#businessconnection - """ - - id: str - """Unique identifier of the business connection""" - user: User - """Business account user that created the business connection""" - user_chat_id: int - """Identifier of a private chat with the user who created the business connection. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier.""" - date: DateTime - """Date the connection was established in Unix time""" - can_reply: bool - """True, if the bot can act on behalf of the business account in chats that were active in the last 24 hours""" - is_enabled: bool - """True, if the connection is active""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - id: str, - user: User, - user_chat_id: int, - date: DateTime, - can_reply: bool, - is_enabled: bool, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - id=id, - user=user, - user_chat_id=user_chat_id, - date=date, - can_reply=can_reply, - is_enabled=is_enabled, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/business_intro.py b/env/Lib/site-packages/aiogram/types/business_intro.py deleted file mode 100644 index c360fbe..0000000 --- a/env/Lib/site-packages/aiogram/types/business_intro.py +++ /dev/null @@ -1,41 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .sticker import Sticker - - -class BusinessIntro(TelegramObject): - """ - Contains information about the start page settings of a Telegram Business account. - - Source: https://core.telegram.org/bots/api#businessintro - """ - - title: Optional[str] = None - """*Optional*. Title text of the business intro""" - message: Optional[str] = None - """*Optional*. Message text of the business intro""" - sticker: Optional[Sticker] = None - """*Optional*. Sticker of the business intro""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - title: Optional[str] = None, - message: Optional[str] = None, - sticker: Optional[Sticker] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(title=title, message=message, sticker=sticker, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/business_location.py b/env/Lib/site-packages/aiogram/types/business_location.py deleted file mode 100644 index af7989a..0000000 --- a/env/Lib/site-packages/aiogram/types/business_location.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .location import Location - - -class BusinessLocation(TelegramObject): - """ - Contains information about the location of a Telegram Business account. - - Source: https://core.telegram.org/bots/api#businesslocation - """ - - address: str - """Address of the business""" - location: Optional[Location] = None - """*Optional*. Location of the business""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - address: str, - location: Optional[Location] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(address=address, location=location, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/business_messages_deleted.py b/env/Lib/site-packages/aiogram/types/business_messages_deleted.py deleted file mode 100644 index 44bc45f..0000000 --- a/env/Lib/site-packages/aiogram/types/business_messages_deleted.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List - -from .base import TelegramObject - -if TYPE_CHECKING: - from .chat import Chat - - -class BusinessMessagesDeleted(TelegramObject): - """ - This object is received when messages are deleted from a connected business account. - - Source: https://core.telegram.org/bots/api#businessmessagesdeleted - """ - - business_connection_id: str - """Unique identifier of the business connection""" - chat: Chat - """Information about a chat in the business account. The bot may not have access to the chat or the corresponding user.""" - message_ids: List[int] - """The list of identifiers of deleted messages in the chat of the business account""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - business_connection_id: str, - chat: Chat, - message_ids: List[int], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - business_connection_id=business_connection_id, - chat=chat, - message_ids=message_ids, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/business_opening_hours.py b/env/Lib/site-packages/aiogram/types/business_opening_hours.py deleted file mode 100644 index 7fd5c75..0000000 --- a/env/Lib/site-packages/aiogram/types/business_opening_hours.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List - -from .base import TelegramObject - -if TYPE_CHECKING: - from .business_opening_hours_interval import BusinessOpeningHoursInterval - - -class BusinessOpeningHours(TelegramObject): - """ - Describes the opening hours of a business. - - Source: https://core.telegram.org/bots/api#businessopeninghours - """ - - time_zone_name: str - """Unique name of the time zone for which the opening hours are defined""" - opening_hours: List[BusinessOpeningHoursInterval] - """List of time intervals describing business opening hours""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - time_zone_name: str, - opening_hours: List[BusinessOpeningHoursInterval], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - time_zone_name=time_zone_name, opening_hours=opening_hours, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/business_opening_hours_interval.py b/env/Lib/site-packages/aiogram/types/business_opening_hours_interval.py deleted file mode 100644 index 52efd2c..0000000 --- a/env/Lib/site-packages/aiogram/types/business_opening_hours_interval.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class BusinessOpeningHoursInterval(TelegramObject): - """ - Describes an interval of time during which a business is open. - - Source: https://core.telegram.org/bots/api#businessopeninghoursinterval - """ - - opening_minute: int - """The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0 - 7 * 24 * 60""" - closing_minute: int - """The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 0 - 8 * 24 * 60""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - opening_minute: int, - closing_minute: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - opening_minute=opening_minute, closing_minute=closing_minute, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/callback_game.py b/env/Lib/site-packages/aiogram/types/callback_game.py deleted file mode 100644 index 6d8c556..0000000 --- a/env/Lib/site-packages/aiogram/types/callback_game.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import annotations - -from .base import TelegramObject - - -class CallbackGame(TelegramObject): - """ - A placeholder, currently holds no information. Use `BotFather `_ to set up your game. - - Source: https://core.telegram.org/bots/api#callbackgame - """ diff --git a/env/Lib/site-packages/aiogram/types/callback_query.py b/env/Lib/site-packages/aiogram/types/callback_query.py deleted file mode 100644 index c3b33b5..0000000 --- a/env/Lib/site-packages/aiogram/types/callback_query.py +++ /dev/null @@ -1,109 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from pydantic import Field - -from .base import TelegramObject - -if TYPE_CHECKING: - from ..methods import AnswerCallbackQuery - from .inaccessible_message import InaccessibleMessage - from .message import Message - from .user import User - - -class CallbackQuery(TelegramObject): - """ - This object represents an incoming callback query from a callback button in an `inline keyboard `_. If the button that originated the query was attached to a message sent by the bot, the field *message* will be present. If the button was attached to a message sent via the bot (in `inline mode `_), the field *inline_message_id* will be present. Exactly one of the fields *data* or *game_short_name* will be present. - - **NOTE:** After the user presses a callback button, Telegram clients will display a progress bar until you call :class:`aiogram.methods.answer_callback_query.AnswerCallbackQuery`. It is, therefore, necessary to react by calling :class:`aiogram.methods.answer_callback_query.AnswerCallbackQuery` even if no notification to the user is needed (e.g., without specifying any of the optional parameters). - - Source: https://core.telegram.org/bots/api#callbackquery - """ - - id: str - """Unique identifier for this query""" - from_user: User = Field(..., alias="from") - """Sender""" - chat_instance: str - """Global identifier, uniquely corresponding to the chat to which the message with the callback button was sent. Useful for high scores in :class:`aiogram.methods.games.Games`.""" - message: Optional[Union[Message, InaccessibleMessage]] = None - """*Optional*. Message sent by the bot with the callback button that originated the query""" - inline_message_id: Optional[str] = None - """*Optional*. Identifier of the message sent via the bot in inline mode, that originated the query.""" - data: Optional[str] = None - """*Optional*. Data associated with the callback button. Be aware that the message originated the query can contain no callback buttons with this data.""" - game_short_name: Optional[str] = None - """*Optional*. Short name of a `Game `_ to be returned, serves as the unique identifier for the game""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - id: str, - from_user: User, - chat_instance: str, - message: Optional[Union[Message, InaccessibleMessage]] = None, - inline_message_id: Optional[str] = None, - data: Optional[str] = None, - game_short_name: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - id=id, - from_user=from_user, - chat_instance=chat_instance, - message=message, - inline_message_id=inline_message_id, - data=data, - game_short_name=game_short_name, - **__pydantic_kwargs, - ) - - def answer( - self, - text: Optional[str] = None, - show_alert: Optional[bool] = None, - url: Optional[str] = None, - cache_time: Optional[int] = None, - **kwargs: Any, - ) -> AnswerCallbackQuery: - """ - Shortcut for method :class:`aiogram.methods.answer_callback_query.AnswerCallbackQuery` - will automatically fill method attributes: - - - :code:`callback_query_id` - - Use this method to send answers to callback queries sent from `inline keyboards `_. The answer will be displayed to the user as a notification at the top of the chat screen or as an alert. On success, :code:`True` is returned. - - Alternatively, the user can be redirected to the specified Game URL. For this option to work, you must first create a game for your bot via `@BotFather `_ and accept the terms. Otherwise, you may use links like :code:`t.me/your_bot?start=XXXX` that open your bot with a parameter. - - Source: https://core.telegram.org/bots/api#answercallbackquery - - :param text: Text of the notification. If not specified, nothing will be shown to the user, 0-200 characters - :param show_alert: If :code:`True`, an alert will be shown by the client instead of a notification at the top of the chat screen. Defaults to *false*. - :param url: URL that will be opened by the user's client. If you have created a :class:`aiogram.types.game.Game` and accepted the conditions via `@BotFather `_, specify the URL that opens your game - note that this will only work if the query comes from a `https://core.telegram.org/bots/api#inlinekeyboardbutton `_ *callback_game* button. - :param cache_time: The maximum amount of time in seconds that the result of the callback query may be cached client-side. Telegram apps will support caching starting in version 3.14. Defaults to 0. - :return: instance of method :class:`aiogram.methods.answer_callback_query.AnswerCallbackQuery` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import AnswerCallbackQuery - - return AnswerCallbackQuery( - callback_query_id=self.id, - text=text, - show_alert=show_alert, - url=url, - cache_time=cache_time, - **kwargs, - ).as_(self._bot) diff --git a/env/Lib/site-packages/aiogram/types/chat.py b/env/Lib/site-packages/aiogram/types/chat.py deleted file mode 100644 index c4feba4..0000000 --- a/env/Lib/site-packages/aiogram/types/chat.py +++ /dev/null @@ -1,1320 +0,0 @@ -from __future__ import annotations - -import datetime -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from .base import TelegramObject -from .custom import DateTime - -if TYPE_CHECKING: - from ..methods import ( - BanChatMember, - BanChatSenderChat, - CreateChatInviteLink, - DeleteChatPhoto, - DeleteChatStickerSet, - DeleteMessage, - EditChatInviteLink, - ExportChatInviteLink, - GetChatAdministrators, - GetChatMember, - GetChatMemberCount, - LeaveChat, - PinChatMessage, - PromoteChatMember, - RestrictChatMember, - RevokeChatInviteLink, - SendChatAction, - SetChatAdministratorCustomTitle, - SetChatDescription, - SetChatPermissions, - SetChatPhoto, - SetChatStickerSet, - SetChatTitle, - UnbanChatMember, - UnbanChatSenderChat, - UnpinAllChatMessages, - UnpinAllGeneralForumTopicMessages, - UnpinChatMessage, - ) - from .birthdate import Birthdate - from .business_intro import BusinessIntro - from .business_location import BusinessLocation - from .business_opening_hours import BusinessOpeningHours - from .chat_location import ChatLocation - from .chat_permissions import ChatPermissions - from .chat_photo import ChatPhoto - from .input_file import InputFile - from .message import Message - from .reaction_type_custom_emoji import ReactionTypeCustomEmoji - from .reaction_type_emoji import ReactionTypeEmoji - from .reaction_type_paid import ReactionTypePaid - - -class Chat(TelegramObject): - """ - This object represents a chat. - - Source: https://core.telegram.org/bots/api#chat - """ - - id: int - """Unique identifier for this chat. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this identifier.""" - type: str - """Type of the chat, can be either 'private', 'group', 'supergroup' or 'channel'""" - title: Optional[str] = None - """*Optional*. Title, for supergroups, channels and group chats""" - username: Optional[str] = None - """*Optional*. Username, for private chats, supergroups and channels if available""" - first_name: Optional[str] = None - """*Optional*. First name of the other party in a private chat""" - last_name: Optional[str] = None - """*Optional*. Last name of the other party in a private chat""" - is_forum: Optional[bool] = None - """*Optional*. :code:`True`, if the supergroup chat is a forum (has `topics `_ enabled)""" - accent_color_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. Identifier of the accent color for the chat name and backgrounds of the chat photo, reply header, and link preview. See `accent colors `_ for more details. Returned only in :class:`aiogram.methods.get_chat.GetChat`. Always returned in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - active_usernames: Optional[List[str]] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. If non-empty, the list of all `active chat usernames `_; for private chats, supergroups and channels. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - available_reactions: Optional[ - List[Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid]] - ] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. List of available reactions allowed in the chat. If omitted, then all `emoji reactions `_ are allowed. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - background_custom_emoji_id: Optional[str] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. Custom emoji identifier of emoji chosen by the chat for the reply header and link preview background. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - bio: Optional[str] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. Bio of the other party in a private chat. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - birthdate: Optional[Birthdate] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. For private chats, the date of birth of the user. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - business_intro: Optional[BusinessIntro] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. For private chats with business accounts, the intro of the business. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - business_location: Optional[BusinessLocation] = Field( - None, json_schema_extra={"deprecated": True} - ) - """*Optional*. For private chats with business accounts, the location of the business. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - business_opening_hours: Optional[BusinessOpeningHours] = Field( - None, json_schema_extra={"deprecated": True} - ) - """*Optional*. For private chats with business accounts, the opening hours of the business. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - can_set_sticker_set: Optional[bool] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. :code:`True`, if the bot can change the group sticker set. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - custom_emoji_sticker_set_name: Optional[str] = Field( - None, json_schema_extra={"deprecated": True} - ) - """*Optional*. For supergroups, the name of the group's custom emoji sticker set. Custom emoji from this set can be used by all users and bots in the group. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - description: Optional[str] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. Description, for groups, supergroups and channel chats. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - emoji_status_custom_emoji_id: Optional[str] = Field( - None, json_schema_extra={"deprecated": True} - ) - """*Optional*. Custom emoji identifier of the emoji status of the chat or the other party in a private chat. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - emoji_status_expiration_date: Optional[DateTime] = Field( - None, json_schema_extra={"deprecated": True} - ) - """*Optional*. Expiration date of the emoji status of the chat or the other party in a private chat, in Unix time, if any. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - has_aggressive_anti_spam_enabled: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """*Optional*. :code:`True`, if aggressive anti-spam checks are enabled in the supergroup. The field is only available to chat administrators. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - has_hidden_members: Optional[bool] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. :code:`True`, if non-administrators can only get the list of bots and administrators in the chat. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - has_private_forwards: Optional[bool] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. :code:`True`, if privacy settings of the other party in the private chat allows to use :code:`tg://user?id=` links only in chats with the user. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - has_protected_content: Optional[bool] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. :code:`True`, if messages from the chat can't be forwarded to other chats. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - has_restricted_voice_and_video_messages: Optional[bool] = Field( - None, json_schema_extra={"deprecated": True} - ) - """*Optional*. :code:`True`, if the privacy settings of the other party restrict sending voice and video note messages in the private chat. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - has_visible_history: Optional[bool] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. :code:`True`, if new chat members will have access to old messages; available only to chat administrators. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - invite_link: Optional[str] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. Primary invite link, for groups, supergroups and channel chats. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - join_by_request: Optional[bool] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. :code:`True`, if all users directly joining the supergroup need to be approved by supergroup administrators. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - join_to_send_messages: Optional[bool] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. :code:`True`, if users need to join the supergroup before they can send messages. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - linked_chat_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. Unique identifier for the linked chat, i.e. the discussion group identifier for a channel and vice versa; for supergroups and channel chats. This identifier may be greater than 32 bits and some programming languages may have difficulty/silent defects in interpreting it. But it is smaller than 52 bits, so a signed 64 bit integer or double-precision float type are safe for storing this identifier. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - location: Optional[ChatLocation] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. For supergroups, the location to which the supergroup is connected. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - message_auto_delete_time: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. The time after which all messages sent to the chat will be automatically deleted; in seconds. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - permissions: Optional[ChatPermissions] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. Default chat member permissions, for groups and supergroups. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - personal_chat: Optional[Chat] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. For private chats, the personal channel of the user. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - photo: Optional[ChatPhoto] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. Chat photo. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - pinned_message: Optional[Message] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. The most recent pinned message (by sending date). Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - profile_accent_color_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. Identifier of the accent color for the chat's profile background. See `profile accent colors `_ for more details. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - profile_background_custom_emoji_id: Optional[str] = Field( - None, json_schema_extra={"deprecated": True} - ) - """*Optional*. Custom emoji identifier of the emoji chosen by the chat for its profile background. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - slow_mode_delay: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. For supergroups, the minimum allowed delay between consecutive messages sent by each unprivileged user; in seconds. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - sticker_set_name: Optional[str] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. For supergroups, name of group sticker set. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - unrestrict_boost_count: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. For supergroups, the minimum number of boosts that a non-administrator user needs to add in order to ignore slow mode and chat permissions. Returned only in :class:`aiogram.methods.get_chat.GetChat`. - -.. deprecated:: API:7.3 - https://core.telegram.org/bots/api-changelog#may-6-2024""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - id: int, - type: str, - title: Optional[str] = None, - username: Optional[str] = None, - first_name: Optional[str] = None, - last_name: Optional[str] = None, - is_forum: Optional[bool] = None, - accent_color_id: Optional[int] = None, - active_usernames: Optional[List[str]] = None, - available_reactions: Optional[ - List[Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid]] - ] = None, - background_custom_emoji_id: Optional[str] = None, - bio: Optional[str] = None, - birthdate: Optional[Birthdate] = None, - business_intro: Optional[BusinessIntro] = None, - business_location: Optional[BusinessLocation] = None, - business_opening_hours: Optional[BusinessOpeningHours] = None, - can_set_sticker_set: Optional[bool] = None, - custom_emoji_sticker_set_name: Optional[str] = None, - description: Optional[str] = None, - emoji_status_custom_emoji_id: Optional[str] = None, - emoji_status_expiration_date: Optional[DateTime] = None, - has_aggressive_anti_spam_enabled: Optional[bool] = None, - has_hidden_members: Optional[bool] = None, - has_private_forwards: Optional[bool] = None, - has_protected_content: Optional[bool] = None, - has_restricted_voice_and_video_messages: Optional[bool] = None, - has_visible_history: Optional[bool] = None, - invite_link: Optional[str] = None, - join_by_request: Optional[bool] = None, - join_to_send_messages: Optional[bool] = None, - linked_chat_id: Optional[int] = None, - location: Optional[ChatLocation] = None, - message_auto_delete_time: Optional[int] = None, - permissions: Optional[ChatPermissions] = None, - personal_chat: Optional[Chat] = None, - photo: Optional[ChatPhoto] = None, - pinned_message: Optional[Message] = None, - profile_accent_color_id: Optional[int] = None, - profile_background_custom_emoji_id: Optional[str] = None, - slow_mode_delay: Optional[int] = None, - sticker_set_name: Optional[str] = None, - unrestrict_boost_count: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - id=id, - type=type, - title=title, - username=username, - first_name=first_name, - last_name=last_name, - is_forum=is_forum, - accent_color_id=accent_color_id, - active_usernames=active_usernames, - available_reactions=available_reactions, - background_custom_emoji_id=background_custom_emoji_id, - bio=bio, - birthdate=birthdate, - business_intro=business_intro, - business_location=business_location, - business_opening_hours=business_opening_hours, - can_set_sticker_set=can_set_sticker_set, - custom_emoji_sticker_set_name=custom_emoji_sticker_set_name, - description=description, - emoji_status_custom_emoji_id=emoji_status_custom_emoji_id, - emoji_status_expiration_date=emoji_status_expiration_date, - has_aggressive_anti_spam_enabled=has_aggressive_anti_spam_enabled, - has_hidden_members=has_hidden_members, - has_private_forwards=has_private_forwards, - has_protected_content=has_protected_content, - has_restricted_voice_and_video_messages=has_restricted_voice_and_video_messages, - has_visible_history=has_visible_history, - invite_link=invite_link, - join_by_request=join_by_request, - join_to_send_messages=join_to_send_messages, - linked_chat_id=linked_chat_id, - location=location, - message_auto_delete_time=message_auto_delete_time, - permissions=permissions, - personal_chat=personal_chat, - photo=photo, - pinned_message=pinned_message, - profile_accent_color_id=profile_accent_color_id, - profile_background_custom_emoji_id=profile_background_custom_emoji_id, - slow_mode_delay=slow_mode_delay, - sticker_set_name=sticker_set_name, - unrestrict_boost_count=unrestrict_boost_count, - **__pydantic_kwargs, - ) - - @property - def shifted_id(self) -> int: - """ - Returns shifted chat ID (positive and without "-100" prefix). - Mostly used for private links like t.me/c/chat_id/message_id - - Currently supergroup/channel IDs have 10-digit ID after "-100" prefix removed. - However, these IDs might become 11-digit in future. So, first we remove "-100" - prefix and count remaining number length. Then we multiple - -1 * 10 ^ (number_length + 2) - Finally, self.id is substracted from that number - """ - short_id = str(self.id).replace("-100", "") - shift = int(-1 * pow(10, len(short_id) + 2)) - return shift - self.id - - @property - def full_name(self) -> str: - """Get full name of the Chat. - - For private chat it is first_name + last_name. - For other chat types it is title. - """ - if self.title is not None: - return self.title - - if self.last_name is not None: - return f"{self.first_name} {self.last_name}" - - return f"{self.first_name}" - - def ban_sender_chat( - self, - sender_chat_id: int, - **kwargs: Any, - ) -> BanChatSenderChat: - """ - Shortcut for method :class:`aiogram.methods.ban_chat_sender_chat.BanChatSenderChat` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to ban a channel chat in a supergroup or a channel. Until the chat is `unbanned `_, the owner of the banned chat won't be able to send messages on behalf of **any of their channels**. The bot must be an administrator in the supergroup or channel for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#banchatsenderchat - - :param sender_chat_id: Unique identifier of the target sender chat - :return: instance of method :class:`aiogram.methods.ban_chat_sender_chat.BanChatSenderChat` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import BanChatSenderChat - - return BanChatSenderChat( - chat_id=self.id, - sender_chat_id=sender_chat_id, - **kwargs, - ).as_(self._bot) - - def unban_sender_chat( - self, - sender_chat_id: int, - **kwargs: Any, - ) -> UnbanChatSenderChat: - """ - Shortcut for method :class:`aiogram.methods.unban_chat_sender_chat.UnbanChatSenderChat` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to unban a previously banned channel chat in a supergroup or channel. The bot must be an administrator for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unbanchatsenderchat - - :param sender_chat_id: Unique identifier of the target sender chat - :return: instance of method :class:`aiogram.methods.unban_chat_sender_chat.UnbanChatSenderChat` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import UnbanChatSenderChat - - return UnbanChatSenderChat( - chat_id=self.id, - sender_chat_id=sender_chat_id, - **kwargs, - ).as_(self._bot) - - def get_administrators( - self, - **kwargs: Any, - ) -> GetChatAdministrators: - """ - Shortcut for method :class:`aiogram.methods.get_chat_administrators.GetChatAdministrators` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to get a list of administrators in a chat, which aren't bots. Returns an Array of :class:`aiogram.types.chat_member.ChatMember` objects. - - Source: https://core.telegram.org/bots/api#getchatadministrators - - :return: instance of method :class:`aiogram.methods.get_chat_administrators.GetChatAdministrators` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import GetChatAdministrators - - return GetChatAdministrators( - chat_id=self.id, - **kwargs, - ).as_(self._bot) - - def delete_message( - self, - message_id: int, - **kwargs: Any, - ) -> DeleteMessage: - """ - Shortcut for method :class:`aiogram.methods.delete_message.DeleteMessage` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to delete a message, including service messages, with the following limitations: - - - A message can only be deleted if it was sent less than 48 hours ago. - - - Service messages about a supergroup, channel, or forum topic creation can't be deleted. - - - A dice message in a private chat can only be deleted if it was sent more than 24 hours ago. - - - Bots can delete outgoing messages in private chats, groups, and supergroups. - - - Bots can delete incoming messages in private chats. - - - Bots granted *can_post_messages* permissions can delete outgoing messages in channels. - - - If the bot is an administrator of a group, it can delete any message there. - - - If the bot has *can_delete_messages* permission in a supergroup or a channel, it can delete any message there. - - Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletemessage - - :param message_id: Identifier of the message to delete - :return: instance of method :class:`aiogram.methods.delete_message.DeleteMessage` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import DeleteMessage - - return DeleteMessage( - chat_id=self.id, - message_id=message_id, - **kwargs, - ).as_(self._bot) - - def revoke_invite_link( - self, - invite_link: str, - **kwargs: Any, - ) -> RevokeChatInviteLink: - """ - Shortcut for method :class:`aiogram.methods.revoke_chat_invite_link.RevokeChatInviteLink` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to revoke an invite link created by the bot. If the primary link is revoked, a new link is automatically generated. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the revoked invite link as :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - - Source: https://core.telegram.org/bots/api#revokechatinvitelink - - :param invite_link: The invite link to revoke - :return: instance of method :class:`aiogram.methods.revoke_chat_invite_link.RevokeChatInviteLink` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import RevokeChatInviteLink - - return RevokeChatInviteLink( - chat_id=self.id, - invite_link=invite_link, - **kwargs, - ).as_(self._bot) - - def edit_invite_link( - self, - invite_link: str, - name: Optional[str] = None, - expire_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - member_limit: Optional[int] = None, - creates_join_request: Optional[bool] = None, - **kwargs: Any, - ) -> EditChatInviteLink: - """ - Shortcut for method :class:`aiogram.methods.edit_chat_invite_link.EditChatInviteLink` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to edit a non-primary invite link created by the bot. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the edited invite link as a :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - - Source: https://core.telegram.org/bots/api#editchatinvitelink - - :param invite_link: The invite link to edit - :param name: Invite link name; 0-32 characters - :param expire_date: Point in time (Unix timestamp) when the link will expire - :param member_limit: The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999 - :param creates_join_request: :code:`True`, if users joining the chat via the link need to be approved by chat administrators. If :code:`True`, *member_limit* can't be specified - :return: instance of method :class:`aiogram.methods.edit_chat_invite_link.EditChatInviteLink` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import EditChatInviteLink - - return EditChatInviteLink( - chat_id=self.id, - invite_link=invite_link, - name=name, - expire_date=expire_date, - member_limit=member_limit, - creates_join_request=creates_join_request, - **kwargs, - ).as_(self._bot) - - def create_invite_link( - self, - name: Optional[str] = None, - expire_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - member_limit: Optional[int] = None, - creates_join_request: Optional[bool] = None, - **kwargs: Any, - ) -> CreateChatInviteLink: - """ - Shortcut for method :class:`aiogram.methods.create_chat_invite_link.CreateChatInviteLink` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to create an additional invite link for a chat. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. The link can be revoked using the method :class:`aiogram.methods.revoke_chat_invite_link.RevokeChatInviteLink`. Returns the new invite link as :class:`aiogram.types.chat_invite_link.ChatInviteLink` object. - - Source: https://core.telegram.org/bots/api#createchatinvitelink - - :param name: Invite link name; 0-32 characters - :param expire_date: Point in time (Unix timestamp) when the link will expire - :param member_limit: The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999 - :param creates_join_request: :code:`True`, if users joining the chat via the link need to be approved by chat administrators. If :code:`True`, *member_limit* can't be specified - :return: instance of method :class:`aiogram.methods.create_chat_invite_link.CreateChatInviteLink` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import CreateChatInviteLink - - return CreateChatInviteLink( - chat_id=self.id, - name=name, - expire_date=expire_date, - member_limit=member_limit, - creates_join_request=creates_join_request, - **kwargs, - ).as_(self._bot) - - def export_invite_link( - self, - **kwargs: Any, - ) -> ExportChatInviteLink: - """ - Shortcut for method :class:`aiogram.methods.export_chat_invite_link.ExportChatInviteLink` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to generate a new primary invite link for a chat; any previously generated primary link is revoked. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns the new invite link as *String* on success. - - Note: Each administrator in a chat generates their own invite links. Bots can't use invite links generated by other administrators. If you want your bot to work with invite links, it will need to generate its own link using :class:`aiogram.methods.export_chat_invite_link.ExportChatInviteLink` or by calling the :class:`aiogram.methods.get_chat.GetChat` method. If your bot needs to generate a new primary invite link replacing its previous one, use :class:`aiogram.methods.export_chat_invite_link.ExportChatInviteLink` again. - - Source: https://core.telegram.org/bots/api#exportchatinvitelink - - :return: instance of method :class:`aiogram.methods.export_chat_invite_link.ExportChatInviteLink` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import ExportChatInviteLink - - return ExportChatInviteLink( - chat_id=self.id, - **kwargs, - ).as_(self._bot) - - def do( - self, - action: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - **kwargs: Any, - ) -> SendChatAction: - """ - Shortcut for method :class:`aiogram.methods.send_chat_action.SendChatAction` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method when you need to tell the user that something is happening on the bot's side. The status is set for 5 seconds or less (when a message arrives from your bot, Telegram clients clear its typing status). Returns :code:`True` on success. - - Example: The `ImageBot `_ needs some time to process a request and upload the image. Instead of sending a text message along the lines of 'Retrieving image, please wait…', the bot may use :class:`aiogram.methods.send_chat_action.SendChatAction` with *action* = *upload_photo*. The user will see a 'sending photo' status for the bot. - - We only recommend using this method when a response from the bot will take a **noticeable** amount of time to arrive. - - Source: https://core.telegram.org/bots/api#sendchataction - - :param action: Type of action to broadcast. Choose one, depending on what the user is about to receive: *typing* for `text messages `_, *upload_photo* for `photos `_, *record_video* or *upload_video* for `videos `_, *record_voice* or *upload_voice* for `voice notes `_, *upload_document* for `general files `_, *choose_sticker* for `stickers `_, *find_location* for `location data `_, *record_video_note* or *upload_video_note* for `video notes `_. - :param business_connection_id: Unique identifier of the business connection on behalf of which the action will be sent - :param message_thread_id: Unique identifier for the target message thread; for supergroups only - :return: instance of method :class:`aiogram.methods.send_chat_action.SendChatAction` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendChatAction - - return SendChatAction( - chat_id=self.id, - action=action, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - **kwargs, - ).as_(self._bot) - - def delete_sticker_set( - self, - **kwargs: Any, - ) -> DeleteChatStickerSet: - """ - Shortcut for method :class:`aiogram.methods.delete_chat_sticker_set.DeleteChatStickerSet` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to delete a group sticker set from a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field *can_set_sticker_set* optionally returned in :class:`aiogram.methods.get_chat.GetChat` requests to check if the bot can use this method. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletechatstickerset - - :return: instance of method :class:`aiogram.methods.delete_chat_sticker_set.DeleteChatStickerSet` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import DeleteChatStickerSet - - return DeleteChatStickerSet( - chat_id=self.id, - **kwargs, - ).as_(self._bot) - - def set_sticker_set( - self, - sticker_set_name: str, - **kwargs: Any, - ) -> SetChatStickerSet: - """ - Shortcut for method :class:`aiogram.methods.set_chat_sticker_set.SetChatStickerSet` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to set a new group sticker set for a supergroup. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Use the field *can_set_sticker_set* optionally returned in :class:`aiogram.methods.get_chat.GetChat` requests to check if the bot can use this method. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatstickerset - - :param sticker_set_name: Name of the sticker set to be set as the group sticker set - :return: instance of method :class:`aiogram.methods.set_chat_sticker_set.SetChatStickerSet` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SetChatStickerSet - - return SetChatStickerSet( - chat_id=self.id, - sticker_set_name=sticker_set_name, - **kwargs, - ).as_(self._bot) - - def get_member( - self, - user_id: int, - **kwargs: Any, - ) -> GetChatMember: - """ - Shortcut for method :class:`aiogram.methods.get_chat_member.GetChatMember` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to get information about a member of a chat. The method is only guaranteed to work for other users if the bot is an administrator in the chat. Returns a :class:`aiogram.types.chat_member.ChatMember` object on success. - - Source: https://core.telegram.org/bots/api#getchatmember - - :param user_id: Unique identifier of the target user - :return: instance of method :class:`aiogram.methods.get_chat_member.GetChatMember` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import GetChatMember - - return GetChatMember( - chat_id=self.id, - user_id=user_id, - **kwargs, - ).as_(self._bot) - - def get_member_count( - self, - **kwargs: Any, - ) -> GetChatMemberCount: - """ - Shortcut for method :class:`aiogram.methods.get_chat_member_count.GetChatMemberCount` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to get the number of members in a chat. Returns *Int* on success. - - Source: https://core.telegram.org/bots/api#getchatmembercount - - :return: instance of method :class:`aiogram.methods.get_chat_member_count.GetChatMemberCount` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import GetChatMemberCount - - return GetChatMemberCount( - chat_id=self.id, - **kwargs, - ).as_(self._bot) - - def leave( - self, - **kwargs: Any, - ) -> LeaveChat: - """ - Shortcut for method :class:`aiogram.methods.leave_chat.LeaveChat` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method for your bot to leave a group, supergroup or channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#leavechat - - :return: instance of method :class:`aiogram.methods.leave_chat.LeaveChat` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import LeaveChat - - return LeaveChat( - chat_id=self.id, - **kwargs, - ).as_(self._bot) - - def unpin_all_messages( - self, - **kwargs: Any, - ) -> UnpinAllChatMessages: - """ - Shortcut for method :class:`aiogram.methods.unpin_all_chat_messages.UnpinAllChatMessages` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to clear the list of pinned messages in a chat. If the chat is not a private chat, the bot must be an administrator in the chat for this to work and must have the 'can_pin_messages' administrator right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unpinallchatmessages - - :return: instance of method :class:`aiogram.methods.unpin_all_chat_messages.UnpinAllChatMessages` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import UnpinAllChatMessages - - return UnpinAllChatMessages( - chat_id=self.id, - **kwargs, - ).as_(self._bot) - - def unpin_message( - self, - business_connection_id: Optional[str] = None, - message_id: Optional[int] = None, - **kwargs: Any, - ) -> UnpinChatMessage: - """ - Shortcut for method :class:`aiogram.methods.unpin_chat_message.UnpinChatMessage` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to remove a message from the list of pinned messages in a chat. If the chat is not a private chat, the bot must be an administrator in the chat for this to work and must have the 'can_pin_messages' administrator right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unpinchatmessage - - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be unpinned - :param message_id: Identifier of the message to unpin. Required if *business_connection_id* is specified. If not specified, the most recent pinned message (by sending date) will be unpinned. - :return: instance of method :class:`aiogram.methods.unpin_chat_message.UnpinChatMessage` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import UnpinChatMessage - - return UnpinChatMessage( - chat_id=self.id, - business_connection_id=business_connection_id, - message_id=message_id, - **kwargs, - ).as_(self._bot) - - def pin_message( - self, - message_id: int, - business_connection_id: Optional[str] = None, - disable_notification: Optional[bool] = None, - **kwargs: Any, - ) -> PinChatMessage: - """ - Shortcut for method :class:`aiogram.methods.pin_chat_message.PinChatMessage` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to add a message to the list of pinned messages in a chat. If the chat is not a private chat, the bot must be an administrator in the chat for this to work and must have the 'can_pin_messages' administrator right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#pinchatmessage - - :param message_id: Identifier of a message to pin - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be pinned - :param disable_notification: Pass :code:`True` if it is not necessary to send a notification to all chat members about the new pinned message. Notifications are always disabled in channels and private chats. - :return: instance of method :class:`aiogram.methods.pin_chat_message.PinChatMessage` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import PinChatMessage - - return PinChatMessage( - chat_id=self.id, - message_id=message_id, - business_connection_id=business_connection_id, - disable_notification=disable_notification, - **kwargs, - ).as_(self._bot) - - def set_administrator_custom_title( - self, - user_id: int, - custom_title: str, - **kwargs: Any, - ) -> SetChatAdministratorCustomTitle: - """ - Shortcut for method :class:`aiogram.methods.set_chat_administrator_custom_title.SetChatAdministratorCustomTitle` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to set a custom title for an administrator in a supergroup promoted by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatadministratorcustomtitle - - :param user_id: Unique identifier of the target user - :param custom_title: New custom title for the administrator; 0-16 characters, emoji are not allowed - :return: instance of method :class:`aiogram.methods.set_chat_administrator_custom_title.SetChatAdministratorCustomTitle` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SetChatAdministratorCustomTitle - - return SetChatAdministratorCustomTitle( - chat_id=self.id, - user_id=user_id, - custom_title=custom_title, - **kwargs, - ).as_(self._bot) - - def set_permissions( - self, - permissions: ChatPermissions, - use_independent_chat_permissions: Optional[bool] = None, - **kwargs: Any, - ) -> SetChatPermissions: - """ - Shortcut for method :class:`aiogram.methods.set_chat_permissions.SetChatPermissions` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to set default chat permissions for all members. The bot must be an administrator in the group or a supergroup for this to work and must have the *can_restrict_members* administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatpermissions - - :param permissions: A JSON-serialized object for new default chat permissions - :param use_independent_chat_permissions: Pass :code:`True` if chat permissions are set independently. Otherwise, the *can_send_other_messages* and *can_add_web_page_previews* permissions will imply the *can_send_messages*, *can_send_audios*, *can_send_documents*, *can_send_photos*, *can_send_videos*, *can_send_video_notes*, and *can_send_voice_notes* permissions; the *can_send_polls* permission will imply the *can_send_messages* permission. - :return: instance of method :class:`aiogram.methods.set_chat_permissions.SetChatPermissions` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SetChatPermissions - - return SetChatPermissions( - chat_id=self.id, - permissions=permissions, - use_independent_chat_permissions=use_independent_chat_permissions, - **kwargs, - ).as_(self._bot) - - def promote( - self, - user_id: int, - is_anonymous: Optional[bool] = None, - can_manage_chat: Optional[bool] = None, - can_delete_messages: Optional[bool] = None, - can_manage_video_chats: Optional[bool] = None, - can_restrict_members: Optional[bool] = None, - can_promote_members: Optional[bool] = None, - can_change_info: Optional[bool] = None, - can_invite_users: Optional[bool] = None, - can_post_stories: Optional[bool] = None, - can_edit_stories: Optional[bool] = None, - can_delete_stories: Optional[bool] = None, - can_post_messages: Optional[bool] = None, - can_edit_messages: Optional[bool] = None, - can_pin_messages: Optional[bool] = None, - can_manage_topics: Optional[bool] = None, - **kwargs: Any, - ) -> PromoteChatMember: - """ - Shortcut for method :class:`aiogram.methods.promote_chat_member.PromoteChatMember` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to promote or demote a user in a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Pass :code:`False` for all boolean parameters to demote a user. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#promotechatmember - - :param user_id: Unique identifier of the target user - :param is_anonymous: Pass :code:`True` if the administrator's presence in the chat is hidden - :param can_manage_chat: Pass :code:`True` if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report spam messages and ignore slow mode. Implied by any other administrator privilege. - :param can_delete_messages: Pass :code:`True` if the administrator can delete messages of other users - :param can_manage_video_chats: Pass :code:`True` if the administrator can manage video chats - :param can_restrict_members: Pass :code:`True` if the administrator can restrict, ban or unban chat members, or access supergroup statistics - :param can_promote_members: Pass :code:`True` if the administrator can add new administrators with a subset of their own privileges or demote administrators that they have promoted, directly or indirectly (promoted by administrators that were appointed by him) - :param can_change_info: Pass :code:`True` if the administrator can change chat title, photo and other settings - :param can_invite_users: Pass :code:`True` if the administrator can invite new users to the chat - :param can_post_stories: Pass :code:`True` if the administrator can post stories to the chat - :param can_edit_stories: Pass :code:`True` if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access the chat's story archive - :param can_delete_stories: Pass :code:`True` if the administrator can delete stories posted by other users - :param can_post_messages: Pass :code:`True` if the administrator can post messages in the channel, or access channel statistics; for channels only - :param can_edit_messages: Pass :code:`True` if the administrator can edit messages of other users and can pin messages; for channels only - :param can_pin_messages: Pass :code:`True` if the administrator can pin messages; for supergroups only - :param can_manage_topics: Pass :code:`True` if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only - :return: instance of method :class:`aiogram.methods.promote_chat_member.PromoteChatMember` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import PromoteChatMember - - return PromoteChatMember( - chat_id=self.id, - user_id=user_id, - is_anonymous=is_anonymous, - can_manage_chat=can_manage_chat, - can_delete_messages=can_delete_messages, - can_manage_video_chats=can_manage_video_chats, - can_restrict_members=can_restrict_members, - can_promote_members=can_promote_members, - can_change_info=can_change_info, - can_invite_users=can_invite_users, - can_post_stories=can_post_stories, - can_edit_stories=can_edit_stories, - can_delete_stories=can_delete_stories, - can_post_messages=can_post_messages, - can_edit_messages=can_edit_messages, - can_pin_messages=can_pin_messages, - can_manage_topics=can_manage_topics, - **kwargs, - ).as_(self._bot) - - def restrict( - self, - user_id: int, - permissions: ChatPermissions, - use_independent_chat_permissions: Optional[bool] = None, - until_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - **kwargs: Any, - ) -> RestrictChatMember: - """ - Shortcut for method :class:`aiogram.methods.restrict_chat_member.RestrictChatMember` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to restrict a user in a supergroup. The bot must be an administrator in the supergroup for this to work and must have the appropriate administrator rights. Pass :code:`True` for all permissions to lift restrictions from a user. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#restrictchatmember - - :param user_id: Unique identifier of the target user - :param permissions: A JSON-serialized object for new user permissions - :param use_independent_chat_permissions: Pass :code:`True` if chat permissions are set independently. Otherwise, the *can_send_other_messages* and *can_add_web_page_previews* permissions will imply the *can_send_messages*, *can_send_audios*, *can_send_documents*, *can_send_photos*, *can_send_videos*, *can_send_video_notes*, and *can_send_voice_notes* permissions; the *can_send_polls* permission will imply the *can_send_messages* permission. - :param until_date: Date when restrictions will be lifted for the user; Unix time. If user is restricted for more than 366 days or less than 30 seconds from the current time, they are considered to be restricted forever - :return: instance of method :class:`aiogram.methods.restrict_chat_member.RestrictChatMember` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import RestrictChatMember - - return RestrictChatMember( - chat_id=self.id, - user_id=user_id, - permissions=permissions, - use_independent_chat_permissions=use_independent_chat_permissions, - until_date=until_date, - **kwargs, - ).as_(self._bot) - - def unban( - self, - user_id: int, - only_if_banned: Optional[bool] = None, - **kwargs: Any, - ) -> UnbanChatMember: - """ - Shortcut for method :class:`aiogram.methods.unban_chat_member.UnbanChatMember` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to unban a previously banned user in a supergroup or channel. The user will **not** return to the group or channel automatically, but will be able to join via link, etc. The bot must be an administrator for this to work. By default, this method guarantees that after the call the user is not a member of the chat, but will be able to join it. So if the user is a member of the chat they will also be **removed** from the chat. If you don't want this, use the parameter *only_if_banned*. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unbanchatmember - - :param user_id: Unique identifier of the target user - :param only_if_banned: Do nothing if the user is not banned - :return: instance of method :class:`aiogram.methods.unban_chat_member.UnbanChatMember` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import UnbanChatMember - - return UnbanChatMember( - chat_id=self.id, - user_id=user_id, - only_if_banned=only_if_banned, - **kwargs, - ).as_(self._bot) - - def ban( - self, - user_id: int, - until_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - revoke_messages: Optional[bool] = None, - **kwargs: Any, - ) -> BanChatMember: - """ - Shortcut for method :class:`aiogram.methods.ban_chat_member.BanChatMember` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to ban a user in a group, a supergroup or a channel. In the case of supergroups and channels, the user will not be able to return to the chat on their own using invite links, etc., unless `unbanned `_ first. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#banchatmember - - :param user_id: Unique identifier of the target user - :param until_date: Date when the user will be unbanned; Unix time. If user is banned for more than 366 days or less than 30 seconds from the current time they are considered to be banned forever. Applied for supergroups and channels only. - :param revoke_messages: Pass :code:`True` to delete all messages from the chat for the user that is being removed. If :code:`False`, the user will be able to see messages in the group that were sent before the user was removed. Always :code:`True` for supergroups and channels. - :return: instance of method :class:`aiogram.methods.ban_chat_member.BanChatMember` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import BanChatMember - - return BanChatMember( - chat_id=self.id, - user_id=user_id, - until_date=until_date, - revoke_messages=revoke_messages, - **kwargs, - ).as_(self._bot) - - def set_description( - self, - description: Optional[str] = None, - **kwargs: Any, - ) -> SetChatDescription: - """ - Shortcut for method :class:`aiogram.methods.set_chat_description.SetChatDescription` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to change the description of a group, a supergroup or a channel. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatdescription - - :param description: New chat description, 0-255 characters - :return: instance of method :class:`aiogram.methods.set_chat_description.SetChatDescription` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SetChatDescription - - return SetChatDescription( - chat_id=self.id, - description=description, - **kwargs, - ).as_(self._bot) - - def set_title( - self, - title: str, - **kwargs: Any, - ) -> SetChatTitle: - """ - Shortcut for method :class:`aiogram.methods.set_chat_title.SetChatTitle` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to change the title of a chat. Titles can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchattitle - - :param title: New chat title, 1-128 characters - :return: instance of method :class:`aiogram.methods.set_chat_title.SetChatTitle` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SetChatTitle - - return SetChatTitle( - chat_id=self.id, - title=title, - **kwargs, - ).as_(self._bot) - - def delete_photo( - self, - **kwargs: Any, - ) -> DeleteChatPhoto: - """ - Shortcut for method :class:`aiogram.methods.delete_chat_photo.DeleteChatPhoto` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to delete a chat photo. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletechatphoto - - :return: instance of method :class:`aiogram.methods.delete_chat_photo.DeleteChatPhoto` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import DeleteChatPhoto - - return DeleteChatPhoto( - chat_id=self.id, - **kwargs, - ).as_(self._bot) - - def set_photo( - self, - photo: InputFile, - **kwargs: Any, - ) -> SetChatPhoto: - """ - Shortcut for method :class:`aiogram.methods.set_chat_photo.SetChatPhoto` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to set a new profile photo for the chat. Photos can't be changed for private chats. The bot must be an administrator in the chat for this to work and must have the appropriate administrator rights. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setchatphoto - - :param photo: New chat photo, uploaded using multipart/form-data - :return: instance of method :class:`aiogram.methods.set_chat_photo.SetChatPhoto` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SetChatPhoto - - return SetChatPhoto( - chat_id=self.id, - photo=photo, - **kwargs, - ).as_(self._bot) - - def unpin_all_general_forum_topic_messages( - self, - **kwargs: Any, - ) -> UnpinAllGeneralForumTopicMessages: - """ - Shortcut for method :class:`aiogram.methods.unpin_all_general_forum_topic_messages.UnpinAllGeneralForumTopicMessages` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to clear the list of pinned messages in a General forum topic. The bot must be an administrator in the chat for this to work and must have the *can_pin_messages* administrator right in the supergroup. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unpinallgeneralforumtopicmessages - - :return: instance of method :class:`aiogram.methods.unpin_all_general_forum_topic_messages.UnpinAllGeneralForumTopicMessages` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import UnpinAllGeneralForumTopicMessages - - return UnpinAllGeneralForumTopicMessages( - chat_id=self.id, - **kwargs, - ).as_(self._bot) diff --git a/env/Lib/site-packages/aiogram/types/chat_administrator_rights.py b/env/Lib/site-packages/aiogram/types/chat_administrator_rights.py deleted file mode 100644 index 0b20578..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_administrator_rights.py +++ /dev/null @@ -1,94 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - pass - - -class ChatAdministratorRights(TelegramObject): - """ - Represents the rights of an administrator in a chat. - - Source: https://core.telegram.org/bots/api#chatadministratorrights - """ - - is_anonymous: bool - """:code:`True`, if the user's presence in the chat is hidden""" - can_manage_chat: bool - """:code:`True`, if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report spam messages and ignore slow mode. Implied by any other administrator privilege.""" - can_delete_messages: bool - """:code:`True`, if the administrator can delete messages of other users""" - can_manage_video_chats: bool - """:code:`True`, if the administrator can manage video chats""" - can_restrict_members: bool - """:code:`True`, if the administrator can restrict, ban or unban chat members, or access supergroup statistics""" - can_promote_members: bool - """:code:`True`, if the administrator can add new administrators with a subset of their own privileges or demote administrators that they have promoted, directly or indirectly (promoted by administrators that were appointed by the user)""" - can_change_info: bool - """:code:`True`, if the user is allowed to change the chat title, photo and other settings""" - can_invite_users: bool - """:code:`True`, if the user is allowed to invite new users to the chat""" - can_post_stories: bool - """:code:`True`, if the administrator can post stories to the chat""" - can_edit_stories: bool - """:code:`True`, if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access the chat's story archive""" - can_delete_stories: bool - """:code:`True`, if the administrator can delete stories posted by other users""" - can_post_messages: Optional[bool] = None - """*Optional*. :code:`True`, if the administrator can post messages in the channel, or access channel statistics; for channels only""" - can_edit_messages: Optional[bool] = None - """*Optional*. :code:`True`, if the administrator can edit messages of other users and can pin messages; for channels only""" - can_pin_messages: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to pin messages; for groups and supergroups only""" - can_manage_topics: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - is_anonymous: bool, - can_manage_chat: bool, - can_delete_messages: bool, - can_manage_video_chats: bool, - can_restrict_members: bool, - can_promote_members: bool, - can_change_info: bool, - can_invite_users: bool, - can_post_stories: bool, - can_edit_stories: bool, - can_delete_stories: bool, - can_post_messages: Optional[bool] = None, - can_edit_messages: Optional[bool] = None, - can_pin_messages: Optional[bool] = None, - can_manage_topics: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - is_anonymous=is_anonymous, - can_manage_chat=can_manage_chat, - can_delete_messages=can_delete_messages, - can_manage_video_chats=can_manage_video_chats, - can_restrict_members=can_restrict_members, - can_promote_members=can_promote_members, - can_change_info=can_change_info, - can_invite_users=can_invite_users, - can_post_stories=can_post_stories, - can_edit_stories=can_edit_stories, - can_delete_stories=can_delete_stories, - can_post_messages=can_post_messages, - can_edit_messages=can_edit_messages, - can_pin_messages=can_pin_messages, - can_manage_topics=can_manage_topics, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/chat_background.py b/env/Lib/site-packages/aiogram/types/chat_background.py deleted file mode 100644 index 937b436..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_background.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -if TYPE_CHECKING: - from .background_type_chat_theme import BackgroundTypeChatTheme - from .background_type_fill import BackgroundTypeFill - from .background_type_pattern import BackgroundTypePattern - from .background_type_wallpaper import BackgroundTypeWallpaper -from .base import TelegramObject - - -class ChatBackground(TelegramObject): - """ - This object represents a chat background. - - Source: https://core.telegram.org/bots/api#chatbackground - """ - - type: Union[ - BackgroundTypeFill, BackgroundTypeWallpaper, BackgroundTypePattern, BackgroundTypeChatTheme - ] - """Type of the background""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Union[ - BackgroundTypeFill, - BackgroundTypeWallpaper, - BackgroundTypePattern, - BackgroundTypeChatTheme, - ], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/chat_boost.py b/env/Lib/site-packages/aiogram/types/chat_boost.py deleted file mode 100644 index 96e444f..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_boost.py +++ /dev/null @@ -1,55 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramObject -from .custom import DateTime - -if TYPE_CHECKING: - from .chat_boost_source_gift_code import ChatBoostSourceGiftCode - from .chat_boost_source_giveaway import ChatBoostSourceGiveaway - from .chat_boost_source_premium import ChatBoostSourcePremium - - -class ChatBoost(TelegramObject): - """ - This object contains information about a chat boost. - - Source: https://core.telegram.org/bots/api#chatboost - """ - - boost_id: str - """Unique identifier of the boost""" - add_date: DateTime - """Point in time (Unix timestamp) when the chat was boosted""" - expiration_date: DateTime - """Point in time (Unix timestamp) when the boost will automatically expire, unless the booster's Telegram Premium subscription is prolonged""" - source: Union[ChatBoostSourcePremium, ChatBoostSourceGiftCode, ChatBoostSourceGiveaway] - """Source of the added boost""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - boost_id: str, - add_date: DateTime, - expiration_date: DateTime, - source: Union[ - ChatBoostSourcePremium, ChatBoostSourceGiftCode, ChatBoostSourceGiveaway - ], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - boost_id=boost_id, - add_date=add_date, - expiration_date=expiration_date, - source=source, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/chat_boost_added.py b/env/Lib/site-packages/aiogram/types/chat_boost_added.py deleted file mode 100644 index 4473eae..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_boost_added.py +++ /dev/null @@ -1,25 +0,0 @@ -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class ChatBoostAdded(TelegramObject): - """ - This object represents a service message about a user boosting a chat. - - Source: https://core.telegram.org/bots/api#chatboostadded - """ - - boost_count: int - """Number of boosts added by the user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__(__pydantic__self__, *, boost_count: int, **__pydantic_kwargs: Any) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(boost_count=boost_count, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/chat_boost_removed.py b/env/Lib/site-packages/aiogram/types/chat_boost_removed.py deleted file mode 100644 index 094b057..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_boost_removed.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramObject -from .custom import DateTime - -if TYPE_CHECKING: - from .chat import Chat - from .chat_boost_source_gift_code import ChatBoostSourceGiftCode - from .chat_boost_source_giveaway import ChatBoostSourceGiveaway - from .chat_boost_source_premium import ChatBoostSourcePremium - - -class ChatBoostRemoved(TelegramObject): - """ - This object represents a boost removed from a chat. - - Source: https://core.telegram.org/bots/api#chatboostremoved - """ - - chat: Chat - """Chat which was boosted""" - boost_id: str - """Unique identifier of the boost""" - remove_date: DateTime - """Point in time (Unix timestamp) when the boost was removed""" - source: Union[ChatBoostSourcePremium, ChatBoostSourceGiftCode, ChatBoostSourceGiveaway] - """Source of the removed boost""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat: Chat, - boost_id: str, - remove_date: DateTime, - source: Union[ - ChatBoostSourcePremium, ChatBoostSourceGiftCode, ChatBoostSourceGiveaway - ], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat=chat, - boost_id=boost_id, - remove_date=remove_date, - source=source, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/chat_boost_source.py b/env/Lib/site-packages/aiogram/types/chat_boost_source.py deleted file mode 100644 index 3d2c262..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_boost_source.py +++ /dev/null @@ -1,13 +0,0 @@ -from aiogram.types import TelegramObject - - -class ChatBoostSource(TelegramObject): - """ - This object describes the source of a chat boost. It can be one of - - - :class:`aiogram.types.chat_boost_source_premium.ChatBoostSourcePremium` - - :class:`aiogram.types.chat_boost_source_gift_code.ChatBoostSourceGiftCode` - - :class:`aiogram.types.chat_boost_source_giveaway.ChatBoostSourceGiveaway` - - Source: https://core.telegram.org/bots/api#chatboostsource - """ diff --git a/env/Lib/site-packages/aiogram/types/chat_boost_source_gift_code.py b/env/Lib/site-packages/aiogram/types/chat_boost_source_gift_code.py deleted file mode 100644 index 554e58f..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_boost_source_gift_code.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import ChatBoostSourceType -from .chat_boost_source import ChatBoostSource - -if TYPE_CHECKING: - from .user import User - - -class ChatBoostSourceGiftCode(ChatBoostSource): - """ - The boost was obtained by the creation of Telegram Premium gift codes to boost a chat. Each such code boosts the chat 4 times for the duration of the corresponding Telegram Premium subscription. - - Source: https://core.telegram.org/bots/api#chatboostsourcegiftcode - """ - - source: Literal[ChatBoostSourceType.GIFT_CODE] = ChatBoostSourceType.GIFT_CODE - """Source of the boost, always 'gift_code'""" - user: User - """User for which the gift code was created""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - source: Literal[ChatBoostSourceType.GIFT_CODE] = ChatBoostSourceType.GIFT_CODE, - user: User, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(source=source, user=user, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/chat_boost_source_giveaway.py b/env/Lib/site-packages/aiogram/types/chat_boost_source_giveaway.py deleted file mode 100644 index dbb8150..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_boost_source_giveaway.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional - -from ..enums import ChatBoostSourceType -from .chat_boost_source import ChatBoostSource - -if TYPE_CHECKING: - from .user import User - - -class ChatBoostSourceGiveaway(ChatBoostSource): - """ - The boost was obtained by the creation of a Telegram Premium giveaway. This boosts the chat 4 times for the duration of the corresponding Telegram Premium subscription. - - Source: https://core.telegram.org/bots/api#chatboostsourcegiveaway - """ - - source: Literal[ChatBoostSourceType.GIVEAWAY] = ChatBoostSourceType.GIVEAWAY - """Source of the boost, always 'giveaway'""" - giveaway_message_id: int - """Identifier of a message in the chat with the giveaway; the message could have been deleted already. May be 0 if the message isn't sent yet.""" - user: Optional[User] = None - """*Optional*. User that won the prize in the giveaway if any""" - is_unclaimed: Optional[bool] = None - """*Optional*. True, if the giveaway was completed, but there was no user to win the prize""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - source: Literal[ChatBoostSourceType.GIVEAWAY] = ChatBoostSourceType.GIVEAWAY, - giveaway_message_id: int, - user: Optional[User] = None, - is_unclaimed: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - source=source, - giveaway_message_id=giveaway_message_id, - user=user, - is_unclaimed=is_unclaimed, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/chat_boost_source_premium.py b/env/Lib/site-packages/aiogram/types/chat_boost_source_premium.py deleted file mode 100644 index 97b47e6..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_boost_source_premium.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import ChatBoostSourceType -from .chat_boost_source import ChatBoostSource - -if TYPE_CHECKING: - from .user import User - - -class ChatBoostSourcePremium(ChatBoostSource): - """ - The boost was obtained by subscribing to Telegram Premium or by gifting a Telegram Premium subscription to another user. - - Source: https://core.telegram.org/bots/api#chatboostsourcepremium - """ - - source: Literal[ChatBoostSourceType.PREMIUM] = ChatBoostSourceType.PREMIUM - """Source of the boost, always 'premium'""" - user: User - """User that boosted the chat""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - source: Literal[ChatBoostSourceType.PREMIUM] = ChatBoostSourceType.PREMIUM, - user: User, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(source=source, user=user, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/chat_boost_updated.py b/env/Lib/site-packages/aiogram/types/chat_boost_updated.py deleted file mode 100644 index 0921c96..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_boost_updated.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - -if TYPE_CHECKING: - from .chat import Chat - from .chat_boost import ChatBoost - - -class ChatBoostUpdated(TelegramObject): - """ - This object represents a boost added to a chat or changed. - - Source: https://core.telegram.org/bots/api#chatboostupdated - """ - - chat: Chat - """Chat which was boosted""" - boost: ChatBoost - """Information about the chat boost""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, chat: Chat, boost: ChatBoost, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat=chat, boost=boost, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/chat_full_info.py b/env/Lib/site-packages/aiogram/types/chat_full_info.py deleted file mode 100644 index c639939..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_full_info.py +++ /dev/null @@ -1,225 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from .chat import Chat -from .custom import DateTime - -if TYPE_CHECKING: - from .birthdate import Birthdate - from .business_intro import BusinessIntro - from .business_location import BusinessLocation - from .business_opening_hours import BusinessOpeningHours - from .chat_location import ChatLocation - from .chat_permissions import ChatPermissions - from .chat_photo import ChatPhoto - from .message import Message - from .reaction_type_custom_emoji import ReactionTypeCustomEmoji - from .reaction_type_emoji import ReactionTypeEmoji - from .reaction_type_paid import ReactionTypePaid - - -class ChatFullInfo(Chat): - """ - This object contains full information about a chat. - - Source: https://core.telegram.org/bots/api#chatfullinfo - """ - - id: int - """Unique identifier for this chat. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this identifier.""" - type: str - """Type of the chat, can be either 'private', 'group', 'supergroup' or 'channel'""" - accent_color_id: int - """Identifier of the accent color for the chat name and backgrounds of the chat photo, reply header, and link preview. See `accent colors `_ for more details.""" - max_reaction_count: int - """The maximum number of reactions that can be set on a message in the chat""" - title: Optional[str] = None - """*Optional*. Title, for supergroups, channels and group chats""" - username: Optional[str] = None - """*Optional*. Username, for private chats, supergroups and channels if available""" - first_name: Optional[str] = None - """*Optional*. First name of the other party in a private chat""" - last_name: Optional[str] = None - """*Optional*. Last name of the other party in a private chat""" - is_forum: Optional[bool] = None - """*Optional*. :code:`True`, if the supergroup chat is a forum (has `topics `_ enabled)""" - photo: Optional[ChatPhoto] = None - """*Optional*. Chat photo""" - active_usernames: Optional[List[str]] = None - """*Optional*. If non-empty, the list of all `active chat usernames `_; for private chats, supergroups and channels""" - birthdate: Optional[Birthdate] = None - """*Optional*. For private chats, the date of birth of the user""" - business_intro: Optional[BusinessIntro] = None - """*Optional*. For private chats with business accounts, the intro of the business""" - business_location: Optional[BusinessLocation] = None - """*Optional*. For private chats with business accounts, the location of the business""" - business_opening_hours: Optional[BusinessOpeningHours] = None - """*Optional*. For private chats with business accounts, the opening hours of the business""" - personal_chat: Optional[Chat] = None - """*Optional*. For private chats, the personal channel of the user""" - available_reactions: Optional[ - List[Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid]] - ] = None - """*Optional*. List of available reactions allowed in the chat. If omitted, then all `emoji reactions `_ are allowed.""" - background_custom_emoji_id: Optional[str] = None - """*Optional*. Custom emoji identifier of the emoji chosen by the chat for the reply header and link preview background""" - profile_accent_color_id: Optional[int] = None - """*Optional*. Identifier of the accent color for the chat's profile background. See `profile accent colors `_ for more details.""" - profile_background_custom_emoji_id: Optional[str] = None - """*Optional*. Custom emoji identifier of the emoji chosen by the chat for its profile background""" - emoji_status_custom_emoji_id: Optional[str] = None - """*Optional*. Custom emoji identifier of the emoji status of the chat or the other party in a private chat""" - emoji_status_expiration_date: Optional[DateTime] = None - """*Optional*. Expiration date of the emoji status of the chat or the other party in a private chat, in Unix time, if any""" - bio: Optional[str] = None - """*Optional*. Bio of the other party in a private chat""" - has_private_forwards: Optional[bool] = None - """*Optional*. :code:`True`, if privacy settings of the other party in the private chat allows to use :code:`tg://user?id=` links only in chats with the user""" - has_restricted_voice_and_video_messages: Optional[bool] = None - """*Optional*. :code:`True`, if the privacy settings of the other party restrict sending voice and video note messages in the private chat""" - join_to_send_messages: Optional[bool] = None - """*Optional*. :code:`True`, if users need to join the supergroup before they can send messages""" - join_by_request: Optional[bool] = None - """*Optional*. :code:`True`, if all users directly joining the supergroup without using an invite link need to be approved by supergroup administrators""" - description: Optional[str] = None - """*Optional*. Description, for groups, supergroups and channel chats""" - invite_link: Optional[str] = None - """*Optional*. Primary invite link, for groups, supergroups and channel chats""" - pinned_message: Optional[Message] = None - """*Optional*. The most recent pinned message (by sending date)""" - permissions: Optional[ChatPermissions] = None - """*Optional*. Default chat member permissions, for groups and supergroups""" - can_send_paid_media: Optional[bool] = None - """*Optional*. :code:`True`, if paid media messages can be sent or forwarded to the channel chat. The field is available only for channel chats.""" - slow_mode_delay: Optional[int] = None - """*Optional*. For supergroups, the minimum allowed delay between consecutive messages sent by each unprivileged user; in seconds""" - unrestrict_boost_count: Optional[int] = None - """*Optional*. For supergroups, the minimum number of boosts that a non-administrator user needs to add in order to ignore slow mode and chat permissions""" - message_auto_delete_time: Optional[int] = None - """*Optional*. The time after which all messages sent to the chat will be automatically deleted; in seconds""" - has_aggressive_anti_spam_enabled: Optional[bool] = None - """*Optional*. :code:`True`, if aggressive anti-spam checks are enabled in the supergroup. The field is only available to chat administrators.""" - has_hidden_members: Optional[bool] = None - """*Optional*. :code:`True`, if non-administrators can only get the list of bots and administrators in the chat""" - has_protected_content: Optional[bool] = None - """*Optional*. :code:`True`, if messages from the chat can't be forwarded to other chats""" - has_visible_history: Optional[bool] = None - """*Optional*. :code:`True`, if new chat members will have access to old messages; available only to chat administrators""" - sticker_set_name: Optional[str] = None - """*Optional*. For supergroups, name of the group sticker set""" - can_set_sticker_set: Optional[bool] = None - """*Optional*. :code:`True`, if the bot can change the group sticker set""" - custom_emoji_sticker_set_name: Optional[str] = None - """*Optional*. For supergroups, the name of the group's custom emoji sticker set. Custom emoji from this set can be used by all users and bots in the group.""" - linked_chat_id: Optional[int] = None - """*Optional*. Unique identifier for the linked chat, i.e. the discussion group identifier for a channel and vice versa; for supergroups and channel chats. This identifier may be greater than 32 bits and some programming languages may have difficulty/silent defects in interpreting it. But it is smaller than 52 bits, so a signed 64 bit integer or double-precision float type are safe for storing this identifier.""" - location: Optional[ChatLocation] = None - """*Optional*. For supergroups, the location to which the supergroup is connected""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - id: int, - type: str, - accent_color_id: int, - max_reaction_count: int, - title: Optional[str] = None, - username: Optional[str] = None, - first_name: Optional[str] = None, - last_name: Optional[str] = None, - is_forum: Optional[bool] = None, - photo: Optional[ChatPhoto] = None, - active_usernames: Optional[List[str]] = None, - birthdate: Optional[Birthdate] = None, - business_intro: Optional[BusinessIntro] = None, - business_location: Optional[BusinessLocation] = None, - business_opening_hours: Optional[BusinessOpeningHours] = None, - personal_chat: Optional[Chat] = None, - available_reactions: Optional[ - List[Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid]] - ] = None, - background_custom_emoji_id: Optional[str] = None, - profile_accent_color_id: Optional[int] = None, - profile_background_custom_emoji_id: Optional[str] = None, - emoji_status_custom_emoji_id: Optional[str] = None, - emoji_status_expiration_date: Optional[DateTime] = None, - bio: Optional[str] = None, - has_private_forwards: Optional[bool] = None, - has_restricted_voice_and_video_messages: Optional[bool] = None, - join_to_send_messages: Optional[bool] = None, - join_by_request: Optional[bool] = None, - description: Optional[str] = None, - invite_link: Optional[str] = None, - pinned_message: Optional[Message] = None, - permissions: Optional[ChatPermissions] = None, - can_send_paid_media: Optional[bool] = None, - slow_mode_delay: Optional[int] = None, - unrestrict_boost_count: Optional[int] = None, - message_auto_delete_time: Optional[int] = None, - has_aggressive_anti_spam_enabled: Optional[bool] = None, - has_hidden_members: Optional[bool] = None, - has_protected_content: Optional[bool] = None, - has_visible_history: Optional[bool] = None, - sticker_set_name: Optional[str] = None, - can_set_sticker_set: Optional[bool] = None, - custom_emoji_sticker_set_name: Optional[str] = None, - linked_chat_id: Optional[int] = None, - location: Optional[ChatLocation] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - id=id, - type=type, - accent_color_id=accent_color_id, - max_reaction_count=max_reaction_count, - title=title, - username=username, - first_name=first_name, - last_name=last_name, - is_forum=is_forum, - photo=photo, - active_usernames=active_usernames, - birthdate=birthdate, - business_intro=business_intro, - business_location=business_location, - business_opening_hours=business_opening_hours, - personal_chat=personal_chat, - available_reactions=available_reactions, - background_custom_emoji_id=background_custom_emoji_id, - profile_accent_color_id=profile_accent_color_id, - profile_background_custom_emoji_id=profile_background_custom_emoji_id, - emoji_status_custom_emoji_id=emoji_status_custom_emoji_id, - emoji_status_expiration_date=emoji_status_expiration_date, - bio=bio, - has_private_forwards=has_private_forwards, - has_restricted_voice_and_video_messages=has_restricted_voice_and_video_messages, - join_to_send_messages=join_to_send_messages, - join_by_request=join_by_request, - description=description, - invite_link=invite_link, - pinned_message=pinned_message, - permissions=permissions, - can_send_paid_media=can_send_paid_media, - slow_mode_delay=slow_mode_delay, - unrestrict_boost_count=unrestrict_boost_count, - message_auto_delete_time=message_auto_delete_time, - has_aggressive_anti_spam_enabled=has_aggressive_anti_spam_enabled, - has_hidden_members=has_hidden_members, - has_protected_content=has_protected_content, - has_visible_history=has_visible_history, - sticker_set_name=sticker_set_name, - can_set_sticker_set=can_set_sticker_set, - custom_emoji_sticker_set_name=custom_emoji_sticker_set_name, - linked_chat_id=linked_chat_id, - location=location, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/chat_invite_link.py b/env/Lib/site-packages/aiogram/types/chat_invite_link.py deleted file mode 100644 index 7817c23..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_invite_link.py +++ /dev/null @@ -1,71 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject -from .custom import DateTime - -if TYPE_CHECKING: - from .user import User - - -class ChatInviteLink(TelegramObject): - """ - Represents an invite link for a chat. - - Source: https://core.telegram.org/bots/api#chatinvitelink - """ - - invite_link: str - """The invite link. If the link was created by another chat administrator, then the second part of the link will be replaced with '…'.""" - creator: User - """Creator of the link""" - creates_join_request: bool - """:code:`True`, if users joining the chat via the link need to be approved by chat administrators""" - is_primary: bool - """:code:`True`, if the link is primary""" - is_revoked: bool - """:code:`True`, if the link is revoked""" - name: Optional[str] = None - """*Optional*. Invite link name""" - expire_date: Optional[DateTime] = None - """*Optional*. Point in time (Unix timestamp) when the link will expire or has been expired""" - member_limit: Optional[int] = None - """*Optional*. The maximum number of users that can be members of the chat simultaneously after joining the chat via this invite link; 1-99999""" - pending_join_request_count: Optional[int] = None - """*Optional*. Number of pending join requests created using this link""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - invite_link: str, - creator: User, - creates_join_request: bool, - is_primary: bool, - is_revoked: bool, - name: Optional[str] = None, - expire_date: Optional[DateTime] = None, - member_limit: Optional[int] = None, - pending_join_request_count: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - invite_link=invite_link, - creator=creator, - creates_join_request=creates_join_request, - is_primary=is_primary, - is_revoked=is_revoked, - name=name, - expire_date=expire_date, - member_limit=member_limit, - pending_join_request_count=pending_join_request_count, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/chat_join_request.py b/env/Lib/site-packages/aiogram/types/chat_join_request.py deleted file mode 100644 index 4a128f1..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_join_request.py +++ /dev/null @@ -1,2702 +0,0 @@ -from __future__ import annotations - -import datetime -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from .base import TelegramObject -from .custom import DateTime - -if TYPE_CHECKING: - from ..methods import ( - ApproveChatJoinRequest, - DeclineChatJoinRequest, - SendAnimation, - SendAudio, - SendContact, - SendDice, - SendDocument, - SendGame, - SendInvoice, - SendLocation, - SendMediaGroup, - SendMessage, - SendPhoto, - SendPoll, - SendSticker, - SendVenue, - SendVideo, - SendVideoNote, - SendVoice, - ) - from .chat import Chat - from .chat_invite_link import ChatInviteLink - from .force_reply import ForceReply - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_file import InputFile - from .input_media_audio import InputMediaAudio - from .input_media_document import InputMediaDocument - from .input_media_photo import InputMediaPhoto - from .input_media_video import InputMediaVideo - from .input_poll_option import InputPollOption - from .labeled_price import LabeledPrice - from .link_preview_options import LinkPreviewOptions - from .message_entity import MessageEntity - from .reply_keyboard_markup import ReplyKeyboardMarkup - from .reply_keyboard_remove import ReplyKeyboardRemove - from .reply_parameters import ReplyParameters - from .user import User - - -class ChatJoinRequest(TelegramObject): - """ - Represents a join request sent to a chat. - - Source: https://core.telegram.org/bots/api#chatjoinrequest - """ - - chat: Chat - """Chat to which the request was sent""" - from_user: User = Field(..., alias="from") - """User that sent the join request""" - user_chat_id: int - """Identifier of a private chat with the user who sent the join request. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier. The bot can use this identifier for 5 minutes to send messages until the join request is processed, assuming no other administrator contacted the user.""" - date: DateTime - """Date the request was sent in Unix time""" - bio: Optional[str] = None - """*Optional*. Bio of the user.""" - invite_link: Optional[ChatInviteLink] = None - """*Optional*. Chat invite link that was used by the user to send the join request""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat: Chat, - from_user: User, - user_chat_id: int, - date: DateTime, - bio: Optional[str] = None, - invite_link: Optional[ChatInviteLink] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat=chat, - from_user=from_user, - user_chat_id=user_chat_id, - date=date, - bio=bio, - invite_link=invite_link, - **__pydantic_kwargs, - ) - - def approve( - self, - **kwargs: Any, - ) -> ApproveChatJoinRequest: - """ - Shortcut for method :class:`aiogram.methods.approve_chat_join_request.ApproveChatJoinRequest` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`user_id` - - Use this method to approve a chat join request. The bot must be an administrator in the chat for this to work and must have the *can_invite_users* administrator right. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#approvechatjoinrequest - - :return: instance of method :class:`aiogram.methods.approve_chat_join_request.ApproveChatJoinRequest` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import ApproveChatJoinRequest - - return ApproveChatJoinRequest( - chat_id=self.chat.id, - user_id=self.from_user.id, - **kwargs, - ).as_(self._bot) - - def decline( - self, - **kwargs: Any, - ) -> DeclineChatJoinRequest: - """ - Shortcut for method :class:`aiogram.methods.decline_chat_join_request.DeclineChatJoinRequest` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`user_id` - - Use this method to decline a chat join request. The bot must be an administrator in the chat for this to work and must have the *can_invite_users* administrator right. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#declinechatjoinrequest - - :return: instance of method :class:`aiogram.methods.decline_chat_join_request.DeclineChatJoinRequest` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import DeclineChatJoinRequest - - return DeclineChatJoinRequest( - chat_id=self.chat.id, - user_id=self.from_user.id, - **kwargs, - ).as_(self._bot) - - def answer( - self, - text: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - entities: Optional[List[MessageEntity]] = None, - link_preview_options: Optional[Union[LinkPreviewOptions, Default]] = Default( - "link_preview" - ), - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - disable_web_page_preview: Optional[Union[bool, Default]] = Default( - "link_preview_is_disabled" - ), - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendMessage: - """ - Shortcut for method :class:`aiogram.methods.send_message.SendMessage` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send text messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendmessage - - :param text: Text of the message to be sent, 1-4096 characters after entities parsing - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param parse_mode: Mode for parsing entities in the message text. See `formatting options `_ for more details. - :param entities: A JSON-serialized list of special entities that appear in message text, which can be specified instead of *parse_mode* - :param link_preview_options: Link preview generation options for the message - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param disable_web_page_preview: Disables link previews for links in this message - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_message.SendMessage` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendMessage - - return SendMessage( - chat_id=self.chat.id, - text=text, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - parse_mode=parse_mode, - entities=entities, - link_preview_options=link_preview_options, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - disable_web_page_preview=disable_web_page_preview, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_pm( - self, - text: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - entities: Optional[List[MessageEntity]] = None, - link_preview_options: Optional[Union[LinkPreviewOptions, Default]] = Default( - "link_preview" - ), - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - disable_web_page_preview: Optional[Union[bool, Default]] = Default( - "link_preview_is_disabled" - ), - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendMessage: - """ - Shortcut for method :class:`aiogram.methods.send_message.SendMessage` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send text messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendmessage - - :param text: Text of the message to be sent, 1-4096 characters after entities parsing - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param parse_mode: Mode for parsing entities in the message text. See `formatting options `_ for more details. - :param entities: A JSON-serialized list of special entities that appear in message text, which can be specified instead of *parse_mode* - :param link_preview_options: Link preview generation options for the message - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param disable_web_page_preview: Disables link previews for links in this message - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_message.SendMessage` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendMessage - - return SendMessage( - chat_id=self.user_chat_id, - text=text, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - parse_mode=parse_mode, - entities=entities, - link_preview_options=link_preview_options, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - disable_web_page_preview=disable_web_page_preview, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_animation( - self, - animation: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendAnimation: - """ - Shortcut for method :class:`aiogram.methods.send_animation.SendAnimation` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendanimation - - :param animation: Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param duration: Duration of sent animation in seconds - :param width: Animation width - :param height: Animation height - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Animation caption (may also be used when resending animation by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the animation caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the animation needs to be covered with a spoiler animation - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_animation.SendAnimation` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendAnimation - - return SendAnimation( - chat_id=self.chat.id, - animation=animation, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_animation_pm( - self, - animation: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendAnimation: - """ - Shortcut for method :class:`aiogram.methods.send_animation.SendAnimation` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendanimation - - :param animation: Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param duration: Duration of sent animation in seconds - :param width: Animation width - :param height: Animation height - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Animation caption (may also be used when resending animation by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the animation caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the animation needs to be covered with a spoiler animation - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_animation.SendAnimation` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendAnimation - - return SendAnimation( - chat_id=self.user_chat_id, - animation=animation, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_audio( - self, - audio: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendAudio: - """ - Shortcut for method :class:`aiogram.methods.send_audio.SendAudio` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future. - For sending voice messages, use the :class:`aiogram.methods.send_voice.SendVoice` method instead. - - Source: https://core.telegram.org/bots/api#sendaudio - - :param audio: Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: Audio caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the audio caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param duration: Duration of the audio in seconds - :param performer: Performer - :param title: Track name - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_audio.SendAudio` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendAudio - - return SendAudio( - chat_id=self.chat.id, - audio=audio, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - performer=performer, - title=title, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_audio_pm( - self, - audio: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendAudio: - """ - Shortcut for method :class:`aiogram.methods.send_audio.SendAudio` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future. - For sending voice messages, use the :class:`aiogram.methods.send_voice.SendVoice` method instead. - - Source: https://core.telegram.org/bots/api#sendaudio - - :param audio: Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: Audio caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the audio caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param duration: Duration of the audio in seconds - :param performer: Performer - :param title: Track name - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_audio.SendAudio` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendAudio - - return SendAudio( - chat_id=self.user_chat_id, - audio=audio, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - performer=performer, - title=title, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_contact( - self, - phone_number: str, - first_name: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - last_name: Optional[str] = None, - vcard: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendContact: - """ - Shortcut for method :class:`aiogram.methods.send_contact.SendContact` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send phone contacts. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendcontact - - :param phone_number: Contact's phone number - :param first_name: Contact's first name - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param last_name: Contact's last name - :param vcard: Additional data about the contact in the form of a `vCard `_, 0-2048 bytes - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_contact.SendContact` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendContact - - return SendContact( - chat_id=self.chat.id, - phone_number=phone_number, - first_name=first_name, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - last_name=last_name, - vcard=vcard, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_contact_pm( - self, - phone_number: str, - first_name: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - last_name: Optional[str] = None, - vcard: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendContact: - """ - Shortcut for method :class:`aiogram.methods.send_contact.SendContact` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send phone contacts. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendcontact - - :param phone_number: Contact's phone number - :param first_name: Contact's first name - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param last_name: Contact's last name - :param vcard: Additional data about the contact in the form of a `vCard `_, 0-2048 bytes - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_contact.SendContact` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendContact - - return SendContact( - chat_id=self.user_chat_id, - phone_number=phone_number, - first_name=first_name, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - last_name=last_name, - vcard=vcard, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_document( - self, - document: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - disable_content_type_detection: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendDocument: - """ - Shortcut for method :class:`aiogram.methods.send_document.SendDocument` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send general files. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#senddocument - - :param document: File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Document caption (may also be used when resending documents by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the document caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param disable_content_type_detection: Disables automatic server-side content type detection for files uploaded using multipart/form-data - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_document.SendDocument` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendDocument - - return SendDocument( - chat_id=self.chat.id, - document=document, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_content_type_detection=disable_content_type_detection, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_document_pm( - self, - document: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - disable_content_type_detection: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendDocument: - """ - Shortcut for method :class:`aiogram.methods.send_document.SendDocument` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send general files. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#senddocument - - :param document: File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Document caption (may also be used when resending documents by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the document caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param disable_content_type_detection: Disables automatic server-side content type detection for files uploaded using multipart/form-data - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_document.SendDocument` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendDocument - - return SendDocument( - chat_id=self.user_chat_id, - document=document, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_content_type_detection=disable_content_type_detection, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_game( - self, - game_short_name: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendGame: - """ - Shortcut for method :class:`aiogram.methods.send_game.SendGame` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send a game. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendgame - - :param game_short_name: Short name of the game, serves as the unique identifier for the game. Set up your games via `@BotFather `_. - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. If empty, one 'Play game_title' button will be shown. If not empty, the first button must launch the game. - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_game.SendGame` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendGame - - return SendGame( - chat_id=self.chat.id, - game_short_name=game_short_name, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_game_pm( - self, - game_short_name: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendGame: - """ - Shortcut for method :class:`aiogram.methods.send_game.SendGame` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send a game. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendgame - - :param game_short_name: Short name of the game, serves as the unique identifier for the game. Set up your games via `@BotFather `_. - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. If empty, one 'Play game_title' button will be shown. If not empty, the first button must launch the game. - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_game.SendGame` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendGame - - return SendGame( - chat_id=self.user_chat_id, - game_short_name=game_short_name, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_invoice( - self, - title: str, - description: str, - payload: str, - currency: str, - prices: List[LabeledPrice], - message_thread_id: Optional[int] = None, - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[List[int]] = None, - start_parameter: Optional[str] = None, - provider_data: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendInvoice: - """ - Shortcut for method :class:`aiogram.methods.send_invoice.SendInvoice` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send invoices. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendinvoice - - :param title: Product name, 1-32 characters - :param description: Product description, 1-255 characters - :param payload: Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes. - :param currency: Three-letter ISO 4217 currency code, see `more on currencies `_. Pass 'XTR' for payments in `Telegram Stars `_. - :param prices: Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in `Telegram Stars `_. - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param provider_token: Payment provider token, obtained via `@BotFather `_. Pass an empty string for payments in `Telegram Stars `_. - :param max_tip_amount: The maximum accepted amount for tips in the *smallest units* of the currency (integer, **not** float/double). For example, for a maximum tip of :code:`US$ 1.45` pass :code:`max_tip_amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in `Telegram Stars `_. - :param suggested_tip_amounts: A JSON-serialized array of suggested amounts of tips in the *smallest units* of the currency (integer, **not** float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed *max_tip_amount*. - :param start_parameter: Unique deep-linking parameter. If left empty, **forwarded copies** of the sent message will have a *Pay* button, allowing multiple users to pay directly from the forwarded message, using the same invoice. If non-empty, forwarded copies of the sent message will have a *URL* button with a deep link to the bot (instead of a *Pay* button), with the value used as the start parameter - :param provider_data: JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider. - :param photo_url: URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for. - :param photo_size: Photo size in bytes - :param photo_width: Photo width - :param photo_height: Photo height - :param need_name: Pass :code:`True` if you require the user's full name to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_phone_number: Pass :code:`True` if you require the user's phone number to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_email: Pass :code:`True` if you require the user's email address to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_shipping_address: Pass :code:`True` if you require the user's shipping address to complete the order. Ignored for payments in `Telegram Stars `_. - :param send_phone_number_to_provider: Pass :code:`True` if the user's phone number should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param send_email_to_provider: Pass :code:`True` if the user's email address should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param is_flexible: Pass :code:`True` if the final price depends on the shipping method. Ignored for payments in `Telegram Stars `_. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. If empty, one 'Pay :code:`total price`' button will be shown. If not empty, the first button must be a Pay button. - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_invoice.SendInvoice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendInvoice - - return SendInvoice( - chat_id=self.chat.id, - title=title, - description=description, - payload=payload, - currency=currency, - prices=prices, - message_thread_id=message_thread_id, - provider_token=provider_token, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - start_parameter=start_parameter, - provider_data=provider_data, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - is_flexible=is_flexible, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_invoice_pm( - self, - title: str, - description: str, - payload: str, - currency: str, - prices: List[LabeledPrice], - message_thread_id: Optional[int] = None, - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[List[int]] = None, - start_parameter: Optional[str] = None, - provider_data: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendInvoice: - """ - Shortcut for method :class:`aiogram.methods.send_invoice.SendInvoice` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send invoices. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendinvoice - - :param title: Product name, 1-32 characters - :param description: Product description, 1-255 characters - :param payload: Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes. - :param currency: Three-letter ISO 4217 currency code, see `more on currencies `_. Pass 'XTR' for payments in `Telegram Stars `_. - :param prices: Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in `Telegram Stars `_. - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param provider_token: Payment provider token, obtained via `@BotFather `_. Pass an empty string for payments in `Telegram Stars `_. - :param max_tip_amount: The maximum accepted amount for tips in the *smallest units* of the currency (integer, **not** float/double). For example, for a maximum tip of :code:`US$ 1.45` pass :code:`max_tip_amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in `Telegram Stars `_. - :param suggested_tip_amounts: A JSON-serialized array of suggested amounts of tips in the *smallest units* of the currency (integer, **not** float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed *max_tip_amount*. - :param start_parameter: Unique deep-linking parameter. If left empty, **forwarded copies** of the sent message will have a *Pay* button, allowing multiple users to pay directly from the forwarded message, using the same invoice. If non-empty, forwarded copies of the sent message will have a *URL* button with a deep link to the bot (instead of a *Pay* button), with the value used as the start parameter - :param provider_data: JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider. - :param photo_url: URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for. - :param photo_size: Photo size in bytes - :param photo_width: Photo width - :param photo_height: Photo height - :param need_name: Pass :code:`True` if you require the user's full name to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_phone_number: Pass :code:`True` if you require the user's phone number to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_email: Pass :code:`True` if you require the user's email address to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_shipping_address: Pass :code:`True` if you require the user's shipping address to complete the order. Ignored for payments in `Telegram Stars `_. - :param send_phone_number_to_provider: Pass :code:`True` if the user's phone number should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param send_email_to_provider: Pass :code:`True` if the user's email address should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param is_flexible: Pass :code:`True` if the final price depends on the shipping method. Ignored for payments in `Telegram Stars `_. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. If empty, one 'Pay :code:`total price`' button will be shown. If not empty, the first button must be a Pay button. - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_invoice.SendInvoice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendInvoice - - return SendInvoice( - chat_id=self.user_chat_id, - title=title, - description=description, - payload=payload, - currency=currency, - prices=prices, - message_thread_id=message_thread_id, - provider_token=provider_token, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - start_parameter=start_parameter, - provider_data=provider_data, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - is_flexible=is_flexible, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_location( - self, - latitude: float, - longitude: float, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - horizontal_accuracy: Optional[float] = None, - live_period: Optional[int] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendLocation: - """ - Shortcut for method :class:`aiogram.methods.send_location.SendLocation` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send point on the map. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendlocation - - :param latitude: Latitude of the location - :param longitude: Longitude of the location - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param horizontal_accuracy: The radius of uncertainty for the location, measured in meters; 0-1500 - :param live_period: Period in seconds during which the location will be updated (see `Live Locations `_, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely. - :param heading: For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified. - :param proximity_alert_radius: For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_location.SendLocation` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendLocation - - return SendLocation( - chat_id=self.chat.id, - latitude=latitude, - longitude=longitude, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - horizontal_accuracy=horizontal_accuracy, - live_period=live_period, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_location_pm( - self, - latitude: float, - longitude: float, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - horizontal_accuracy: Optional[float] = None, - live_period: Optional[int] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendLocation: - """ - Shortcut for method :class:`aiogram.methods.send_location.SendLocation` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send point on the map. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendlocation - - :param latitude: Latitude of the location - :param longitude: Longitude of the location - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param horizontal_accuracy: The radius of uncertainty for the location, measured in meters; 0-1500 - :param live_period: Period in seconds during which the location will be updated (see `Live Locations `_, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely. - :param heading: For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified. - :param proximity_alert_radius: For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_location.SendLocation` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendLocation - - return SendLocation( - chat_id=self.user_chat_id, - latitude=latitude, - longitude=longitude, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - horizontal_accuracy=horizontal_accuracy, - live_period=live_period, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_media_group( - self, - media: List[Union[InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo]], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendMediaGroup: - """ - Shortcut for method :class:`aiogram.methods.send_media_group.SendMediaGroup` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send a group of photos, videos, documents or audios as an album. Documents and audio files can be only grouped in an album with messages of the same type. On success, an array of `Messages `_ that were sent is returned. - - Source: https://core.telegram.org/bots/api#sendmediagroup - - :param media: A JSON-serialized array describing messages to be sent, must include 2-10 items - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param disable_notification: Sends messages `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent messages from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the messages are a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_media_group.SendMediaGroup` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendMediaGroup - - return SendMediaGroup( - chat_id=self.chat.id, - media=media, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_media_group_pm( - self, - media: List[Union[InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo]], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendMediaGroup: - """ - Shortcut for method :class:`aiogram.methods.send_media_group.SendMediaGroup` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send a group of photos, videos, documents or audios as an album. Documents and audio files can be only grouped in an album with messages of the same type. On success, an array of `Messages `_ that were sent is returned. - - Source: https://core.telegram.org/bots/api#sendmediagroup - - :param media: A JSON-serialized array describing messages to be sent, must include 2-10 items - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param disable_notification: Sends messages `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent messages from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the messages are a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_media_group.SendMediaGroup` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendMediaGroup - - return SendMediaGroup( - chat_id=self.user_chat_id, - media=media, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_photo( - self, - photo: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendPhoto: - """ - Shortcut for method :class:`aiogram.methods.send_photo.SendPhoto` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send photos. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendphoto - - :param photo: Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: Photo caption (may also be used when resending photos by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the photo caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the photo needs to be covered with a spoiler animation - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_photo.SendPhoto` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendPhoto - - return SendPhoto( - chat_id=self.chat.id, - photo=photo, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_photo_pm( - self, - photo: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendPhoto: - """ - Shortcut for method :class:`aiogram.methods.send_photo.SendPhoto` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send photos. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendphoto - - :param photo: Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: Photo caption (may also be used when resending photos by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the photo caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the photo needs to be covered with a spoiler animation - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_photo.SendPhoto` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendPhoto - - return SendPhoto( - chat_id=self.user_chat_id, - photo=photo, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_poll( - self, - question: str, - options: List[Union[InputPollOption, str]], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - question_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - question_entities: Optional[List[MessageEntity]] = None, - is_anonymous: Optional[bool] = None, - type: Optional[str] = None, - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[int] = None, - explanation: Optional[str] = None, - explanation_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - explanation_entities: Optional[List[MessageEntity]] = None, - open_period: Optional[int] = None, - close_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - is_closed: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendPoll: - """ - Shortcut for method :class:`aiogram.methods.send_poll.SendPoll` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send a native poll. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendpoll - - :param question: Poll question, 1-300 characters - :param options: A JSON-serialized list of 2-10 answer options - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param question_parse_mode: Mode for parsing entities in the question. See `formatting options `_ for more details. Currently, only custom emoji entities are allowed - :param question_entities: A JSON-serialized list of special entities that appear in the poll question. It can be specified instead of *question_parse_mode* - :param is_anonymous: :code:`True`, if the poll needs to be anonymous, defaults to :code:`True` - :param type: Poll type, 'quiz' or 'regular', defaults to 'regular' - :param allows_multiple_answers: :code:`True`, if the poll allows multiple answers, ignored for polls in quiz mode, defaults to :code:`False` - :param correct_option_id: 0-based identifier of the correct answer option, required for polls in quiz mode - :param explanation: Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters with at most 2 line feeds after entities parsing - :param explanation_parse_mode: Mode for parsing entities in the explanation. See `formatting options `_ for more details. - :param explanation_entities: A JSON-serialized list of special entities that appear in the poll explanation. It can be specified instead of *explanation_parse_mode* - :param open_period: Amount of time in seconds the poll will be active after creation, 5-600. Can't be used together with *close_date*. - :param close_date: Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 600 seconds in the future. Can't be used together with *open_period*. - :param is_closed: Pass :code:`True` if the poll needs to be immediately closed. This can be useful for poll preview. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_poll.SendPoll` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendPoll - - return SendPoll( - chat_id=self.chat.id, - question=question, - options=options, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - question_parse_mode=question_parse_mode, - question_entities=question_entities, - is_anonymous=is_anonymous, - type=type, - allows_multiple_answers=allows_multiple_answers, - correct_option_id=correct_option_id, - explanation=explanation, - explanation_parse_mode=explanation_parse_mode, - explanation_entities=explanation_entities, - open_period=open_period, - close_date=close_date, - is_closed=is_closed, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_poll_pm( - self, - question: str, - options: List[Union[InputPollOption, str]], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - question_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - question_entities: Optional[List[MessageEntity]] = None, - is_anonymous: Optional[bool] = None, - type: Optional[str] = None, - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[int] = None, - explanation: Optional[str] = None, - explanation_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - explanation_entities: Optional[List[MessageEntity]] = None, - open_period: Optional[int] = None, - close_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - is_closed: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendPoll: - """ - Shortcut for method :class:`aiogram.methods.send_poll.SendPoll` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send a native poll. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendpoll - - :param question: Poll question, 1-300 characters - :param options: A JSON-serialized list of 2-10 answer options - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param question_parse_mode: Mode for parsing entities in the question. See `formatting options `_ for more details. Currently, only custom emoji entities are allowed - :param question_entities: A JSON-serialized list of special entities that appear in the poll question. It can be specified instead of *question_parse_mode* - :param is_anonymous: :code:`True`, if the poll needs to be anonymous, defaults to :code:`True` - :param type: Poll type, 'quiz' or 'regular', defaults to 'regular' - :param allows_multiple_answers: :code:`True`, if the poll allows multiple answers, ignored for polls in quiz mode, defaults to :code:`False` - :param correct_option_id: 0-based identifier of the correct answer option, required for polls in quiz mode - :param explanation: Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters with at most 2 line feeds after entities parsing - :param explanation_parse_mode: Mode for parsing entities in the explanation. See `formatting options `_ for more details. - :param explanation_entities: A JSON-serialized list of special entities that appear in the poll explanation. It can be specified instead of *explanation_parse_mode* - :param open_period: Amount of time in seconds the poll will be active after creation, 5-600. Can't be used together with *close_date*. - :param close_date: Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 600 seconds in the future. Can't be used together with *open_period*. - :param is_closed: Pass :code:`True` if the poll needs to be immediately closed. This can be useful for poll preview. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_poll.SendPoll` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendPoll - - return SendPoll( - chat_id=self.user_chat_id, - question=question, - options=options, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - question_parse_mode=question_parse_mode, - question_entities=question_entities, - is_anonymous=is_anonymous, - type=type, - allows_multiple_answers=allows_multiple_answers, - correct_option_id=correct_option_id, - explanation=explanation, - explanation_parse_mode=explanation_parse_mode, - explanation_entities=explanation_entities, - open_period=open_period, - close_date=close_date, - is_closed=is_closed, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_dice( - self, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendDice: - """ - Shortcut for method :class:`aiogram.methods.send_dice.SendDice` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send an animated emoji that will display a random value. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#senddice - - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param emoji: Emoji on which the dice throw animation is based. Currently, must be one of '🎲', '🎯', '🏀', '⚽', '🎳', or '🎰'. Dice can have values 1-6 for '🎲', '🎯' and '🎳', values 1-5 for '🏀' and '⚽', and values 1-64 for '🎰'. Defaults to '🎲' - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_dice.SendDice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendDice - - return SendDice( - chat_id=self.chat.id, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_dice_pm( - self, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendDice: - """ - Shortcut for method :class:`aiogram.methods.send_dice.SendDice` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send an animated emoji that will display a random value. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#senddice - - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param emoji: Emoji on which the dice throw animation is based. Currently, must be one of '🎲', '🎯', '🏀', '⚽', '🎳', or '🎰'. Dice can have values 1-6 for '🎲', '🎯' and '🎳', values 1-5 for '🏀' and '⚽', and values 1-64 for '🎰'. Defaults to '🎲' - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_dice.SendDice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendDice - - return SendDice( - chat_id=self.user_chat_id, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_sticker( - self, - sticker: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendSticker: - """ - Shortcut for method :class:`aiogram.methods.send_sticker.SendSticker` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send static .WEBP, `animated `_ .TGS, or `video `_ .WEBM stickers. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendsticker - - :param sticker: Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. :ref:`More information on Sending Files » `. Video and animated stickers can't be sent via an HTTP URL. - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param emoji: Emoji associated with the sticker; only for just uploaded stickers - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_sticker.SendSticker` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendSticker - - return SendSticker( - chat_id=self.chat.id, - sticker=sticker, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_sticker_pm( - self, - sticker: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendSticker: - """ - Shortcut for method :class:`aiogram.methods.send_sticker.SendSticker` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send static .WEBP, `animated `_ .TGS, or `video `_ .WEBM stickers. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendsticker - - :param sticker: Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. :ref:`More information on Sending Files » `. Video and animated stickers can't be sent via an HTTP URL. - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param emoji: Emoji associated with the sticker; only for just uploaded stickers - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_sticker.SendSticker` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendSticker - - return SendSticker( - chat_id=self.user_chat_id, - sticker=sticker, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_venue( - self, - latitude: float, - longitude: float, - title: str, - address: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVenue: - """ - Shortcut for method :class:`aiogram.methods.send_venue.SendVenue` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send information about a venue. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvenue - - :param latitude: Latitude of the venue - :param longitude: Longitude of the venue - :param title: Name of the venue - :param address: Address of the venue - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param foursquare_id: Foursquare identifier of the venue - :param foursquare_type: Foursquare type of the venue, if known. (For example, 'arts_entertainment/default', 'arts_entertainment/aquarium' or 'food/icecream'.) - :param google_place_id: Google Places identifier of the venue - :param google_place_type: Google Places type of the venue. (See `supported types `_.) - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_venue.SendVenue` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVenue - - return SendVenue( - chat_id=self.chat.id, - latitude=latitude, - longitude=longitude, - title=title, - address=address, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - foursquare_id=foursquare_id, - foursquare_type=foursquare_type, - google_place_id=google_place_id, - google_place_type=google_place_type, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_venue_pm( - self, - latitude: float, - longitude: float, - title: str, - address: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVenue: - """ - Shortcut for method :class:`aiogram.methods.send_venue.SendVenue` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send information about a venue. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvenue - - :param latitude: Latitude of the venue - :param longitude: Longitude of the venue - :param title: Name of the venue - :param address: Address of the venue - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param foursquare_id: Foursquare identifier of the venue - :param foursquare_type: Foursquare type of the venue, if known. (For example, 'arts_entertainment/default', 'arts_entertainment/aquarium' or 'food/icecream'.) - :param google_place_id: Google Places identifier of the venue - :param google_place_type: Google Places type of the venue. (See `supported types `_.) - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_venue.SendVenue` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVenue - - return SendVenue( - chat_id=self.user_chat_id, - latitude=latitude, - longitude=longitude, - title=title, - address=address, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - foursquare_id=foursquare_id, - foursquare_type=foursquare_type, - google_place_id=google_place_id, - google_place_type=google_place_type, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_video( - self, - video: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - supports_streaming: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVideo: - """ - Shortcut for method :class:`aiogram.methods.send_video.SendVideo` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvideo - - :param video: Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param duration: Duration of sent video in seconds - :param width: Video width - :param height: Video height - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Video caption (may also be used when resending videos by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the video caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the video needs to be covered with a spoiler animation - :param supports_streaming: Pass :code:`True` if the uploaded video is suitable for streaming - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_video.SendVideo` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVideo - - return SendVideo( - chat_id=self.chat.id, - video=video, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - supports_streaming=supports_streaming, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_video_pm( - self, - video: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - supports_streaming: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVideo: - """ - Shortcut for method :class:`aiogram.methods.send_video.SendVideo` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvideo - - :param video: Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param duration: Duration of sent video in seconds - :param width: Video width - :param height: Video height - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Video caption (may also be used when resending videos by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the video caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the video needs to be covered with a spoiler animation - :param supports_streaming: Pass :code:`True` if the uploaded video is suitable for streaming - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_video.SendVideo` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVideo - - return SendVideo( - chat_id=self.user_chat_id, - video=video, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - supports_streaming=supports_streaming, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_video_note( - self, - video_note: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - length: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVideoNote: - """ - Shortcut for method :class:`aiogram.methods.send_video_note.SendVideoNote` - will automatically fill method attributes: - - - :code:`chat_id` - - As of `v.4.0 `_, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvideonote - - :param video_note: Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. :ref:`More information on Sending Files » `. Sending video notes by a URL is currently unsupported - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param duration: Duration of sent video in seconds - :param length: Video width and height, i.e. diameter of the video message - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_video_note.SendVideoNote` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVideoNote - - return SendVideoNote( - chat_id=self.chat.id, - video_note=video_note, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - length=length, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_video_note_pm( - self, - video_note: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - length: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVideoNote: - """ - Shortcut for method :class:`aiogram.methods.send_video_note.SendVideoNote` - will automatically fill method attributes: - - - :code:`chat_id` - - As of `v.4.0 `_, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvideonote - - :param video_note: Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. :ref:`More information on Sending Files » `. Sending video notes by a URL is currently unsupported - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param duration: Duration of sent video in seconds - :param length: Video width and height, i.e. diameter of the video message - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_video_note.SendVideoNote` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVideoNote - - return SendVideoNote( - chat_id=self.user_chat_id, - video_note=video_note, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - length=length, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_voice( - self, - voice: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVoice: - """ - Shortcut for method :class:`aiogram.methods.send_voice.SendVoice` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as :class:`aiogram.types.audio.Audio` or :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvoice - - :param voice: Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: Voice message caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the voice message caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param duration: Duration of the voice message in seconds - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_voice.SendVoice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVoice - - return SendVoice( - chat_id=self.chat.id, - voice=voice, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_voice_pm( - self, - voice: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVoice: - """ - Shortcut for method :class:`aiogram.methods.send_voice.SendVoice` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as :class:`aiogram.types.audio.Audio` or :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvoice - - :param voice: Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: Voice message caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the voice message caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param duration: Duration of the voice message in seconds - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_voice.SendVoice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVoice - - return SendVoice( - chat_id=self.user_chat_id, - voice=voice, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) diff --git a/env/Lib/site-packages/aiogram/types/chat_location.py b/env/Lib/site-packages/aiogram/types/chat_location.py deleted file mode 100644 index ad64a3c..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_location.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - -if TYPE_CHECKING: - from .location import Location - - -class ChatLocation(TelegramObject): - """ - Represents a location to which a chat is connected. - - Source: https://core.telegram.org/bots/api#chatlocation - """ - - location: Location - """The location to which the supergroup is connected. Can't be a live location.""" - address: str - """Location address; 1-64 characters, as defined by the chat owner""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, location: Location, address: str, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(location=location, address=address, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/chat_member.py b/env/Lib/site-packages/aiogram/types/chat_member.py deleted file mode 100644 index 018bebd..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_member.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import annotations - -from .base import TelegramObject - - -class ChatMember(TelegramObject): - """ - This object contains information about one member of a chat. Currently, the following 6 types of chat members are supported: - - - :class:`aiogram.types.chat_member_owner.ChatMemberOwner` - - :class:`aiogram.types.chat_member_administrator.ChatMemberAdministrator` - - :class:`aiogram.types.chat_member_member.ChatMemberMember` - - :class:`aiogram.types.chat_member_restricted.ChatMemberRestricted` - - :class:`aiogram.types.chat_member_left.ChatMemberLeft` - - :class:`aiogram.types.chat_member_banned.ChatMemberBanned` - - Source: https://core.telegram.org/bots/api#chatmember - """ diff --git a/env/Lib/site-packages/aiogram/types/chat_member_administrator.py b/env/Lib/site-packages/aiogram/types/chat_member_administrator.py deleted file mode 100644 index 10552f7..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_member_administrator.py +++ /dev/null @@ -1,111 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional - -from ..enums import ChatMemberStatus -from .chat_member import ChatMember - -if TYPE_CHECKING: - from .user import User - - -class ChatMemberAdministrator(ChatMember): - """ - Represents a `chat member `_ that has some additional privileges. - - Source: https://core.telegram.org/bots/api#chatmemberadministrator - """ - - status: Literal[ChatMemberStatus.ADMINISTRATOR] = ChatMemberStatus.ADMINISTRATOR - """The member's status in the chat, always 'administrator'""" - user: User - """Information about the user""" - can_be_edited: bool - """:code:`True`, if the bot is allowed to edit administrator privileges of that user""" - is_anonymous: bool - """:code:`True`, if the user's presence in the chat is hidden""" - can_manage_chat: bool - """:code:`True`, if the administrator can access the chat event log, get boost list, see hidden supergroup and channel members, report spam messages and ignore slow mode. Implied by any other administrator privilege.""" - can_delete_messages: bool - """:code:`True`, if the administrator can delete messages of other users""" - can_manage_video_chats: bool - """:code:`True`, if the administrator can manage video chats""" - can_restrict_members: bool - """:code:`True`, if the administrator can restrict, ban or unban chat members, or access supergroup statistics""" - can_promote_members: bool - """:code:`True`, if the administrator can add new administrators with a subset of their own privileges or demote administrators that they have promoted, directly or indirectly (promoted by administrators that were appointed by the user)""" - can_change_info: bool - """:code:`True`, if the user is allowed to change the chat title, photo and other settings""" - can_invite_users: bool - """:code:`True`, if the user is allowed to invite new users to the chat""" - can_post_stories: bool - """:code:`True`, if the administrator can post stories to the chat""" - can_edit_stories: bool - """:code:`True`, if the administrator can edit stories posted by other users, post stories to the chat page, pin chat stories, and access the chat's story archive""" - can_delete_stories: bool - """:code:`True`, if the administrator can delete stories posted by other users""" - can_post_messages: Optional[bool] = None - """*Optional*. :code:`True`, if the administrator can post messages in the channel, or access channel statistics; for channels only""" - can_edit_messages: Optional[bool] = None - """*Optional*. :code:`True`, if the administrator can edit messages of other users and can pin messages; for channels only""" - can_pin_messages: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to pin messages; for groups and supergroups only""" - can_manage_topics: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only""" - custom_title: Optional[str] = None - """*Optional*. Custom title for this user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - status: Literal[ChatMemberStatus.ADMINISTRATOR] = ChatMemberStatus.ADMINISTRATOR, - user: User, - can_be_edited: bool, - is_anonymous: bool, - can_manage_chat: bool, - can_delete_messages: bool, - can_manage_video_chats: bool, - can_restrict_members: bool, - can_promote_members: bool, - can_change_info: bool, - can_invite_users: bool, - can_post_stories: bool, - can_edit_stories: bool, - can_delete_stories: bool, - can_post_messages: Optional[bool] = None, - can_edit_messages: Optional[bool] = None, - can_pin_messages: Optional[bool] = None, - can_manage_topics: Optional[bool] = None, - custom_title: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - status=status, - user=user, - can_be_edited=can_be_edited, - is_anonymous=is_anonymous, - can_manage_chat=can_manage_chat, - can_delete_messages=can_delete_messages, - can_manage_video_chats=can_manage_video_chats, - can_restrict_members=can_restrict_members, - can_promote_members=can_promote_members, - can_change_info=can_change_info, - can_invite_users=can_invite_users, - can_post_stories=can_post_stories, - can_edit_stories=can_edit_stories, - can_delete_stories=can_delete_stories, - can_post_messages=can_post_messages, - can_edit_messages=can_edit_messages, - can_pin_messages=can_pin_messages, - can_manage_topics=can_manage_topics, - custom_title=custom_title, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/chat_member_banned.py b/env/Lib/site-packages/aiogram/types/chat_member_banned.py deleted file mode 100644 index 65776c5..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_member_banned.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import ChatMemberStatus -from .chat_member import ChatMember -from .custom import DateTime - -if TYPE_CHECKING: - from .user import User - - -class ChatMemberBanned(ChatMember): - """ - Represents a `chat member `_ that was banned in the chat and can't return to the chat or view chat messages. - - Source: https://core.telegram.org/bots/api#chatmemberbanned - """ - - status: Literal[ChatMemberStatus.KICKED] = ChatMemberStatus.KICKED - """The member's status in the chat, always 'kicked'""" - user: User - """Information about the user""" - until_date: DateTime - """Date when restrictions will be lifted for this user; Unix time. If 0, then the user is banned forever""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - status: Literal[ChatMemberStatus.KICKED] = ChatMemberStatus.KICKED, - user: User, - until_date: DateTime, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(status=status, user=user, until_date=until_date, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/chat_member_left.py b/env/Lib/site-packages/aiogram/types/chat_member_left.py deleted file mode 100644 index 3870d17..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_member_left.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import ChatMemberStatus -from .chat_member import ChatMember - -if TYPE_CHECKING: - from .user import User - - -class ChatMemberLeft(ChatMember): - """ - Represents a `chat member `_ that isn't currently a member of the chat, but may join it themselves. - - Source: https://core.telegram.org/bots/api#chatmemberleft - """ - - status: Literal[ChatMemberStatus.LEFT] = ChatMemberStatus.LEFT - """The member's status in the chat, always 'left'""" - user: User - """Information about the user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - status: Literal[ChatMemberStatus.LEFT] = ChatMemberStatus.LEFT, - user: User, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(status=status, user=user, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/chat_member_member.py b/env/Lib/site-packages/aiogram/types/chat_member_member.py deleted file mode 100644 index 12ef33e..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_member_member.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional - -from ..enums import ChatMemberStatus -from .chat_member import ChatMember -from .custom import DateTime - -if TYPE_CHECKING: - from .user import User - - -class ChatMemberMember(ChatMember): - """ - Represents a `chat member `_ that has no additional privileges or restrictions. - - Source: https://core.telegram.org/bots/api#chatmembermember - """ - - status: Literal[ChatMemberStatus.MEMBER] = ChatMemberStatus.MEMBER - """The member's status in the chat, always 'member'""" - user: User - """Information about the user""" - until_date: Optional[DateTime] = None - """*Optional*. Date when the user's subscription will expire; Unix time""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - status: Literal[ChatMemberStatus.MEMBER] = ChatMemberStatus.MEMBER, - user: User, - until_date: Optional[DateTime] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(status=status, user=user, until_date=until_date, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/chat_member_owner.py b/env/Lib/site-packages/aiogram/types/chat_member_owner.py deleted file mode 100644 index 1429435..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_member_owner.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional - -from ..enums import ChatMemberStatus -from .chat_member import ChatMember - -if TYPE_CHECKING: - from .user import User - - -class ChatMemberOwner(ChatMember): - """ - Represents a `chat member `_ that owns the chat and has all administrator privileges. - - Source: https://core.telegram.org/bots/api#chatmemberowner - """ - - status: Literal[ChatMemberStatus.CREATOR] = ChatMemberStatus.CREATOR - """The member's status in the chat, always 'creator'""" - user: User - """Information about the user""" - is_anonymous: bool - """:code:`True`, if the user's presence in the chat is hidden""" - custom_title: Optional[str] = None - """*Optional*. Custom title for this user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - status: Literal[ChatMemberStatus.CREATOR] = ChatMemberStatus.CREATOR, - user: User, - is_anonymous: bool, - custom_title: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - status=status, - user=user, - is_anonymous=is_anonymous, - custom_title=custom_title, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/chat_member_restricted.py b/env/Lib/site-packages/aiogram/types/chat_member_restricted.py deleted file mode 100644 index edda75e..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_member_restricted.py +++ /dev/null @@ -1,108 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import ChatMemberStatus -from .chat_member import ChatMember -from .custom import DateTime - -if TYPE_CHECKING: - from .user import User - - -class ChatMemberRestricted(ChatMember): - """ - Represents a `chat member `_ that is under certain restrictions in the chat. Supergroups only. - - Source: https://core.telegram.org/bots/api#chatmemberrestricted - """ - - status: Literal[ChatMemberStatus.RESTRICTED] = ChatMemberStatus.RESTRICTED - """The member's status in the chat, always 'restricted'""" - user: User - """Information about the user""" - is_member: bool - """:code:`True`, if the user is a member of the chat at the moment of the request""" - can_send_messages: bool - """:code:`True`, if the user is allowed to send text messages, contacts, giveaways, giveaway winners, invoices, locations and venues""" - can_send_audios: bool - """:code:`True`, if the user is allowed to send audios""" - can_send_documents: bool - """:code:`True`, if the user is allowed to send documents""" - can_send_photos: bool - """:code:`True`, if the user is allowed to send photos""" - can_send_videos: bool - """:code:`True`, if the user is allowed to send videos""" - can_send_video_notes: bool - """:code:`True`, if the user is allowed to send video notes""" - can_send_voice_notes: bool - """:code:`True`, if the user is allowed to send voice notes""" - can_send_polls: bool - """:code:`True`, if the user is allowed to send polls""" - can_send_other_messages: bool - """:code:`True`, if the user is allowed to send animations, games, stickers and use inline bots""" - can_add_web_page_previews: bool - """:code:`True`, if the user is allowed to add web page previews to their messages""" - can_change_info: bool - """:code:`True`, if the user is allowed to change the chat title, photo and other settings""" - can_invite_users: bool - """:code:`True`, if the user is allowed to invite new users to the chat""" - can_pin_messages: bool - """:code:`True`, if the user is allowed to pin messages""" - can_manage_topics: bool - """:code:`True`, if the user is allowed to create forum topics""" - until_date: DateTime - """Date when restrictions will be lifted for this user; Unix time. If 0, then the user is restricted forever""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - status: Literal[ChatMemberStatus.RESTRICTED] = ChatMemberStatus.RESTRICTED, - user: User, - is_member: bool, - can_send_messages: bool, - can_send_audios: bool, - can_send_documents: bool, - can_send_photos: bool, - can_send_videos: bool, - can_send_video_notes: bool, - can_send_voice_notes: bool, - can_send_polls: bool, - can_send_other_messages: bool, - can_add_web_page_previews: bool, - can_change_info: bool, - can_invite_users: bool, - can_pin_messages: bool, - can_manage_topics: bool, - until_date: DateTime, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - status=status, - user=user, - is_member=is_member, - can_send_messages=can_send_messages, - can_send_audios=can_send_audios, - can_send_documents=can_send_documents, - can_send_photos=can_send_photos, - can_send_videos=can_send_videos, - can_send_video_notes=can_send_video_notes, - can_send_voice_notes=can_send_voice_notes, - can_send_polls=can_send_polls, - can_send_other_messages=can_send_other_messages, - can_add_web_page_previews=can_add_web_page_previews, - can_change_info=can_change_info, - can_invite_users=can_invite_users, - can_pin_messages=can_pin_messages, - can_manage_topics=can_manage_topics, - until_date=until_date, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/chat_member_updated.py b/env/Lib/site-packages/aiogram/types/chat_member_updated.py deleted file mode 100644 index 48c3e9d..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_member_updated.py +++ /dev/null @@ -1,1413 +0,0 @@ -from __future__ import annotations - -import datetime -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from .base import TelegramObject -from .custom import DateTime - -if TYPE_CHECKING: - from ..methods import ( - SendAnimation, - SendAudio, - SendContact, - SendDice, - SendDocument, - SendGame, - SendInvoice, - SendLocation, - SendMediaGroup, - SendMessage, - SendPhoto, - SendPoll, - SendSticker, - SendVenue, - SendVideo, - SendVideoNote, - SendVoice, - ) - from .chat import Chat - from .chat_invite_link import ChatInviteLink - from .chat_member_administrator import ChatMemberAdministrator - from .chat_member_banned import ChatMemberBanned - from .chat_member_left import ChatMemberLeft - from .chat_member_member import ChatMemberMember - from .chat_member_owner import ChatMemberOwner - from .chat_member_restricted import ChatMemberRestricted - from .force_reply import ForceReply - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_file import InputFile - from .input_media_audio import InputMediaAudio - from .input_media_document import InputMediaDocument - from .input_media_photo import InputMediaPhoto - from .input_media_video import InputMediaVideo - from .input_poll_option import InputPollOption - from .labeled_price import LabeledPrice - from .link_preview_options import LinkPreviewOptions - from .message_entity import MessageEntity - from .reply_keyboard_markup import ReplyKeyboardMarkup - from .reply_keyboard_remove import ReplyKeyboardRemove - from .reply_parameters import ReplyParameters - from .user import User - - -class ChatMemberUpdated(TelegramObject): - """ - This object represents changes in the status of a chat member. - - Source: https://core.telegram.org/bots/api#chatmemberupdated - """ - - chat: Chat - """Chat the user belongs to""" - from_user: User = Field(..., alias="from") - """Performer of the action, which resulted in the change""" - date: DateTime - """Date the change was done in Unix time""" - old_chat_member: Union[ - ChatMemberOwner, - ChatMemberAdministrator, - ChatMemberMember, - ChatMemberRestricted, - ChatMemberLeft, - ChatMemberBanned, - ] - """Previous information about the chat member""" - new_chat_member: Union[ - ChatMemberOwner, - ChatMemberAdministrator, - ChatMemberMember, - ChatMemberRestricted, - ChatMemberLeft, - ChatMemberBanned, - ] - """New information about the chat member""" - invite_link: Optional[ChatInviteLink] = None - """*Optional*. Chat invite link, which was used by the user to join the chat; for joining by invite link events only.""" - via_join_request: Optional[bool] = None - """*Optional*. True, if the user joined the chat after sending a direct join request without using an invite link and being approved by an administrator""" - via_chat_folder_invite_link: Optional[bool] = None - """*Optional*. True, if the user joined the chat via a chat folder invite link""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat: Chat, - from_user: User, - date: DateTime, - old_chat_member: Union[ - ChatMemberOwner, - ChatMemberAdministrator, - ChatMemberMember, - ChatMemberRestricted, - ChatMemberLeft, - ChatMemberBanned, - ], - new_chat_member: Union[ - ChatMemberOwner, - ChatMemberAdministrator, - ChatMemberMember, - ChatMemberRestricted, - ChatMemberLeft, - ChatMemberBanned, - ], - invite_link: Optional[ChatInviteLink] = None, - via_join_request: Optional[bool] = None, - via_chat_folder_invite_link: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat=chat, - from_user=from_user, - date=date, - old_chat_member=old_chat_member, - new_chat_member=new_chat_member, - invite_link=invite_link, - via_join_request=via_join_request, - via_chat_folder_invite_link=via_chat_folder_invite_link, - **__pydantic_kwargs, - ) - - def answer( - self, - text: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - entities: Optional[List[MessageEntity]] = None, - link_preview_options: Optional[Union[LinkPreviewOptions, Default]] = Default( - "link_preview" - ), - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - disable_web_page_preview: Optional[Union[bool, Default]] = Default( - "link_preview_is_disabled" - ), - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendMessage: - """ - Shortcut for method :class:`aiogram.methods.send_message.SendMessage` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send text messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendmessage - - :param text: Text of the message to be sent, 1-4096 characters after entities parsing - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param parse_mode: Mode for parsing entities in the message text. See `formatting options `_ for more details. - :param entities: A JSON-serialized list of special entities that appear in message text, which can be specified instead of *parse_mode* - :param link_preview_options: Link preview generation options for the message - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param disable_web_page_preview: Disables link previews for links in this message - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_message.SendMessage` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendMessage - - return SendMessage( - chat_id=self.chat.id, - text=text, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - parse_mode=parse_mode, - entities=entities, - link_preview_options=link_preview_options, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - disable_web_page_preview=disable_web_page_preview, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_animation( - self, - animation: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendAnimation: - """ - Shortcut for method :class:`aiogram.methods.send_animation.SendAnimation` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendanimation - - :param animation: Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param duration: Duration of sent animation in seconds - :param width: Animation width - :param height: Animation height - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Animation caption (may also be used when resending animation by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the animation caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the animation needs to be covered with a spoiler animation - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_animation.SendAnimation` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendAnimation - - return SendAnimation( - chat_id=self.chat.id, - animation=animation, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_audio( - self, - audio: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendAudio: - """ - Shortcut for method :class:`aiogram.methods.send_audio.SendAudio` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future. - For sending voice messages, use the :class:`aiogram.methods.send_voice.SendVoice` method instead. - - Source: https://core.telegram.org/bots/api#sendaudio - - :param audio: Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: Audio caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the audio caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param duration: Duration of the audio in seconds - :param performer: Performer - :param title: Track name - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_audio.SendAudio` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendAudio - - return SendAudio( - chat_id=self.chat.id, - audio=audio, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - performer=performer, - title=title, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_contact( - self, - phone_number: str, - first_name: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - last_name: Optional[str] = None, - vcard: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendContact: - """ - Shortcut for method :class:`aiogram.methods.send_contact.SendContact` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send phone contacts. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendcontact - - :param phone_number: Contact's phone number - :param first_name: Contact's first name - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param last_name: Contact's last name - :param vcard: Additional data about the contact in the form of a `vCard `_, 0-2048 bytes - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_contact.SendContact` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendContact - - return SendContact( - chat_id=self.chat.id, - phone_number=phone_number, - first_name=first_name, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - last_name=last_name, - vcard=vcard, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_document( - self, - document: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - disable_content_type_detection: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendDocument: - """ - Shortcut for method :class:`aiogram.methods.send_document.SendDocument` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send general files. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#senddocument - - :param document: File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Document caption (may also be used when resending documents by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the document caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param disable_content_type_detection: Disables automatic server-side content type detection for files uploaded using multipart/form-data - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_document.SendDocument` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendDocument - - return SendDocument( - chat_id=self.chat.id, - document=document, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_content_type_detection=disable_content_type_detection, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_game( - self, - game_short_name: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendGame: - """ - Shortcut for method :class:`aiogram.methods.send_game.SendGame` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send a game. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendgame - - :param game_short_name: Short name of the game, serves as the unique identifier for the game. Set up your games via `@BotFather `_. - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. If empty, one 'Play game_title' button will be shown. If not empty, the first button must launch the game. - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_game.SendGame` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendGame - - return SendGame( - chat_id=self.chat.id, - game_short_name=game_short_name, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_invoice( - self, - title: str, - description: str, - payload: str, - currency: str, - prices: List[LabeledPrice], - message_thread_id: Optional[int] = None, - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[List[int]] = None, - start_parameter: Optional[str] = None, - provider_data: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendInvoice: - """ - Shortcut for method :class:`aiogram.methods.send_invoice.SendInvoice` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send invoices. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendinvoice - - :param title: Product name, 1-32 characters - :param description: Product description, 1-255 characters - :param payload: Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes. - :param currency: Three-letter ISO 4217 currency code, see `more on currencies `_. Pass 'XTR' for payments in `Telegram Stars `_. - :param prices: Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in `Telegram Stars `_. - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param provider_token: Payment provider token, obtained via `@BotFather `_. Pass an empty string for payments in `Telegram Stars `_. - :param max_tip_amount: The maximum accepted amount for tips in the *smallest units* of the currency (integer, **not** float/double). For example, for a maximum tip of :code:`US$ 1.45` pass :code:`max_tip_amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in `Telegram Stars `_. - :param suggested_tip_amounts: A JSON-serialized array of suggested amounts of tips in the *smallest units* of the currency (integer, **not** float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed *max_tip_amount*. - :param start_parameter: Unique deep-linking parameter. If left empty, **forwarded copies** of the sent message will have a *Pay* button, allowing multiple users to pay directly from the forwarded message, using the same invoice. If non-empty, forwarded copies of the sent message will have a *URL* button with a deep link to the bot (instead of a *Pay* button), with the value used as the start parameter - :param provider_data: JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider. - :param photo_url: URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for. - :param photo_size: Photo size in bytes - :param photo_width: Photo width - :param photo_height: Photo height - :param need_name: Pass :code:`True` if you require the user's full name to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_phone_number: Pass :code:`True` if you require the user's phone number to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_email: Pass :code:`True` if you require the user's email address to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_shipping_address: Pass :code:`True` if you require the user's shipping address to complete the order. Ignored for payments in `Telegram Stars `_. - :param send_phone_number_to_provider: Pass :code:`True` if the user's phone number should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param send_email_to_provider: Pass :code:`True` if the user's email address should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param is_flexible: Pass :code:`True` if the final price depends on the shipping method. Ignored for payments in `Telegram Stars `_. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. If empty, one 'Pay :code:`total price`' button will be shown. If not empty, the first button must be a Pay button. - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_invoice.SendInvoice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendInvoice - - return SendInvoice( - chat_id=self.chat.id, - title=title, - description=description, - payload=payload, - currency=currency, - prices=prices, - message_thread_id=message_thread_id, - provider_token=provider_token, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - start_parameter=start_parameter, - provider_data=provider_data, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - is_flexible=is_flexible, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_location( - self, - latitude: float, - longitude: float, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - horizontal_accuracy: Optional[float] = None, - live_period: Optional[int] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendLocation: - """ - Shortcut for method :class:`aiogram.methods.send_location.SendLocation` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send point on the map. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendlocation - - :param latitude: Latitude of the location - :param longitude: Longitude of the location - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param horizontal_accuracy: The radius of uncertainty for the location, measured in meters; 0-1500 - :param live_period: Period in seconds during which the location will be updated (see `Live Locations `_, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely. - :param heading: For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified. - :param proximity_alert_radius: For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_location.SendLocation` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendLocation - - return SendLocation( - chat_id=self.chat.id, - latitude=latitude, - longitude=longitude, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - horizontal_accuracy=horizontal_accuracy, - live_period=live_period, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_media_group( - self, - media: List[Union[InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo]], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendMediaGroup: - """ - Shortcut for method :class:`aiogram.methods.send_media_group.SendMediaGroup` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send a group of photos, videos, documents or audios as an album. Documents and audio files can be only grouped in an album with messages of the same type. On success, an array of `Messages `_ that were sent is returned. - - Source: https://core.telegram.org/bots/api#sendmediagroup - - :param media: A JSON-serialized array describing messages to be sent, must include 2-10 items - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param disable_notification: Sends messages `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent messages from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the messages are a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_media_group.SendMediaGroup` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendMediaGroup - - return SendMediaGroup( - chat_id=self.chat.id, - media=media, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_photo( - self, - photo: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendPhoto: - """ - Shortcut for method :class:`aiogram.methods.send_photo.SendPhoto` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send photos. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendphoto - - :param photo: Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: Photo caption (may also be used when resending photos by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the photo caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the photo needs to be covered with a spoiler animation - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_photo.SendPhoto` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendPhoto - - return SendPhoto( - chat_id=self.chat.id, - photo=photo, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_poll( - self, - question: str, - options: List[Union[InputPollOption, str]], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - question_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - question_entities: Optional[List[MessageEntity]] = None, - is_anonymous: Optional[bool] = None, - type: Optional[str] = None, - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[int] = None, - explanation: Optional[str] = None, - explanation_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - explanation_entities: Optional[List[MessageEntity]] = None, - open_period: Optional[int] = None, - close_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - is_closed: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendPoll: - """ - Shortcut for method :class:`aiogram.methods.send_poll.SendPoll` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send a native poll. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendpoll - - :param question: Poll question, 1-300 characters - :param options: A JSON-serialized list of 2-10 answer options - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param question_parse_mode: Mode for parsing entities in the question. See `formatting options `_ for more details. Currently, only custom emoji entities are allowed - :param question_entities: A JSON-serialized list of special entities that appear in the poll question. It can be specified instead of *question_parse_mode* - :param is_anonymous: :code:`True`, if the poll needs to be anonymous, defaults to :code:`True` - :param type: Poll type, 'quiz' or 'regular', defaults to 'regular' - :param allows_multiple_answers: :code:`True`, if the poll allows multiple answers, ignored for polls in quiz mode, defaults to :code:`False` - :param correct_option_id: 0-based identifier of the correct answer option, required for polls in quiz mode - :param explanation: Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters with at most 2 line feeds after entities parsing - :param explanation_parse_mode: Mode for parsing entities in the explanation. See `formatting options `_ for more details. - :param explanation_entities: A JSON-serialized list of special entities that appear in the poll explanation. It can be specified instead of *explanation_parse_mode* - :param open_period: Amount of time in seconds the poll will be active after creation, 5-600. Can't be used together with *close_date*. - :param close_date: Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 600 seconds in the future. Can't be used together with *open_period*. - :param is_closed: Pass :code:`True` if the poll needs to be immediately closed. This can be useful for poll preview. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_poll.SendPoll` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendPoll - - return SendPoll( - chat_id=self.chat.id, - question=question, - options=options, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - question_parse_mode=question_parse_mode, - question_entities=question_entities, - is_anonymous=is_anonymous, - type=type, - allows_multiple_answers=allows_multiple_answers, - correct_option_id=correct_option_id, - explanation=explanation, - explanation_parse_mode=explanation_parse_mode, - explanation_entities=explanation_entities, - open_period=open_period, - close_date=close_date, - is_closed=is_closed, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_dice( - self, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendDice: - """ - Shortcut for method :class:`aiogram.methods.send_dice.SendDice` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send an animated emoji that will display a random value. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#senddice - - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param emoji: Emoji on which the dice throw animation is based. Currently, must be one of '🎲', '🎯', '🏀', '⚽', '🎳', or '🎰'. Dice can have values 1-6 for '🎲', '🎯' and '🎳', values 1-5 for '🏀' and '⚽', and values 1-64 for '🎰'. Defaults to '🎲' - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_dice.SendDice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendDice - - return SendDice( - chat_id=self.chat.id, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_sticker( - self, - sticker: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendSticker: - """ - Shortcut for method :class:`aiogram.methods.send_sticker.SendSticker` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send static .WEBP, `animated `_ .TGS, or `video `_ .WEBM stickers. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendsticker - - :param sticker: Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. :ref:`More information on Sending Files » `. Video and animated stickers can't be sent via an HTTP URL. - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param emoji: Emoji associated with the sticker; only for just uploaded stickers - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_sticker.SendSticker` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendSticker - - return SendSticker( - chat_id=self.chat.id, - sticker=sticker, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_venue( - self, - latitude: float, - longitude: float, - title: str, - address: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVenue: - """ - Shortcut for method :class:`aiogram.methods.send_venue.SendVenue` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send information about a venue. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvenue - - :param latitude: Latitude of the venue - :param longitude: Longitude of the venue - :param title: Name of the venue - :param address: Address of the venue - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param foursquare_id: Foursquare identifier of the venue - :param foursquare_type: Foursquare type of the venue, if known. (For example, 'arts_entertainment/default', 'arts_entertainment/aquarium' or 'food/icecream'.) - :param google_place_id: Google Places identifier of the venue - :param google_place_type: Google Places type of the venue. (See `supported types `_.) - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_venue.SendVenue` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVenue - - return SendVenue( - chat_id=self.chat.id, - latitude=latitude, - longitude=longitude, - title=title, - address=address, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - foursquare_id=foursquare_id, - foursquare_type=foursquare_type, - google_place_id=google_place_id, - google_place_type=google_place_type, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_video( - self, - video: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - supports_streaming: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVideo: - """ - Shortcut for method :class:`aiogram.methods.send_video.SendVideo` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvideo - - :param video: Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param duration: Duration of sent video in seconds - :param width: Video width - :param height: Video height - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Video caption (may also be used when resending videos by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the video caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the video needs to be covered with a spoiler animation - :param supports_streaming: Pass :code:`True` if the uploaded video is suitable for streaming - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_video.SendVideo` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVideo - - return SendVideo( - chat_id=self.chat.id, - video=video, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - supports_streaming=supports_streaming, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_video_note( - self, - video_note: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - length: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVideoNote: - """ - Shortcut for method :class:`aiogram.methods.send_video_note.SendVideoNote` - will automatically fill method attributes: - - - :code:`chat_id` - - As of `v.4.0 `_, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvideonote - - :param video_note: Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. :ref:`More information on Sending Files » `. Sending video notes by a URL is currently unsupported - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param duration: Duration of sent video in seconds - :param length: Video width and height, i.e. diameter of the video message - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_video_note.SendVideoNote` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVideoNote - - return SendVideoNote( - chat_id=self.chat.id, - video_note=video_note, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - duration=duration, - length=length, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def answer_voice( - self, - voice: Union[InputFile, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVoice: - """ - Shortcut for method :class:`aiogram.methods.send_voice.SendVoice` - will automatically fill method attributes: - - - :code:`chat_id` - - Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as :class:`aiogram.types.audio.Audio` or :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvoice - - :param voice: Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be sent - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: Voice message caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the voice message caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param duration: Duration of the voice message in seconds - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_voice.SendVoice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVoice - - return SendVoice( - chat_id=self.chat.id, - voice=voice, - business_connection_id=business_connection_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) diff --git a/env/Lib/site-packages/aiogram/types/chat_permissions.py b/env/Lib/site-packages/aiogram/types/chat_permissions.py deleted file mode 100644 index 6270cc3..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_permissions.py +++ /dev/null @@ -1,87 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import MutableTelegramObject - - -class ChatPermissions(MutableTelegramObject): - """ - Describes actions that a non-administrator user is allowed to take in a chat. - - Source: https://core.telegram.org/bots/api#chatpermissions - """ - - can_send_messages: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to send text messages, contacts, giveaways, giveaway winners, invoices, locations and venues""" - can_send_audios: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to send audios""" - can_send_documents: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to send documents""" - can_send_photos: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to send photos""" - can_send_videos: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to send videos""" - can_send_video_notes: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to send video notes""" - can_send_voice_notes: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to send voice notes""" - can_send_polls: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to send polls""" - can_send_other_messages: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to send animations, games, stickers and use inline bots""" - can_add_web_page_previews: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to add web page previews to their messages""" - can_change_info: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to change the chat title, photo and other settings. Ignored in public supergroups""" - can_invite_users: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to invite new users to the chat""" - can_pin_messages: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to pin messages. Ignored in public supergroups""" - can_manage_topics: Optional[bool] = None - """*Optional*. :code:`True`, if the user is allowed to create forum topics. If omitted defaults to the value of can_pin_messages""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - can_send_messages: Optional[bool] = None, - can_send_audios: Optional[bool] = None, - can_send_documents: Optional[bool] = None, - can_send_photos: Optional[bool] = None, - can_send_videos: Optional[bool] = None, - can_send_video_notes: Optional[bool] = None, - can_send_voice_notes: Optional[bool] = None, - can_send_polls: Optional[bool] = None, - can_send_other_messages: Optional[bool] = None, - can_add_web_page_previews: Optional[bool] = None, - can_change_info: Optional[bool] = None, - can_invite_users: Optional[bool] = None, - can_pin_messages: Optional[bool] = None, - can_manage_topics: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - can_send_messages=can_send_messages, - can_send_audios=can_send_audios, - can_send_documents=can_send_documents, - can_send_photos=can_send_photos, - can_send_videos=can_send_videos, - can_send_video_notes=can_send_video_notes, - can_send_voice_notes=can_send_voice_notes, - can_send_polls=can_send_polls, - can_send_other_messages=can_send_other_messages, - can_add_web_page_previews=can_add_web_page_previews, - can_change_info=can_change_info, - can_invite_users=can_invite_users, - can_pin_messages=can_pin_messages, - can_manage_topics=can_manage_topics, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/chat_photo.py b/env/Lib/site-packages/aiogram/types/chat_photo.py deleted file mode 100644 index 1a64aeb..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_photo.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class ChatPhoto(TelegramObject): - """ - This object represents a chat photo. - - Source: https://core.telegram.org/bots/api#chatphoto - """ - - small_file_id: str - """File identifier of small (160x160) chat photo. This file_id can be used only for photo download and only for as long as the photo is not changed.""" - small_file_unique_id: str - """Unique file identifier of small (160x160) chat photo, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.""" - big_file_id: str - """File identifier of big (640x640) chat photo. This file_id can be used only for photo download and only for as long as the photo is not changed.""" - big_file_unique_id: str - """Unique file identifier of big (640x640) chat photo, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - small_file_id: str, - small_file_unique_id: str, - big_file_id: str, - big_file_unique_id: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - small_file_id=small_file_id, - small_file_unique_id=small_file_unique_id, - big_file_id=big_file_id, - big_file_unique_id=big_file_unique_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/chat_shared.py b/env/Lib/site-packages/aiogram/types/chat_shared.py deleted file mode 100644 index 92d6231..0000000 --- a/env/Lib/site-packages/aiogram/types/chat_shared.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from aiogram.types import TelegramObject - -if TYPE_CHECKING: - from .photo_size import PhotoSize - - -class ChatShared(TelegramObject): - """ - This object contains information about a chat that was shared with the bot using a :class:`aiogram.types.keyboard_button_request_chat.KeyboardButtonRequestChat` button. - - Source: https://core.telegram.org/bots/api#chatshared - """ - - request_id: int - """Identifier of the request""" - chat_id: int - """Identifier of the shared chat. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier. The bot may not have access to the chat and could be unable to use this identifier, unless the chat is already known to the bot by some other means.""" - title: Optional[str] = None - """*Optional*. Title of the chat, if the title was requested by the bot.""" - username: Optional[str] = None - """*Optional*. Username of the chat, if the username was requested by the bot and available.""" - photo: Optional[List[PhotoSize]] = None - """*Optional*. Available sizes of the chat photo, if the photo was requested by the bot""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - request_id: int, - chat_id: int, - title: Optional[str] = None, - username: Optional[str] = None, - photo: Optional[List[PhotoSize]] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - request_id=request_id, - chat_id=chat_id, - title=title, - username=username, - photo=photo, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/chosen_inline_result.py b/env/Lib/site-packages/aiogram/types/chosen_inline_result.py deleted file mode 100644 index 510a0e1..0000000 --- a/env/Lib/site-packages/aiogram/types/chosen_inline_result.py +++ /dev/null @@ -1,58 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from pydantic import Field - -from .base import TelegramObject - -if TYPE_CHECKING: - from .location import Location - from .user import User - - -class ChosenInlineResult(TelegramObject): - """ - Represents a `result `_ of an inline query that was chosen by the user and sent to their chat partner. - **Note:** It is necessary to enable `inline feedback `_ via `@BotFather `_ in order to receive these objects in updates. - - Source: https://core.telegram.org/bots/api#choseninlineresult - """ - - result_id: str - """The unique identifier for the result that was chosen""" - from_user: User = Field(..., alias="from") - """The user that chose the result""" - query: str - """The query that was used to obtain the result""" - location: Optional[Location] = None - """*Optional*. Sender location, only for bots that require user location""" - inline_message_id: Optional[str] = None - """*Optional*. Identifier of the sent inline message. Available only if there is an `inline keyboard `_ attached to the message. Will be also received in `callback queries `_ and can be used to `edit `_ the message.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - result_id: str, - from_user: User, - query: str, - location: Optional[Location] = None, - inline_message_id: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - result_id=result_id, - from_user=from_user, - query=query, - location=location, - inline_message_id=inline_message_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/contact.py b/env/Lib/site-packages/aiogram/types/contact.py deleted file mode 100644 index 1fb7f83..0000000 --- a/env/Lib/site-packages/aiogram/types/contact.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - - -class Contact(TelegramObject): - """ - This object represents a phone contact. - - Source: https://core.telegram.org/bots/api#contact - """ - - phone_number: str - """Contact's phone number""" - first_name: str - """Contact's first name""" - last_name: Optional[str] = None - """*Optional*. Contact's last name""" - user_id: Optional[int] = None - """*Optional*. Contact's user identifier in Telegram. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier.""" - vcard: Optional[str] = None - """*Optional*. Additional data about the contact in the form of a `vCard `_""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - phone_number: str, - first_name: str, - last_name: Optional[str] = None, - user_id: Optional[int] = None, - vcard: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - phone_number=phone_number, - first_name=first_name, - last_name=last_name, - user_id=user_id, - vcard=vcard, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/custom.py b/env/Lib/site-packages/aiogram/types/custom.py deleted file mode 100644 index 8617fa6..0000000 --- a/env/Lib/site-packages/aiogram/types/custom.py +++ /dev/null @@ -1,30 +0,0 @@ -import sys -from datetime import datetime, timezone - -from pydantic import PlainSerializer -from typing_extensions import Annotated - -if sys.platform == "win32": # pragma: no cover - - def _datetime_serializer(value: datetime) -> int: - tz = timezone.utc if value.tzinfo else None - - # https://github.com/aiogram/aiogram/issues/349 - # https://github.com/aiogram/aiogram/pull/880 - return round((value - datetime(1970, 1, 1, tzinfo=tz)).total_seconds()) - -else: # pragma: no cover - - def _datetime_serializer(value: datetime) -> int: - return round(value.timestamp()) - - -# Make datetime compatible with Telegram Bot API (unixtime) -DateTime = Annotated[ - datetime, - PlainSerializer( - func=_datetime_serializer, - return_type=int, - when_used="unless-none", - ), -] diff --git a/env/Lib/site-packages/aiogram/types/dice.py b/env/Lib/site-packages/aiogram/types/dice.py deleted file mode 100644 index 56b84f4..0000000 --- a/env/Lib/site-packages/aiogram/types/dice.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class Dice(TelegramObject): - """ - This object represents an animated emoji that displays a random value. - - Source: https://core.telegram.org/bots/api#dice - """ - - emoji: str - """Emoji on which the dice throw animation is based""" - value: int - """Value of the dice, 1-6 for '🎲', '🎯' and '🎳' base emoji, 1-5 for '🏀' and '⚽' base emoji, 1-64 for '🎰' base emoji""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, emoji: str, value: int, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(emoji=emoji, value=value, **__pydantic_kwargs) - - -class DiceEmoji: - DICE = "🎲" - DART = "🎯" - BASKETBALL = "🏀" - FOOTBALL = "⚽" - SLOT_MACHINE = "🎰" - BOWLING = "🎳" diff --git a/env/Lib/site-packages/aiogram/types/document.py b/env/Lib/site-packages/aiogram/types/document.py deleted file mode 100644 index 18acff7..0000000 --- a/env/Lib/site-packages/aiogram/types/document.py +++ /dev/null @@ -1,58 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .photo_size import PhotoSize - - -class Document(TelegramObject): - """ - This object represents a general file (as opposed to `photos `_, `voice messages `_ and `audio files `_). - - Source: https://core.telegram.org/bots/api#document - """ - - file_id: str - """Identifier for this file, which can be used to download or reuse the file""" - file_unique_id: str - """Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.""" - thumbnail: Optional[PhotoSize] = None - """*Optional*. Document thumbnail as defined by the sender""" - file_name: Optional[str] = None - """*Optional*. Original filename as defined by the sender""" - mime_type: Optional[str] = None - """*Optional*. MIME type of the file as defined by the sender""" - file_size: Optional[int] = None - """*Optional*. File size in bytes. It can be bigger than 2^31 and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this value.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - file_id: str, - file_unique_id: str, - thumbnail: Optional[PhotoSize] = None, - file_name: Optional[str] = None, - mime_type: Optional[str] = None, - file_size: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - thumbnail=thumbnail, - file_name=file_name, - mime_type=mime_type, - file_size=file_size, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/downloadable.py b/env/Lib/site-packages/aiogram/types/downloadable.py deleted file mode 100644 index be80829..0000000 --- a/env/Lib/site-packages/aiogram/types/downloadable.py +++ /dev/null @@ -1,5 +0,0 @@ -from typing import Protocol - - -class Downloadable(Protocol): - file_id: str diff --git a/env/Lib/site-packages/aiogram/types/encrypted_credentials.py b/env/Lib/site-packages/aiogram/types/encrypted_credentials.py deleted file mode 100644 index ca03e2a..0000000 --- a/env/Lib/site-packages/aiogram/types/encrypted_credentials.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class EncryptedCredentials(TelegramObject): - """ - Describes data required for decrypting and authenticating :class:`aiogram.types.encrypted_passport_element.EncryptedPassportElement`. See the `Telegram Passport Documentation `_ for a complete description of the data decryption and authentication processes. - - Source: https://core.telegram.org/bots/api#encryptedcredentials - """ - - data: str - """Base64-encoded encrypted JSON-serialized data with unique user's payload, data hashes and secrets required for :class:`aiogram.types.encrypted_passport_element.EncryptedPassportElement` decryption and authentication""" - hash: str - """Base64-encoded data hash for data authentication""" - secret: str - """Base64-encoded secret, encrypted with the bot's public RSA key, required for data decryption""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, data: str, hash: str, secret: str, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(data=data, hash=hash, secret=secret, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/encrypted_passport_element.py b/env/Lib/site-packages/aiogram/types/encrypted_passport_element.py deleted file mode 100644 index c1e8be1..0000000 --- a/env/Lib/site-packages/aiogram/types/encrypted_passport_element.py +++ /dev/null @@ -1,74 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .passport_file import PassportFile - - -class EncryptedPassportElement(TelegramObject): - """ - Describes documents or other Telegram Passport elements shared with the bot by the user. - - Source: https://core.telegram.org/bots/api#encryptedpassportelement - """ - - type: str - """Element type. One of 'personal_details', 'passport', 'driver_license', 'identity_card', 'internal_passport', 'address', 'utility_bill', 'bank_statement', 'rental_agreement', 'passport_registration', 'temporary_registration', 'phone_number', 'email'.""" - hash: str - """Base64-encoded element hash for using in :class:`aiogram.types.passport_element_error_unspecified.PassportElementErrorUnspecified`""" - data: Optional[str] = None - """*Optional*. Base64-encoded encrypted Telegram Passport element data provided by the user; available only for 'personal_details', 'passport', 'driver_license', 'identity_card', 'internal_passport' and 'address' types. Can be decrypted and verified using the accompanying :class:`aiogram.types.encrypted_credentials.EncryptedCredentials`.""" - phone_number: Optional[str] = None - """*Optional*. User's verified phone number; available only for 'phone_number' type""" - email: Optional[str] = None - """*Optional*. User's verified email address; available only for 'email' type""" - files: Optional[List[PassportFile]] = None - """*Optional*. Array of encrypted files with documents provided by the user; available only for 'utility_bill', 'bank_statement', 'rental_agreement', 'passport_registration' and 'temporary_registration' types. Files can be decrypted and verified using the accompanying :class:`aiogram.types.encrypted_credentials.EncryptedCredentials`.""" - front_side: Optional[PassportFile] = None - """*Optional*. Encrypted file with the front side of the document, provided by the user; available only for 'passport', 'driver_license', 'identity_card' and 'internal_passport'. The file can be decrypted and verified using the accompanying :class:`aiogram.types.encrypted_credentials.EncryptedCredentials`.""" - reverse_side: Optional[PassportFile] = None - """*Optional*. Encrypted file with the reverse side of the document, provided by the user; available only for 'driver_license' and 'identity_card'. The file can be decrypted and verified using the accompanying :class:`aiogram.types.encrypted_credentials.EncryptedCredentials`.""" - selfie: Optional[PassportFile] = None - """*Optional*. Encrypted file with the selfie of the user holding a document, provided by the user; available if requested for 'passport', 'driver_license', 'identity_card' and 'internal_passport'. The file can be decrypted and verified using the accompanying :class:`aiogram.types.encrypted_credentials.EncryptedCredentials`.""" - translation: Optional[List[PassportFile]] = None - """*Optional*. Array of encrypted files with translated versions of documents provided by the user; available if requested for 'passport', 'driver_license', 'identity_card', 'internal_passport', 'utility_bill', 'bank_statement', 'rental_agreement', 'passport_registration' and 'temporary_registration' types. Files can be decrypted and verified using the accompanying :class:`aiogram.types.encrypted_credentials.EncryptedCredentials`.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: str, - hash: str, - data: Optional[str] = None, - phone_number: Optional[str] = None, - email: Optional[str] = None, - files: Optional[List[PassportFile]] = None, - front_side: Optional[PassportFile] = None, - reverse_side: Optional[PassportFile] = None, - selfie: Optional[PassportFile] = None, - translation: Optional[List[PassportFile]] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - hash=hash, - data=data, - phone_number=phone_number, - email=email, - files=files, - front_side=front_side, - reverse_side=reverse_side, - selfie=selfie, - translation=translation, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/error_event.py b/env/Lib/site-packages/aiogram/types/error_event.py deleted file mode 100644 index e5eafc9..0000000 --- a/env/Lib/site-packages/aiogram/types/error_event.py +++ /dev/null @@ -1,28 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from aiogram.types.base import TelegramObject - -if TYPE_CHECKING: - from .update import Update - - -class ErrorEvent(TelegramObject): - """ - Internal event, should be used to receive errors while processing Updates from Telegram - - Source: https://core.telegram.org/bots/api#error-event - """ - - update: Update - """Received update""" - exception: Exception - """Exception""" - - if TYPE_CHECKING: - - def __init__( - __pydantic_self__, *, update: Update, exception: Exception, **__pydantic_kwargs: Any - ) -> None: - super().__init__(update=update, exception=exception, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/external_reply_info.py b/env/Lib/site-packages/aiogram/types/external_reply_info.py deleted file mode 100644 index 0f13a85..0000000 --- a/env/Lib/site-packages/aiogram/types/external_reply_info.py +++ /dev/null @@ -1,158 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from .base import TelegramObject - -if TYPE_CHECKING: - from .animation import Animation - from .audio import Audio - from .chat import Chat - from .contact import Contact - from .dice import Dice - from .document import Document - from .game import Game - from .giveaway import Giveaway - from .giveaway_winners import GiveawayWinners - from .invoice import Invoice - from .link_preview_options import LinkPreviewOptions - from .location import Location - from .message_origin_channel import MessageOriginChannel - from .message_origin_chat import MessageOriginChat - from .message_origin_hidden_user import MessageOriginHiddenUser - from .message_origin_user import MessageOriginUser - from .paid_media_info import PaidMediaInfo - from .photo_size import PhotoSize - from .poll import Poll - from .sticker import Sticker - from .story import Story - from .venue import Venue - from .video import Video - from .video_note import VideoNote - from .voice import Voice - - -class ExternalReplyInfo(TelegramObject): - """ - This object contains information about a message that is being replied to, which may come from another chat or forum topic. - - Source: https://core.telegram.org/bots/api#externalreplyinfo - """ - - origin: Union[ - MessageOriginUser, MessageOriginHiddenUser, MessageOriginChat, MessageOriginChannel - ] - """Origin of the message replied to by the given message""" - chat: Optional[Chat] = None - """*Optional*. Chat the original message belongs to. Available only if the chat is a supergroup or a channel.""" - message_id: Optional[int] = None - """*Optional*. Unique message identifier inside the original chat. Available only if the original chat is a supergroup or a channel.""" - link_preview_options: Optional[LinkPreviewOptions] = None - """*Optional*. Options used for link preview generation for the original message, if it is a text message""" - animation: Optional[Animation] = None - """*Optional*. Message is an animation, information about the animation""" - audio: Optional[Audio] = None - """*Optional*. Message is an audio file, information about the file""" - document: Optional[Document] = None - """*Optional*. Message is a general file, information about the file""" - paid_media: Optional[PaidMediaInfo] = None - """*Optional*. Message contains paid media; information about the paid media""" - photo: Optional[List[PhotoSize]] = None - """*Optional*. Message is a photo, available sizes of the photo""" - sticker: Optional[Sticker] = None - """*Optional*. Message is a sticker, information about the sticker""" - story: Optional[Story] = None - """*Optional*. Message is a forwarded story""" - video: Optional[Video] = None - """*Optional*. Message is a video, information about the video""" - video_note: Optional[VideoNote] = None - """*Optional*. Message is a `video note `_, information about the video message""" - voice: Optional[Voice] = None - """*Optional*. Message is a voice message, information about the file""" - has_media_spoiler: Optional[bool] = None - """*Optional*. :code:`True`, if the message media is covered by a spoiler animation""" - contact: Optional[Contact] = None - """*Optional*. Message is a shared contact, information about the contact""" - dice: Optional[Dice] = None - """*Optional*. Message is a dice with random value""" - game: Optional[Game] = None - """*Optional*. Message is a game, information about the game. `More about games » `_""" - giveaway: Optional[Giveaway] = None - """*Optional*. Message is a scheduled giveaway, information about the giveaway""" - giveaway_winners: Optional[GiveawayWinners] = None - """*Optional*. A giveaway with public winners was completed""" - invoice: Optional[Invoice] = None - """*Optional*. Message is an invoice for a `payment `_, information about the invoice. `More about payments » `_""" - location: Optional[Location] = None - """*Optional*. Message is a shared location, information about the location""" - poll: Optional[Poll] = None - """*Optional*. Message is a native poll, information about the poll""" - venue: Optional[Venue] = None - """*Optional*. Message is a venue, information about the venue""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - origin: Union[ - MessageOriginUser, MessageOriginHiddenUser, MessageOriginChat, MessageOriginChannel - ], - chat: Optional[Chat] = None, - message_id: Optional[int] = None, - link_preview_options: Optional[LinkPreviewOptions] = None, - animation: Optional[Animation] = None, - audio: Optional[Audio] = None, - document: Optional[Document] = None, - paid_media: Optional[PaidMediaInfo] = None, - photo: Optional[List[PhotoSize]] = None, - sticker: Optional[Sticker] = None, - story: Optional[Story] = None, - video: Optional[Video] = None, - video_note: Optional[VideoNote] = None, - voice: Optional[Voice] = None, - has_media_spoiler: Optional[bool] = None, - contact: Optional[Contact] = None, - dice: Optional[Dice] = None, - game: Optional[Game] = None, - giveaway: Optional[Giveaway] = None, - giveaway_winners: Optional[GiveawayWinners] = None, - invoice: Optional[Invoice] = None, - location: Optional[Location] = None, - poll: Optional[Poll] = None, - venue: Optional[Venue] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - origin=origin, - chat=chat, - message_id=message_id, - link_preview_options=link_preview_options, - animation=animation, - audio=audio, - document=document, - paid_media=paid_media, - photo=photo, - sticker=sticker, - story=story, - video=video, - video_note=video_note, - voice=voice, - has_media_spoiler=has_media_spoiler, - contact=contact, - dice=dice, - game=game, - giveaway=giveaway, - giveaway_winners=giveaway_winners, - invoice=invoice, - location=location, - poll=poll, - venue=venue, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/file.py b/env/Lib/site-packages/aiogram/types/file.py deleted file mode 100644 index 252c230..0000000 --- a/env/Lib/site-packages/aiogram/types/file.py +++ /dev/null @@ -1,49 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - - -class File(TelegramObject): - """ - This object represents a file ready to be downloaded. The file can be downloaded via the link :code:`https://api.telegram.org/file/bot/`. It is guaranteed that the link will be valid for at least 1 hour. When the link expires, a new one can be requested by calling :class:`aiogram.methods.get_file.GetFile`. - - The maximum file size to download is 20 MB - - Source: https://core.telegram.org/bots/api#file - """ - - file_id: str - """Identifier for this file, which can be used to download or reuse the file""" - file_unique_id: str - """Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.""" - file_size: Optional[int] = None - """*Optional*. File size in bytes. It can be bigger than 2^31 and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this value.""" - file_path: Optional[str] = None - """*Optional*. File path. Use :code:`https://api.telegram.org/file/bot/` to get the file.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - file_id: str, - file_unique_id: str, - file_size: Optional[int] = None, - file_path: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - file_size=file_size, - file_path=file_path, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/force_reply.py b/env/Lib/site-packages/aiogram/types/force_reply.py deleted file mode 100644 index 14b9c1c..0000000 --- a/env/Lib/site-packages/aiogram/types/force_reply.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional - -from .base import MutableTelegramObject - - -class ForceReply(MutableTelegramObject): - """ - Upon receiving a message with this object, Telegram clients will display a reply interface to the user (act as if the user has selected the bot's message and tapped 'Reply'). This can be extremely useful if you want to create user-friendly step-by-step interfaces without having to sacrifice `privacy mode `_. Not supported in channels and for messages sent on behalf of a Telegram Business account. - - **Example:** A `poll bot `_ for groups runs in privacy mode (only receives commands, replies to its messages and mentions). There could be two ways to create a new poll: - - - Explain the user how to send a command with parameters (e.g. /newpoll question answer1 answer2). May be appealing for hardcore users but lacks modern day polish. - - Guide the user through a step-by-step process. 'Please send me your question', 'Cool, now let's add the first answer option', 'Great. Keep adding answer options, then send /done when you're ready'. - - The last option is definitely more attractive. And if you use :class:`aiogram.types.force_reply.ForceReply` in your bot's questions, it will receive the user's answers even if it only receives replies, commands and mentions - without any extra work for the user. - - Source: https://core.telegram.org/bots/api#forcereply - """ - - force_reply: Literal[True] = True - """Shows reply interface to the user, as if they manually selected the bot's message and tapped 'Reply'""" - input_field_placeholder: Optional[str] = None - """*Optional*. The placeholder to be shown in the input field when the reply is active; 1-64 characters""" - selective: Optional[bool] = None - """*Optional*. Use this parameter if you want to force reply from specific users only. Targets: 1) users that are @mentioned in the *text* of the :class:`aiogram.types.message.Message` object; 2) if the bot's message is a reply to a message in the same chat and forum topic, sender of the original message.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - force_reply: Literal[True] = True, - input_field_placeholder: Optional[str] = None, - selective: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - force_reply=force_reply, - input_field_placeholder=input_field_placeholder, - selective=selective, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/forum_topic.py b/env/Lib/site-packages/aiogram/types/forum_topic.py deleted file mode 100644 index a6464bc..0000000 --- a/env/Lib/site-packages/aiogram/types/forum_topic.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - - -class ForumTopic(TelegramObject): - """ - This object represents a forum topic. - - Source: https://core.telegram.org/bots/api#forumtopic - """ - - message_thread_id: int - """Unique identifier of the forum topic""" - name: str - """Name of the topic""" - icon_color: int - """Color of the topic icon in RGB format""" - icon_custom_emoji_id: Optional[str] = None - """*Optional*. Unique identifier of the custom emoji shown as the topic icon""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - message_thread_id: int, - name: str, - icon_color: int, - icon_custom_emoji_id: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - message_thread_id=message_thread_id, - name=name, - icon_color=icon_color, - icon_custom_emoji_id=icon_custom_emoji_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/forum_topic_closed.py b/env/Lib/site-packages/aiogram/types/forum_topic_closed.py deleted file mode 100644 index 390b331..0000000 --- a/env/Lib/site-packages/aiogram/types/forum_topic_closed.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import annotations - -from .base import TelegramObject - - -class ForumTopicClosed(TelegramObject): - """ - This object represents a service message about a forum topic closed in the chat. Currently holds no information. - - Source: https://core.telegram.org/bots/api#forumtopicclosed - """ diff --git a/env/Lib/site-packages/aiogram/types/forum_topic_created.py b/env/Lib/site-packages/aiogram/types/forum_topic_created.py deleted file mode 100644 index 513df95..0000000 --- a/env/Lib/site-packages/aiogram/types/forum_topic_created.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - - -class ForumTopicCreated(TelegramObject): - """ - This object represents a service message about a new forum topic created in the chat. - - Source: https://core.telegram.org/bots/api#forumtopiccreated - """ - - name: str - """Name of the topic""" - icon_color: int - """Color of the topic icon in RGB format""" - icon_custom_emoji_id: Optional[str] = None - """*Optional*. Unique identifier of the custom emoji shown as the topic icon""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - name: str, - icon_color: int, - icon_custom_emoji_id: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - name=name, - icon_color=icon_color, - icon_custom_emoji_id=icon_custom_emoji_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/forum_topic_edited.py b/env/Lib/site-packages/aiogram/types/forum_topic_edited.py deleted file mode 100644 index b7b6196..0000000 --- a/env/Lib/site-packages/aiogram/types/forum_topic_edited.py +++ /dev/null @@ -1,35 +0,0 @@ -from typing import TYPE_CHECKING, Any, Optional - -from aiogram.types import TelegramObject - - -class ForumTopicEdited(TelegramObject): - """ - This object represents a service message about an edited forum topic. - - Source: https://core.telegram.org/bots/api#forumtopicedited - """ - - name: Optional[str] = None - """*Optional*. New name of the topic, if it was edited""" - icon_custom_emoji_id: Optional[str] = None - """*Optional*. New identifier of the custom emoji shown as the topic icon, if it was edited; an empty string if the icon was removed""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - name: Optional[str] = None, - icon_custom_emoji_id: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - name=name, icon_custom_emoji_id=icon_custom_emoji_id, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/forum_topic_reopened.py b/env/Lib/site-packages/aiogram/types/forum_topic_reopened.py deleted file mode 100644 index e02fbaf..0000000 --- a/env/Lib/site-packages/aiogram/types/forum_topic_reopened.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import annotations - -from .base import TelegramObject - - -class ForumTopicReopened(TelegramObject): - """ - This object represents a service message about a forum topic reopened in the chat. Currently holds no information. - - Source: https://core.telegram.org/bots/api#forumtopicreopened - """ diff --git a/env/Lib/site-packages/aiogram/types/game.py b/env/Lib/site-packages/aiogram/types/game.py deleted file mode 100644 index 294f26b..0000000 --- a/env/Lib/site-packages/aiogram/types/game.py +++ /dev/null @@ -1,60 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .animation import Animation - from .message_entity import MessageEntity - from .photo_size import PhotoSize - - -class Game(TelegramObject): - """ - This object represents a game. Use BotFather to create and edit games, their short names will act as unique identifiers. - - Source: https://core.telegram.org/bots/api#game - """ - - title: str - """Title of the game""" - description: str - """Description of the game""" - photo: List[PhotoSize] - """Photo that will be displayed in the game message in chats.""" - text: Optional[str] = None - """*Optional*. Brief description of the game or high scores included in the game message. Can be automatically edited to include current high scores for the game when the bot calls :class:`aiogram.methods.set_game_score.SetGameScore`, or manually edited using :class:`aiogram.methods.edit_message_text.EditMessageText`. 0-4096 characters.""" - text_entities: Optional[List[MessageEntity]] = None - """*Optional*. Special entities that appear in *text*, such as usernames, URLs, bot commands, etc.""" - animation: Optional[Animation] = None - """*Optional*. Animation that will be displayed in the game message in chats. Upload via `BotFather `_""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - title: str, - description: str, - photo: List[PhotoSize], - text: Optional[str] = None, - text_entities: Optional[List[MessageEntity]] = None, - animation: Optional[Animation] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - title=title, - description=description, - photo=photo, - text=text, - text_entities=text_entities, - animation=animation, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/game_high_score.py b/env/Lib/site-packages/aiogram/types/game_high_score.py deleted file mode 100644 index 5364be6..0000000 --- a/env/Lib/site-packages/aiogram/types/game_high_score.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - -if TYPE_CHECKING: - from .user import User - - -class GameHighScore(TelegramObject): - """ - This object represents one row of the high scores table for a game. - And that's about all we've got for now. - - If you've got any questions, please check out our `https://core.telegram.org/bots/faq `_ **Bot FAQ »** - - Source: https://core.telegram.org/bots/api#gamehighscore - """ - - position: int - """Position in high score table for the game""" - user: User - """User""" - score: int - """Score""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, position: int, user: User, score: int, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(position=position, user=user, score=score, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/general_forum_topic_hidden.py b/env/Lib/site-packages/aiogram/types/general_forum_topic_hidden.py deleted file mode 100644 index 136a275..0000000 --- a/env/Lib/site-packages/aiogram/types/general_forum_topic_hidden.py +++ /dev/null @@ -1,9 +0,0 @@ -from aiogram.types import TelegramObject - - -class GeneralForumTopicHidden(TelegramObject): - """ - This object represents a service message about General forum topic hidden in the chat. Currently holds no information. - - Source: https://core.telegram.org/bots/api#generalforumtopichidden - """ diff --git a/env/Lib/site-packages/aiogram/types/general_forum_topic_unhidden.py b/env/Lib/site-packages/aiogram/types/general_forum_topic_unhidden.py deleted file mode 100644 index 9637a02..0000000 --- a/env/Lib/site-packages/aiogram/types/general_forum_topic_unhidden.py +++ /dev/null @@ -1,9 +0,0 @@ -from aiogram.types import TelegramObject - - -class GeneralForumTopicUnhidden(TelegramObject): - """ - This object represents a service message about General forum topic unhidden in the chat. Currently holds no information. - - Source: https://core.telegram.org/bots/api#generalforumtopicunhidden - """ diff --git a/env/Lib/site-packages/aiogram/types/giveaway.py b/env/Lib/site-packages/aiogram/types/giveaway.py deleted file mode 100644 index 1fa4f50..0000000 --- a/env/Lib/site-packages/aiogram/types/giveaway.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .chat import Chat - from .custom import DateTime - - -class Giveaway(TelegramObject): - """ - This object represents a message about a scheduled giveaway. - - Source: https://core.telegram.org/bots/api#giveaway - """ - - chats: List[Chat] - """The list of chats which the user must join to participate in the giveaway""" - winners_selection_date: DateTime - """Point in time (Unix timestamp) when winners of the giveaway will be selected""" - winner_count: int - """The number of users which are supposed to be selected as winners of the giveaway""" - only_new_members: Optional[bool] = None - """*Optional*. :code:`True`, if only users who join the chats after the giveaway started should be eligible to win""" - has_public_winners: Optional[bool] = None - """*Optional*. :code:`True`, if the list of giveaway winners will be visible to everyone""" - prize_description: Optional[str] = None - """*Optional*. Description of additional giveaway prize""" - country_codes: Optional[List[str]] = None - """*Optional*. A list of two-letter `ISO 3166-1 alpha-2 `_ country codes indicating the countries from which eligible users for the giveaway must come. If empty, then all users can participate in the giveaway. Users with a phone number that was bought on Fragment can always participate in giveaways.""" - premium_subscription_month_count: Optional[int] = None - """*Optional*. The number of months the Telegram Premium subscription won from the giveaway will be active for""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chats: List[Chat], - winners_selection_date: DateTime, - winner_count: int, - only_new_members: Optional[bool] = None, - has_public_winners: Optional[bool] = None, - prize_description: Optional[str] = None, - country_codes: Optional[List[str]] = None, - premium_subscription_month_count: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chats=chats, - winners_selection_date=winners_selection_date, - winner_count=winner_count, - only_new_members=only_new_members, - has_public_winners=has_public_winners, - prize_description=prize_description, - country_codes=country_codes, - premium_subscription_month_count=premium_subscription_month_count, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/giveaway_completed.py b/env/Lib/site-packages/aiogram/types/giveaway_completed.py deleted file mode 100644 index 71d525a..0000000 --- a/env/Lib/site-packages/aiogram/types/giveaway_completed.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .message import Message - - -class GiveawayCompleted(TelegramObject): - """ - This object represents a service message about the completion of a giveaway without public winners. - - Source: https://core.telegram.org/bots/api#giveawaycompleted - """ - - winner_count: int - """Number of winners in the giveaway""" - unclaimed_prize_count: Optional[int] = None - """*Optional*. Number of undistributed prizes""" - giveaway_message: Optional[Message] = None - """*Optional*. Message with the giveaway that was completed, if it wasn't deleted""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - winner_count: int, - unclaimed_prize_count: Optional[int] = None, - giveaway_message: Optional[Message] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - winner_count=winner_count, - unclaimed_prize_count=unclaimed_prize_count, - giveaway_message=giveaway_message, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/giveaway_created.py b/env/Lib/site-packages/aiogram/types/giveaway_created.py deleted file mode 100644 index cd66d75..0000000 --- a/env/Lib/site-packages/aiogram/types/giveaway_created.py +++ /dev/null @@ -1,9 +0,0 @@ -from .base import TelegramObject - - -class GiveawayCreated(TelegramObject): - """ - This object represents a service message about the creation of a scheduled giveaway. Currently holds no information. - - Source: https://core.telegram.org/bots/api#giveawaycreated - """ diff --git a/env/Lib/site-packages/aiogram/types/giveaway_winners.py b/env/Lib/site-packages/aiogram/types/giveaway_winners.py deleted file mode 100644 index 8a501f8..0000000 --- a/env/Lib/site-packages/aiogram/types/giveaway_winners.py +++ /dev/null @@ -1,80 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .chat import Chat - from .custom import DateTime - from .user import User - - -class GiveawayWinners(TelegramObject): - """ - This object represents a message about the completion of a giveaway with public winners. - - Source: https://core.telegram.org/bots/api#giveawaywinners - """ - - chat: Chat - """The chat that created the giveaway""" - giveaway_message_id: int - """Identifier of the message with the giveaway in the chat""" - winners_selection_date: DateTime - """Point in time (Unix timestamp) when winners of the giveaway were selected""" - winner_count: int - """Total number of winners in the giveaway""" - winners: List[User] - """List of up to 100 winners of the giveaway""" - additional_chat_count: Optional[int] = None - """*Optional*. The number of other chats the user had to join in order to be eligible for the giveaway""" - premium_subscription_month_count: Optional[int] = None - """*Optional*. The number of months the Telegram Premium subscription won from the giveaway will be active for""" - unclaimed_prize_count: Optional[int] = None - """*Optional*. Number of undistributed prizes""" - only_new_members: Optional[bool] = None - """*Optional*. :code:`True`, if only users who had joined the chats after the giveaway started were eligible to win""" - was_refunded: Optional[bool] = None - """*Optional*. :code:`True`, if the giveaway was canceled because the payment for it was refunded""" - prize_description: Optional[str] = None - """*Optional*. Description of additional giveaway prize""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat: Chat, - giveaway_message_id: int, - winners_selection_date: DateTime, - winner_count: int, - winners: List[User], - additional_chat_count: Optional[int] = None, - premium_subscription_month_count: Optional[int] = None, - unclaimed_prize_count: Optional[int] = None, - only_new_members: Optional[bool] = None, - was_refunded: Optional[bool] = None, - prize_description: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat=chat, - giveaway_message_id=giveaway_message_id, - winners_selection_date=winners_selection_date, - winner_count=winner_count, - winners=winners, - additional_chat_count=additional_chat_count, - premium_subscription_month_count=premium_subscription_month_count, - unclaimed_prize_count=unclaimed_prize_count, - only_new_members=only_new_members, - was_refunded=was_refunded, - prize_description=prize_description, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inaccessible_message.py b/env/Lib/site-packages/aiogram/types/inaccessible_message.py deleted file mode 100644 index 6ed38fe..0000000 --- a/env/Lib/site-packages/aiogram/types/inaccessible_message.py +++ /dev/null @@ -1,41 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from .maybe_inaccessible_message import MaybeInaccessibleMessage - -if TYPE_CHECKING: - from .chat import Chat - - -class InaccessibleMessage(MaybeInaccessibleMessage): - """ - This object describes a message that was deleted or is otherwise inaccessible to the bot. - - Source: https://core.telegram.org/bots/api#inaccessiblemessage - """ - - chat: Chat - """Chat the message belonged to""" - message_id: int - """Unique message identifier inside the chat""" - date: Literal[0] = 0 - """Always 0. The field can be used to differentiate regular and inaccessible messages.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat: Chat, - message_id: int, - date: Literal[0] = 0, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat=chat, message_id=message_id, date=date, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/inline_keyboard_button.py b/env/Lib/site-packages/aiogram/types/inline_keyboard_button.py deleted file mode 100644 index fa801f2..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_keyboard_button.py +++ /dev/null @@ -1,77 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import MutableTelegramObject - -if TYPE_CHECKING: - from .callback_game import CallbackGame - from .login_url import LoginUrl - from .switch_inline_query_chosen_chat import SwitchInlineQueryChosenChat - from .web_app_info import WebAppInfo - - -class InlineKeyboardButton(MutableTelegramObject): - """ - This object represents one button of an inline keyboard. Exactly one of the optional fields must be used to specify type of the button. - - Source: https://core.telegram.org/bots/api#inlinekeyboardbutton - """ - - text: str - """Label text on the button""" - url: Optional[str] = None - """*Optional*. HTTP or tg:// URL to be opened when the button is pressed. Links :code:`tg://user?id=` can be used to mention a user by their identifier without using a username, if this is allowed by their privacy settings.""" - callback_data: Optional[str] = None - """*Optional*. Data to be sent in a `callback query `_ to the bot when the button is pressed, 1-64 bytes""" - web_app: Optional[WebAppInfo] = None - """*Optional*. Description of the `Web App `_ that will be launched when the user presses the button. The Web App will be able to send an arbitrary message on behalf of the user using the method :class:`aiogram.methods.answer_web_app_query.AnswerWebAppQuery`. Available only in private chats between a user and the bot. Not supported for messages sent on behalf of a Telegram Business account.""" - login_url: Optional[LoginUrl] = None - """*Optional*. An HTTPS URL used to automatically authorize the user. Can be used as a replacement for the `Telegram Login Widget `_.""" - switch_inline_query: Optional[str] = None - """*Optional*. If set, pressing the button will prompt the user to select one of their chats, open that chat and insert the bot's username and the specified inline query in the input field. May be empty, in which case just the bot's username will be inserted. Not supported for messages sent on behalf of a Telegram Business account.""" - switch_inline_query_current_chat: Optional[str] = None - """*Optional*. If set, pressing the button will insert the bot's username and the specified inline query in the current chat's input field. May be empty, in which case only the bot's username will be inserted.""" - switch_inline_query_chosen_chat: Optional[SwitchInlineQueryChosenChat] = None - """*Optional*. If set, pressing the button will prompt the user to select one of their chats of the specified type, open that chat and insert the bot's username and the specified inline query in the input field. Not supported for messages sent on behalf of a Telegram Business account.""" - callback_game: Optional[CallbackGame] = None - """*Optional*. Description of the game that will be launched when the user presses the button.""" - pay: Optional[bool] = None - """*Optional*. Specify :code:`True`, to send a `Pay button `_. Substrings '⭐' and 'XTR' in the buttons's text will be replaced with a Telegram Star icon.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - text: str, - url: Optional[str] = None, - callback_data: Optional[str] = None, - web_app: Optional[WebAppInfo] = None, - login_url: Optional[LoginUrl] = None, - switch_inline_query: Optional[str] = None, - switch_inline_query_current_chat: Optional[str] = None, - switch_inline_query_chosen_chat: Optional[SwitchInlineQueryChosenChat] = None, - callback_game: Optional[CallbackGame] = None, - pay: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - text=text, - url=url, - callback_data=callback_data, - web_app=web_app, - login_url=login_url, - switch_inline_query=switch_inline_query, - switch_inline_query_current_chat=switch_inline_query_current_chat, - switch_inline_query_chosen_chat=switch_inline_query_chosen_chat, - callback_game=callback_game, - pay=pay, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_keyboard_markup.py b/env/Lib/site-packages/aiogram/types/inline_keyboard_markup.py deleted file mode 100644 index e5b8967..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_keyboard_markup.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List - -from .base import MutableTelegramObject - -if TYPE_CHECKING: - from .inline_keyboard_button import InlineKeyboardButton - - -class InlineKeyboardMarkup(MutableTelegramObject): - """ - This object represents an `inline keyboard `_ that appears right next to the message it belongs to. - - Source: https://core.telegram.org/bots/api#inlinekeyboardmarkup - """ - - inline_keyboard: List[List[InlineKeyboardButton]] - """Array of button rows, each represented by an Array of :class:`aiogram.types.inline_keyboard_button.InlineKeyboardButton` objects""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - inline_keyboard: List[List[InlineKeyboardButton]], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(inline_keyboard=inline_keyboard, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/inline_query.py b/env/Lib/site-packages/aiogram/types/inline_query.py deleted file mode 100644 index a0cad31..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query.py +++ /dev/null @@ -1,155 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from .base import TelegramObject - -if TYPE_CHECKING: - from ..methods import AnswerInlineQuery - from .inline_query_result_article import InlineQueryResultArticle - from .inline_query_result_audio import InlineQueryResultAudio - from .inline_query_result_cached_audio import InlineQueryResultCachedAudio - from .inline_query_result_cached_document import InlineQueryResultCachedDocument - from .inline_query_result_cached_gif import InlineQueryResultCachedGif - from .inline_query_result_cached_mpeg4_gif import InlineQueryResultCachedMpeg4Gif - from .inline_query_result_cached_photo import InlineQueryResultCachedPhoto - from .inline_query_result_cached_sticker import InlineQueryResultCachedSticker - from .inline_query_result_cached_video import InlineQueryResultCachedVideo - from .inline_query_result_cached_voice import InlineQueryResultCachedVoice - from .inline_query_result_contact import InlineQueryResultContact - from .inline_query_result_document import InlineQueryResultDocument - from .inline_query_result_game import InlineQueryResultGame - from .inline_query_result_gif import InlineQueryResultGif - from .inline_query_result_location import InlineQueryResultLocation - from .inline_query_result_mpeg4_gif import InlineQueryResultMpeg4Gif - from .inline_query_result_photo import InlineQueryResultPhoto - from .inline_query_result_venue import InlineQueryResultVenue - from .inline_query_result_video import InlineQueryResultVideo - from .inline_query_result_voice import InlineQueryResultVoice - from .inline_query_results_button import InlineQueryResultsButton - from .location import Location - from .user import User - - -class InlineQuery(TelegramObject): - """ - This object represents an incoming inline query. When the user sends an empty query, your bot could return some default or trending results. - - Source: https://core.telegram.org/bots/api#inlinequery - """ - - id: str - """Unique identifier for this query""" - from_user: User = Field(..., alias="from") - """Sender""" - query: str - """Text of the query (up to 256 characters)""" - offset: str - """Offset of the results to be returned, can be controlled by the bot""" - chat_type: Optional[str] = None - """*Optional*. Type of the chat from which the inline query was sent. Can be either 'sender' for a private chat with the inline query sender, 'private', 'group', 'supergroup', or 'channel'. The chat type should be always known for requests sent from official clients and most third-party clients, unless the request was sent from a secret chat""" - location: Optional[Location] = None - """*Optional*. Sender location, only for bots that request user location""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - id: str, - from_user: User, - query: str, - offset: str, - chat_type: Optional[str] = None, - location: Optional[Location] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - id=id, - from_user=from_user, - query=query, - offset=offset, - chat_type=chat_type, - location=location, - **__pydantic_kwargs, - ) - - def answer( - self, - results: List[ - Union[ - InlineQueryResultCachedAudio, - InlineQueryResultCachedDocument, - InlineQueryResultCachedGif, - InlineQueryResultCachedMpeg4Gif, - InlineQueryResultCachedPhoto, - InlineQueryResultCachedSticker, - InlineQueryResultCachedVideo, - InlineQueryResultCachedVoice, - InlineQueryResultArticle, - InlineQueryResultAudio, - InlineQueryResultContact, - InlineQueryResultGame, - InlineQueryResultDocument, - InlineQueryResultGif, - InlineQueryResultLocation, - InlineQueryResultMpeg4Gif, - InlineQueryResultPhoto, - InlineQueryResultVenue, - InlineQueryResultVideo, - InlineQueryResultVoice, - ] - ], - cache_time: Optional[int] = None, - is_personal: Optional[bool] = None, - next_offset: Optional[str] = None, - button: Optional[InlineQueryResultsButton] = None, - switch_pm_parameter: Optional[str] = None, - switch_pm_text: Optional[str] = None, - **kwargs: Any, - ) -> AnswerInlineQuery: - """ - Shortcut for method :class:`aiogram.methods.answer_inline_query.AnswerInlineQuery` - will automatically fill method attributes: - - - :code:`inline_query_id` - - Use this method to send answers to an inline query. On success, :code:`True` is returned. - - No more than **50** results per query are allowed. - - Source: https://core.telegram.org/bots/api#answerinlinequery - - :param results: A JSON-serialized array of results for the inline query - :param cache_time: The maximum amount of time in seconds that the result of the inline query may be cached on the server. Defaults to 300. - :param is_personal: Pass :code:`True` if results may be cached on the server side only for the user that sent the query. By default, results may be returned to any user who sends the same query. - :param next_offset: Pass the offset that a client should send in the next query with the same text to receive more results. Pass an empty string if there are no more results or if you don't support pagination. Offset length can't exceed 64 bytes. - :param button: A JSON-serialized object describing a button to be shown above inline query results - :param switch_pm_parameter: `Deep-linking `_ parameter for the /start message sent to the bot when user presses the switch button. 1-64 characters, only :code:`A-Z`, :code:`a-z`, :code:`0-9`, :code:`_` and :code:`-` are allowed. - :param switch_pm_text: If passed, clients will display a button with specified text that switches the user to a private chat with the bot and sends the bot a start message with the parameter *switch_pm_parameter* - :return: instance of method :class:`aiogram.methods.answer_inline_query.AnswerInlineQuery` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import AnswerInlineQuery - - return AnswerInlineQuery( - inline_query_id=self.id, - results=results, - cache_time=cache_time, - is_personal=is_personal, - next_offset=next_offset, - button=button, - switch_pm_parameter=switch_pm_parameter, - switch_pm_text=switch_pm_text, - **kwargs, - ).as_(self._bot) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result.py b/env/Lib/site-packages/aiogram/types/inline_query_result.py deleted file mode 100644 index b615aa2..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations - -from .base import MutableTelegramObject - - -class InlineQueryResult(MutableTelegramObject): - """ - This object represents one result of an inline query. Telegram clients currently support results of the following 20 types: - - - :class:`aiogram.types.inline_query_result_cached_audio.InlineQueryResultCachedAudio` - - :class:`aiogram.types.inline_query_result_cached_document.InlineQueryResultCachedDocument` - - :class:`aiogram.types.inline_query_result_cached_gif.InlineQueryResultCachedGif` - - :class:`aiogram.types.inline_query_result_cached_mpeg4_gif.InlineQueryResultCachedMpeg4Gif` - - :class:`aiogram.types.inline_query_result_cached_photo.InlineQueryResultCachedPhoto` - - :class:`aiogram.types.inline_query_result_cached_sticker.InlineQueryResultCachedSticker` - - :class:`aiogram.types.inline_query_result_cached_video.InlineQueryResultCachedVideo` - - :class:`aiogram.types.inline_query_result_cached_voice.InlineQueryResultCachedVoice` - - :class:`aiogram.types.inline_query_result_article.InlineQueryResultArticle` - - :class:`aiogram.types.inline_query_result_audio.InlineQueryResultAudio` - - :class:`aiogram.types.inline_query_result_contact.InlineQueryResultContact` - - :class:`aiogram.types.inline_query_result_game.InlineQueryResultGame` - - :class:`aiogram.types.inline_query_result_document.InlineQueryResultDocument` - - :class:`aiogram.types.inline_query_result_gif.InlineQueryResultGif` - - :class:`aiogram.types.inline_query_result_location.InlineQueryResultLocation` - - :class:`aiogram.types.inline_query_result_mpeg4_gif.InlineQueryResultMpeg4Gif` - - :class:`aiogram.types.inline_query_result_photo.InlineQueryResultPhoto` - - :class:`aiogram.types.inline_query_result_venue.InlineQueryResultVenue` - - :class:`aiogram.types.inline_query_result_video.InlineQueryResultVideo` - - :class:`aiogram.types.inline_query_result_voice.InlineQueryResultVoice` - - **Note:** All URLs passed in inline query results will be available to end users and therefore must be assumed to be **public**. - - Source: https://core.telegram.org/bots/api#inlinequeryresult - """ diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_article.py b/env/Lib/site-packages/aiogram/types/inline_query_result_article.py deleted file mode 100644 index c998738..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_article.py +++ /dev/null @@ -1,96 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional, Union - -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - - -class InlineQueryResultArticle(InlineQueryResult): - """ - Represents a link to an article or web page. - - Source: https://core.telegram.org/bots/api#inlinequeryresultarticle - """ - - type: Literal[InlineQueryResultType.ARTICLE] = InlineQueryResultType.ARTICLE - """Type of the result, must be *article*""" - id: str - """Unique identifier for this result, 1-64 Bytes""" - title: str - """Title of the result""" - input_message_content: Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - """Content of the message to be sent""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - url: Optional[str] = None - """*Optional*. URL of the result""" - hide_url: Optional[bool] = None - """*Optional*. Pass :code:`True` if you don't want the URL to be shown in the message""" - description: Optional[str] = None - """*Optional*. Short description of the result""" - thumbnail_url: Optional[str] = None - """*Optional*. Url of the thumbnail for the result""" - thumbnail_width: Optional[int] = None - """*Optional*. Thumbnail width""" - thumbnail_height: Optional[int] = None - """*Optional*. Thumbnail height""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.ARTICLE] = InlineQueryResultType.ARTICLE, - id: str, - title: str, - input_message_content: Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ], - reply_markup: Optional[InlineKeyboardMarkup] = None, - url: Optional[str] = None, - hide_url: Optional[bool] = None, - description: Optional[str] = None, - thumbnail_url: Optional[str] = None, - thumbnail_width: Optional[int] = None, - thumbnail_height: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - title=title, - input_message_content=input_message_content, - reply_markup=reply_markup, - url=url, - hide_url=hide_url, - description=description, - thumbnail_url=thumbnail_url, - thumbnail_width=thumbnail_width, - thumbnail_height=thumbnail_height, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_audio.py b/env/Lib/site-packages/aiogram/types/inline_query_result_audio.py deleted file mode 100644 index 56ef5f5..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_audio.py +++ /dev/null @@ -1,102 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultAudio(InlineQueryResult): - """ - Represents a link to an MP3 audio file. By default, this audio file will be sent by the user. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the audio. - - Source: https://core.telegram.org/bots/api#inlinequeryresultaudio - """ - - type: Literal[InlineQueryResultType.AUDIO] = InlineQueryResultType.AUDIO - """Type of the result, must be *audio*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - audio_url: str - """A valid URL for the audio file""" - title: str - """Title""" - caption: Optional[str] = None - """*Optional*. Caption, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the audio caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - performer: Optional[str] = None - """*Optional*. Performer""" - audio_duration: Optional[int] = None - """*Optional*. Audio duration in seconds""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the audio""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.AUDIO] = InlineQueryResultType.AUDIO, - id: str, - audio_url: str, - title: str, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - performer: Optional[str] = None, - audio_duration: Optional[int] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - audio_url=audio_url, - title=title, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - performer=performer, - audio_duration=audio_duration, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_audio.py b/env/Lib/site-packages/aiogram/types/inline_query_result_cached_audio.py deleted file mode 100644 index 27d923f..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_audio.py +++ /dev/null @@ -1,90 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultCachedAudio(InlineQueryResult): - """ - Represents a link to an MP3 audio file stored on the Telegram servers. By default, this audio file will be sent by the user. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the audio. - - Source: https://core.telegram.org/bots/api#inlinequeryresultcachedaudio - """ - - type: Literal[InlineQueryResultType.AUDIO] = InlineQueryResultType.AUDIO - """Type of the result, must be *audio*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - audio_file_id: str - """A valid file identifier for the audio file""" - caption: Optional[str] = None - """*Optional*. Caption, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the audio caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the audio""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.AUDIO] = InlineQueryResultType.AUDIO, - id: str, - audio_file_id: str, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - audio_file_id=audio_file_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_document.py b/env/Lib/site-packages/aiogram/types/inline_query_result_cached_document.py deleted file mode 100644 index 8e0355e..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_document.py +++ /dev/null @@ -1,98 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultCachedDocument(InlineQueryResult): - """ - Represents a link to a file stored on the Telegram servers. By default, this file will be sent by the user with an optional caption. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the file. - - Source: https://core.telegram.org/bots/api#inlinequeryresultcacheddocument - """ - - type: Literal[InlineQueryResultType.DOCUMENT] = InlineQueryResultType.DOCUMENT - """Type of the result, must be *document*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - title: str - """Title for the result""" - document_file_id: str - """A valid file identifier for the file""" - description: Optional[str] = None - """*Optional*. Short description of the result""" - caption: Optional[str] = None - """*Optional*. Caption of the document to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the document caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the file""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.DOCUMENT] = InlineQueryResultType.DOCUMENT, - id: str, - title: str, - document_file_id: str, - description: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - title=title, - document_file_id=document_file_id, - description=description, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_gif.py b/env/Lib/site-packages/aiogram/types/inline_query_result_cached_gif.py deleted file mode 100644 index 277454c..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_gif.py +++ /dev/null @@ -1,100 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultCachedGif(InlineQueryResult): - """ - Represents a link to an animated GIF file stored on the Telegram servers. By default, this animated GIF file will be sent by the user with an optional caption. Alternatively, you can use *input_message_content* to send a message with specified content instead of the animation. - - Source: https://core.telegram.org/bots/api#inlinequeryresultcachedgif - """ - - type: Literal[InlineQueryResultType.GIF] = InlineQueryResultType.GIF - """Type of the result, must be *gif*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - gif_file_id: str - """A valid file identifier for the GIF file""" - title: Optional[str] = None - """*Optional*. Title for the result""" - caption: Optional[str] = None - """*Optional*. Caption of the GIF file to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """*Optional*. Pass :code:`True`, if the caption must be shown above the message media""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the GIF animation""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.GIF] = InlineQueryResultType.GIF, - id: str, - gif_file_id: str, - title: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - gif_file_id=gif_file_id, - title=title, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_mpeg4_gif.py b/env/Lib/site-packages/aiogram/types/inline_query_result_cached_mpeg4_gif.py deleted file mode 100644 index ec04386..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_mpeg4_gif.py +++ /dev/null @@ -1,100 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultCachedMpeg4Gif(InlineQueryResult): - """ - Represents a link to a video animation (H.264/MPEG-4 AVC video without sound) stored on the Telegram servers. By default, this animated MPEG-4 file will be sent by the user with an optional caption. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the animation. - - Source: https://core.telegram.org/bots/api#inlinequeryresultcachedmpeg4gif - """ - - type: Literal[InlineQueryResultType.MPEG4_GIF] = InlineQueryResultType.MPEG4_GIF - """Type of the result, must be *mpeg4_gif*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - mpeg4_file_id: str - """A valid file identifier for the MPEG4 file""" - title: Optional[str] = None - """*Optional*. Title for the result""" - caption: Optional[str] = None - """*Optional*. Caption of the MPEG-4 file to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """*Optional*. Pass :code:`True`, if the caption must be shown above the message media""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the video animation""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.MPEG4_GIF] = InlineQueryResultType.MPEG4_GIF, - id: str, - mpeg4_file_id: str, - title: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - mpeg4_file_id=mpeg4_file_id, - title=title, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_photo.py b/env/Lib/site-packages/aiogram/types/inline_query_result_cached_photo.py deleted file mode 100644 index f40b203..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_photo.py +++ /dev/null @@ -1,104 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultCachedPhoto(InlineQueryResult): - """ - Represents a link to a photo stored on the Telegram servers. By default, this photo will be sent by the user with an optional caption. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the photo. - - Source: https://core.telegram.org/bots/api#inlinequeryresultcachedphoto - """ - - type: Literal[InlineQueryResultType.PHOTO] = InlineQueryResultType.PHOTO - """Type of the result, must be *photo*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - photo_file_id: str - """A valid file identifier of the photo""" - title: Optional[str] = None - """*Optional*. Title for the result""" - description: Optional[str] = None - """*Optional*. Short description of the result""" - caption: Optional[str] = None - """*Optional*. Caption of the photo to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the photo caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """*Optional*. Pass :code:`True`, if the caption must be shown above the message media""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the photo""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.PHOTO] = InlineQueryResultType.PHOTO, - id: str, - photo_file_id: str, - title: Optional[str] = None, - description: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - photo_file_id=photo_file_id, - title=title, - description=description, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_sticker.py b/env/Lib/site-packages/aiogram/types/inline_query_result_cached_sticker.py deleted file mode 100644 index 4300023..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_sticker.py +++ /dev/null @@ -1,76 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional, Union - -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - - -class InlineQueryResultCachedSticker(InlineQueryResult): - """ - Represents a link to a sticker stored on the Telegram servers. By default, this sticker will be sent by the user. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the sticker. - - Source: https://core.telegram.org/bots/api#inlinequeryresultcachedsticker - """ - - type: Literal[InlineQueryResultType.STICKER] = InlineQueryResultType.STICKER - """Type of the result, must be *sticker*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - sticker_file_id: str - """A valid file identifier of the sticker""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the sticker""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.STICKER] = InlineQueryResultType.STICKER, - id: str, - sticker_file_id: str, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - sticker_file_id=sticker_file_id, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_video.py b/env/Lib/site-packages/aiogram/types/inline_query_result_cached_video.py deleted file mode 100644 index 4095ab9..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_video.py +++ /dev/null @@ -1,104 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultCachedVideo(InlineQueryResult): - """ - Represents a link to a video file stored on the Telegram servers. By default, this video file will be sent by the user with an optional caption. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the video. - - Source: https://core.telegram.org/bots/api#inlinequeryresultcachedvideo - """ - - type: Literal[InlineQueryResultType.VIDEO] = InlineQueryResultType.VIDEO - """Type of the result, must be *video*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - video_file_id: str - """A valid file identifier for the video file""" - title: str - """Title for the result""" - description: Optional[str] = None - """*Optional*. Short description of the result""" - caption: Optional[str] = None - """*Optional*. Caption of the video to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the video caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """*Optional*. Pass :code:`True`, if the caption must be shown above the message media""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the video""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.VIDEO] = InlineQueryResultType.VIDEO, - id: str, - video_file_id: str, - title: str, - description: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - video_file_id=video_file_id, - title=title, - description=description, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_voice.py b/env/Lib/site-packages/aiogram/types/inline_query_result_cached_voice.py deleted file mode 100644 index 4cff896..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_cached_voice.py +++ /dev/null @@ -1,94 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultCachedVoice(InlineQueryResult): - """ - Represents a link to a voice message stored on the Telegram servers. By default, this voice message will be sent by the user. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the voice message. - - Source: https://core.telegram.org/bots/api#inlinequeryresultcachedvoice - """ - - type: Literal[InlineQueryResultType.VOICE] = InlineQueryResultType.VOICE - """Type of the result, must be *voice*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - voice_file_id: str - """A valid file identifier for the voice message""" - title: str - """Voice message title""" - caption: Optional[str] = None - """*Optional*. Caption, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the voice message caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the voice message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.VOICE] = InlineQueryResultType.VOICE, - id: str, - voice_file_id: str, - title: str, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - voice_file_id=voice_file_id, - title=title, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_contact.py b/env/Lib/site-packages/aiogram/types/inline_query_result_contact.py deleted file mode 100644 index cc2900c..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_contact.py +++ /dev/null @@ -1,100 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional, Union - -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - - -class InlineQueryResultContact(InlineQueryResult): - """ - Represents a contact with a phone number. By default, this contact will be sent by the user. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the contact. - - Source: https://core.telegram.org/bots/api#inlinequeryresultcontact - """ - - type: Literal[InlineQueryResultType.CONTACT] = InlineQueryResultType.CONTACT - """Type of the result, must be *contact*""" - id: str - """Unique identifier for this result, 1-64 Bytes""" - phone_number: str - """Contact's phone number""" - first_name: str - """Contact's first name""" - last_name: Optional[str] = None - """*Optional*. Contact's last name""" - vcard: Optional[str] = None - """*Optional*. Additional data about the contact in the form of a `vCard `_, 0-2048 bytes""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the contact""" - thumbnail_url: Optional[str] = None - """*Optional*. Url of the thumbnail for the result""" - thumbnail_width: Optional[int] = None - """*Optional*. Thumbnail width""" - thumbnail_height: Optional[int] = None - """*Optional*. Thumbnail height""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.CONTACT] = InlineQueryResultType.CONTACT, - id: str, - phone_number: str, - first_name: str, - last_name: Optional[str] = None, - vcard: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - thumbnail_url: Optional[str] = None, - thumbnail_width: Optional[int] = None, - thumbnail_height: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - phone_number=phone_number, - first_name=first_name, - last_name=last_name, - vcard=vcard, - reply_markup=reply_markup, - input_message_content=input_message_content, - thumbnail_url=thumbnail_url, - thumbnail_width=thumbnail_width, - thumbnail_height=thumbnail_height, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_document.py b/env/Lib/site-packages/aiogram/types/inline_query_result_document.py deleted file mode 100644 index 86ae993..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_document.py +++ /dev/null @@ -1,114 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultDocument(InlineQueryResult): - """ - Represents a link to a file. By default, this file will be sent by the user with an optional caption. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the file. Currently, only **.PDF** and **.ZIP** files can be sent using this method. - - Source: https://core.telegram.org/bots/api#inlinequeryresultdocument - """ - - type: Literal[InlineQueryResultType.DOCUMENT] = InlineQueryResultType.DOCUMENT - """Type of the result, must be *document*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - title: str - """Title for the result""" - document_url: str - """A valid URL for the file""" - mime_type: str - """MIME type of the content of the file, either 'application/pdf' or 'application/zip'""" - caption: Optional[str] = None - """*Optional*. Caption of the document to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the document caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - description: Optional[str] = None - """*Optional*. Short description of the result""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. Inline keyboard attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the file""" - thumbnail_url: Optional[str] = None - """*Optional*. URL of the thumbnail (JPEG only) for the file""" - thumbnail_width: Optional[int] = None - """*Optional*. Thumbnail width""" - thumbnail_height: Optional[int] = None - """*Optional*. Thumbnail height""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.DOCUMENT] = InlineQueryResultType.DOCUMENT, - id: str, - title: str, - document_url: str, - mime_type: str, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - description: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - thumbnail_url: Optional[str] = None, - thumbnail_width: Optional[int] = None, - thumbnail_height: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - title=title, - document_url=document_url, - mime_type=mime_type, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - description=description, - reply_markup=reply_markup, - input_message_content=input_message_content, - thumbnail_url=thumbnail_url, - thumbnail_width=thumbnail_width, - thumbnail_height=thumbnail_height, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_game.py b/env/Lib/site-packages/aiogram/types/inline_query_result_game.py deleted file mode 100644 index 3c7dcde..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_game.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional - -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - - -class InlineQueryResultGame(InlineQueryResult): - """ - Represents a `Game `_. - - Source: https://core.telegram.org/bots/api#inlinequeryresultgame - """ - - type: Literal[InlineQueryResultType.GAME] = InlineQueryResultType.GAME - """Type of the result, must be *game*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - game_short_name: str - """Short name of the game""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.GAME] = InlineQueryResultType.GAME, - id: str, - game_short_name: str, - reply_markup: Optional[InlineKeyboardMarkup] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - game_short_name=game_short_name, - reply_markup=reply_markup, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_gif.py b/env/Lib/site-packages/aiogram/types/inline_query_result_gif.py deleted file mode 100644 index 3ad0eef..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_gif.py +++ /dev/null @@ -1,121 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .base import UNSET_PARSE_MODE -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultGif(InlineQueryResult): - """ - Represents a link to an animated GIF file. By default, this animated GIF file will be sent by the user with optional caption. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the animation. - - Source: https://core.telegram.org/bots/api#inlinequeryresultgif - """ - - type: Literal[InlineQueryResultType.GIF] = InlineQueryResultType.GIF - """Type of the result, must be *gif*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - gif_url: str - """A valid URL for the GIF file. File size must not exceed 1MB""" - thumbnail_url: str - """URL of the static (JPEG or GIF) or animated (MPEG4) thumbnail for the result""" - gif_width: Optional[int] = None - """*Optional*. Width of the GIF""" - gif_height: Optional[int] = None - """*Optional*. Height of the GIF""" - gif_duration: Optional[int] = None - """*Optional*. Duration of the GIF in seconds""" - thumbnail_mime_type: Optional[str] = None - """*Optional*. MIME type of the thumbnail, must be one of 'image/jpeg', 'image/gif', or 'video/mp4'. Defaults to 'image/jpeg'""" - title: Optional[str] = None - """*Optional*. Title for the result""" - caption: Optional[str] = None - """*Optional*. Caption of the GIF file to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """*Optional*. Pass :code:`True`, if the caption must be shown above the message media""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the GIF animation""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.GIF] = InlineQueryResultType.GIF, - id: str, - gif_url: str, - thumbnail_url: str, - gif_width: Optional[int] = None, - gif_height: Optional[int] = None, - gif_duration: Optional[int] = None, - thumbnail_mime_type: Optional[str] = None, - title: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - gif_url=gif_url, - thumbnail_url=thumbnail_url, - gif_width=gif_width, - gif_height=gif_height, - gif_duration=gif_duration, - thumbnail_mime_type=thumbnail_mime_type, - title=title, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_location.py b/env/Lib/site-packages/aiogram/types/inline_query_result_location.py deleted file mode 100644 index 50b3ed8..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_location.py +++ /dev/null @@ -1,112 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional, Union - -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - - -class InlineQueryResultLocation(InlineQueryResult): - """ - Represents a location on a map. By default, the location will be sent by the user. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the location. - - Source: https://core.telegram.org/bots/api#inlinequeryresultlocation - """ - - type: Literal[InlineQueryResultType.LOCATION] = InlineQueryResultType.LOCATION - """Type of the result, must be *location*""" - id: str - """Unique identifier for this result, 1-64 Bytes""" - latitude: float - """Location latitude in degrees""" - longitude: float - """Location longitude in degrees""" - title: str - """Location title""" - horizontal_accuracy: Optional[float] = None - """*Optional*. The radius of uncertainty for the location, measured in meters; 0-1500""" - live_period: Optional[int] = None - """*Optional*. Period in seconds during which the location can be updated, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely.""" - heading: Optional[int] = None - """*Optional*. For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.""" - proximity_alert_radius: Optional[int] = None - """*Optional*. For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the location""" - thumbnail_url: Optional[str] = None - """*Optional*. Url of the thumbnail for the result""" - thumbnail_width: Optional[int] = None - """*Optional*. Thumbnail width""" - thumbnail_height: Optional[int] = None - """*Optional*. Thumbnail height""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.LOCATION] = InlineQueryResultType.LOCATION, - id: str, - latitude: float, - longitude: float, - title: str, - horizontal_accuracy: Optional[float] = None, - live_period: Optional[int] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - thumbnail_url: Optional[str] = None, - thumbnail_width: Optional[int] = None, - thumbnail_height: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - latitude=latitude, - longitude=longitude, - title=title, - horizontal_accuracy=horizontal_accuracy, - live_period=live_period, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - reply_markup=reply_markup, - input_message_content=input_message_content, - thumbnail_url=thumbnail_url, - thumbnail_width=thumbnail_width, - thumbnail_height=thumbnail_height, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_mpeg4_gif.py b/env/Lib/site-packages/aiogram/types/inline_query_result_mpeg4_gif.py deleted file mode 100644 index 6ca282e..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_mpeg4_gif.py +++ /dev/null @@ -1,120 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultMpeg4Gif(InlineQueryResult): - """ - Represents a link to a video animation (H.264/MPEG-4 AVC video without sound). By default, this animated MPEG-4 file will be sent by the user with optional caption. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the animation. - - Source: https://core.telegram.org/bots/api#inlinequeryresultmpeg4gif - """ - - type: Literal[InlineQueryResultType.MPEG4_GIF] = InlineQueryResultType.MPEG4_GIF - """Type of the result, must be *mpeg4_gif*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - mpeg4_url: str - """A valid URL for the MPEG4 file. File size must not exceed 1MB""" - thumbnail_url: str - """URL of the static (JPEG or GIF) or animated (MPEG4) thumbnail for the result""" - mpeg4_width: Optional[int] = None - """*Optional*. Video width""" - mpeg4_height: Optional[int] = None - """*Optional*. Video height""" - mpeg4_duration: Optional[int] = None - """*Optional*. Video duration in seconds""" - thumbnail_mime_type: Optional[str] = None - """*Optional*. MIME type of the thumbnail, must be one of 'image/jpeg', 'image/gif', or 'video/mp4'. Defaults to 'image/jpeg'""" - title: Optional[str] = None - """*Optional*. Title for the result""" - caption: Optional[str] = None - """*Optional*. Caption of the MPEG-4 file to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """*Optional*. Pass :code:`True`, if the caption must be shown above the message media""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the video animation""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.MPEG4_GIF] = InlineQueryResultType.MPEG4_GIF, - id: str, - mpeg4_url: str, - thumbnail_url: str, - mpeg4_width: Optional[int] = None, - mpeg4_height: Optional[int] = None, - mpeg4_duration: Optional[int] = None, - thumbnail_mime_type: Optional[str] = None, - title: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - mpeg4_url=mpeg4_url, - thumbnail_url=thumbnail_url, - mpeg4_width=mpeg4_width, - mpeg4_height=mpeg4_height, - mpeg4_duration=mpeg4_duration, - thumbnail_mime_type=thumbnail_mime_type, - title=title, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_photo.py b/env/Lib/site-packages/aiogram/types/inline_query_result_photo.py deleted file mode 100644 index 02f6841..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_photo.py +++ /dev/null @@ -1,116 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultPhoto(InlineQueryResult): - """ - Represents a link to a photo. By default, this photo will be sent by the user with optional caption. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the photo. - - Source: https://core.telegram.org/bots/api#inlinequeryresultphoto - """ - - type: Literal[InlineQueryResultType.PHOTO] = InlineQueryResultType.PHOTO - """Type of the result, must be *photo*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - photo_url: str - """A valid URL of the photo. Photo must be in **JPEG** format. Photo size must not exceed 5MB""" - thumbnail_url: str - """URL of the thumbnail for the photo""" - photo_width: Optional[int] = None - """*Optional*. Width of the photo""" - photo_height: Optional[int] = None - """*Optional*. Height of the photo""" - title: Optional[str] = None - """*Optional*. Title for the result""" - description: Optional[str] = None - """*Optional*. Short description of the result""" - caption: Optional[str] = None - """*Optional*. Caption of the photo to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the photo caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """*Optional*. Pass :code:`True`, if the caption must be shown above the message media""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the photo""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.PHOTO] = InlineQueryResultType.PHOTO, - id: str, - photo_url: str, - thumbnail_url: str, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - title: Optional[str] = None, - description: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - photo_url=photo_url, - thumbnail_url=thumbnail_url, - photo_width=photo_width, - photo_height=photo_height, - title=title, - description=description, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_venue.py b/env/Lib/site-packages/aiogram/types/inline_query_result_venue.py deleted file mode 100644 index b8775b6..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_venue.py +++ /dev/null @@ -1,116 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional, Union - -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - - -class InlineQueryResultVenue(InlineQueryResult): - """ - Represents a venue. By default, the venue will be sent by the user. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the venue. - - Source: https://core.telegram.org/bots/api#inlinequeryresultvenue - """ - - type: Literal[InlineQueryResultType.VENUE] = InlineQueryResultType.VENUE - """Type of the result, must be *venue*""" - id: str - """Unique identifier for this result, 1-64 Bytes""" - latitude: float - """Latitude of the venue location in degrees""" - longitude: float - """Longitude of the venue location in degrees""" - title: str - """Title of the venue""" - address: str - """Address of the venue""" - foursquare_id: Optional[str] = None - """*Optional*. Foursquare identifier of the venue if known""" - foursquare_type: Optional[str] = None - """*Optional*. Foursquare type of the venue, if known. (For example, 'arts_entertainment/default', 'arts_entertainment/aquarium' or 'food/icecream'.)""" - google_place_id: Optional[str] = None - """*Optional*. Google Places identifier of the venue""" - google_place_type: Optional[str] = None - """*Optional*. Google Places type of the venue. (See `supported types `_.)""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the venue""" - thumbnail_url: Optional[str] = None - """*Optional*. Url of the thumbnail for the result""" - thumbnail_width: Optional[int] = None - """*Optional*. Thumbnail width""" - thumbnail_height: Optional[int] = None - """*Optional*. Thumbnail height""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.VENUE] = InlineQueryResultType.VENUE, - id: str, - latitude: float, - longitude: float, - title: str, - address: str, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - thumbnail_url: Optional[str] = None, - thumbnail_width: Optional[int] = None, - thumbnail_height: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - latitude=latitude, - longitude=longitude, - title=title, - address=address, - foursquare_id=foursquare_id, - foursquare_type=foursquare_type, - google_place_id=google_place_id, - google_place_type=google_place_type, - reply_markup=reply_markup, - input_message_content=input_message_content, - thumbnail_url=thumbnail_url, - thumbnail_width=thumbnail_width, - thumbnail_height=thumbnail_height, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_video.py b/env/Lib/site-packages/aiogram/types/inline_query_result_video.py deleted file mode 100644 index 52332fd..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_video.py +++ /dev/null @@ -1,126 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultVideo(InlineQueryResult): - """ - Represents a link to a page containing an embedded video player or a video file. By default, this video file will be sent by the user with an optional caption. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the video. - - If an InlineQueryResultVideo message contains an embedded video (e.g., YouTube), you **must** replace its content using *input_message_content*. - - Source: https://core.telegram.org/bots/api#inlinequeryresultvideo - """ - - type: Literal[InlineQueryResultType.VIDEO] = InlineQueryResultType.VIDEO - """Type of the result, must be *video*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - video_url: str - """A valid URL for the embedded video player or video file""" - mime_type: str - """MIME type of the content of the video URL, 'text/html' or 'video/mp4'""" - thumbnail_url: str - """URL of the thumbnail (JPEG only) for the video""" - title: str - """Title for the result""" - caption: Optional[str] = None - """*Optional*. Caption of the video to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the video caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """*Optional*. Pass :code:`True`, if the caption must be shown above the message media""" - video_width: Optional[int] = None - """*Optional*. Video width""" - video_height: Optional[int] = None - """*Optional*. Video height""" - video_duration: Optional[int] = None - """*Optional*. Video duration in seconds""" - description: Optional[str] = None - """*Optional*. Short description of the result""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the video. This field is **required** if InlineQueryResultVideo is used to send an HTML-page as a result (e.g., a YouTube video).""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.VIDEO] = InlineQueryResultType.VIDEO, - id: str, - video_url: str, - mime_type: str, - thumbnail_url: str, - title: str, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - video_width: Optional[int] = None, - video_height: Optional[int] = None, - video_duration: Optional[int] = None, - description: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - video_url=video_url, - mime_type=mime_type, - thumbnail_url=thumbnail_url, - title=title, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - video_width=video_width, - video_height=video_height, - video_duration=video_duration, - description=description, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_result_voice.py b/env/Lib/site-packages/aiogram/types/inline_query_result_voice.py deleted file mode 100644 index a781fc6..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_result_voice.py +++ /dev/null @@ -1,98 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InlineQueryResultType -from .inline_query_result import InlineQueryResult - -if TYPE_CHECKING: - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_contact_message_content import InputContactMessageContent - from .input_invoice_message_content import InputInvoiceMessageContent - from .input_location_message_content import InputLocationMessageContent - from .input_text_message_content import InputTextMessageContent - from .input_venue_message_content import InputVenueMessageContent - from .message_entity import MessageEntity - - -class InlineQueryResultVoice(InlineQueryResult): - """ - Represents a link to a voice recording in an .OGG container encoded with OPUS. By default, this voice recording will be sent by the user. Alternatively, you can use *input_message_content* to send a message with the specified content instead of the the voice message. - - Source: https://core.telegram.org/bots/api#inlinequeryresultvoice - """ - - type: Literal[InlineQueryResultType.VOICE] = InlineQueryResultType.VOICE - """Type of the result, must be *voice*""" - id: str - """Unique identifier for this result, 1-64 bytes""" - voice_url: str - """A valid URL for the voice recording""" - title: str - """Recording title""" - caption: Optional[str] = None - """*Optional*. Caption, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the voice message caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - voice_duration: Optional[int] = None - """*Optional*. Recording duration in seconds""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. `Inline keyboard `_ attached to the message""" - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None - """*Optional*. Content of the message to be sent instead of the voice recording""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InlineQueryResultType.VOICE] = InlineQueryResultType.VOICE, - id: str, - voice_url: str, - title: str, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - voice_duration: Optional[int] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - input_message_content: Optional[ - Union[ - InputTextMessageContent, - InputLocationMessageContent, - InputVenueMessageContent, - InputContactMessageContent, - InputInvoiceMessageContent, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - id=id, - voice_url=voice_url, - title=title, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - voice_duration=voice_duration, - reply_markup=reply_markup, - input_message_content=input_message_content, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/inline_query_results_button.py b/env/Lib/site-packages/aiogram/types/inline_query_results_button.py deleted file mode 100644 index 6943fb8..0000000 --- a/env/Lib/site-packages/aiogram/types/inline_query_results_button.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .web_app_info import WebAppInfo - - -class InlineQueryResultsButton(TelegramObject): - """ - This object represents a button to be shown above inline query results. You **must** use exactly one of the optional fields. - - Source: https://core.telegram.org/bots/api#inlinequeryresultsbutton - """ - - text: str - """Label text on the button""" - web_app: Optional[WebAppInfo] = None - """*Optional*. Description of the `Web App `_ that will be launched when the user presses the button. The Web App will be able to switch back to the inline mode using the method `switchInlineQuery `_ inside the Web App.""" - start_parameter: Optional[str] = None - """*Optional*. `Deep-linking `_ parameter for the /start message sent to the bot when a user presses the button. 1-64 characters, only :code:`A-Z`, :code:`a-z`, :code:`0-9`, :code:`_` and :code:`-` are allowed.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - text: str, - web_app: Optional[WebAppInfo] = None, - start_parameter: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - text=text, web_app=web_app, start_parameter=start_parameter, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/input_contact_message_content.py b/env/Lib/site-packages/aiogram/types/input_contact_message_content.py deleted file mode 100644 index 8bcb581..0000000 --- a/env/Lib/site-packages/aiogram/types/input_contact_message_content.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .input_message_content import InputMessageContent - - -class InputContactMessageContent(InputMessageContent): - """ - Represents the `content `_ of a contact message to be sent as the result of an inline query. - - Source: https://core.telegram.org/bots/api#inputcontactmessagecontent - """ - - phone_number: str - """Contact's phone number""" - first_name: str - """Contact's first name""" - last_name: Optional[str] = None - """*Optional*. Contact's last name""" - vcard: Optional[str] = None - """*Optional*. Additional data about the contact in the form of a `vCard `_, 0-2048 bytes""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - phone_number: str, - first_name: str, - last_name: Optional[str] = None, - vcard: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - phone_number=phone_number, - first_name=first_name, - last_name=last_name, - vcard=vcard, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/input_file.py b/env/Lib/site-packages/aiogram/types/input_file.py deleted file mode 100644 index 5b73059..0000000 --- a/env/Lib/site-packages/aiogram/types/input_file.py +++ /dev/null @@ -1,149 +0,0 @@ -from __future__ import annotations - -import io -import os -from abc import ABC, abstractmethod -from pathlib import Path -from typing import TYPE_CHECKING, Any, AsyncGenerator, Dict, Optional, Union - -import aiofiles - -if TYPE_CHECKING: - from aiogram.client.bot import Bot - -DEFAULT_CHUNK_SIZE = 64 * 1024 # 64 kb - - -class InputFile(ABC): - """ - This object represents the contents of a file to be uploaded. Must be posted using multipart/form-data in the usual way that files are uploaded via the browser. - - Source: https://core.telegram.org/bots/api#inputfile - """ - - def __init__(self, filename: Optional[str] = None, chunk_size: int = DEFAULT_CHUNK_SIZE): - """ - Base class for input files. Should not be used directly. - Look at :class:`BufferedInputFile`, :class:`FSInputFile` :class:`URLInputFile` - - :param filename: name of the given file - :param chunk_size: reader chunks size - """ - self.filename = filename - self.chunk_size = chunk_size - - @abstractmethod - async def read(self, bot: "Bot") -> AsyncGenerator[bytes, None]: # pragma: no cover - yield b"" - - -class BufferedInputFile(InputFile): - def __init__(self, file: bytes, filename: str, chunk_size: int = DEFAULT_CHUNK_SIZE): - """ - Represents object for uploading files from filesystem - - :param file: Bytes - :param filename: Filename to be propagated to telegram. - :param chunk_size: Uploading chunk size - """ - super().__init__(filename=filename, chunk_size=chunk_size) - - self.data = file - - @classmethod - def from_file( - cls, - path: Union[str, Path], - filename: Optional[str] = None, - chunk_size: int = DEFAULT_CHUNK_SIZE, - ) -> BufferedInputFile: - """ - Create buffer from file - - :param path: Path to file - :param filename: Filename to be propagated to telegram. - By default, will be parsed from path - :param chunk_size: Uploading chunk size - :return: instance of :obj:`BufferedInputFile` - """ - if filename is None: - filename = os.path.basename(path) - with open(path, "rb") as f: - data = f.read() - return cls(data, filename=filename, chunk_size=chunk_size) - - async def read(self, bot: "Bot") -> AsyncGenerator[bytes, None]: - buffer = io.BytesIO(self.data) - while chunk := buffer.read(self.chunk_size): - yield chunk - - -class FSInputFile(InputFile): - def __init__( - self, - path: Union[str, Path], - filename: Optional[str] = None, - chunk_size: int = DEFAULT_CHUNK_SIZE, - ): - """ - Represents object for uploading files from filesystem - - :param path: Path to file - :param filename: Filename to be propagated to telegram. - By default, will be parsed from path - :param chunk_size: Uploading chunk size - """ - if filename is None: - filename = os.path.basename(path) - super().__init__(filename=filename, chunk_size=chunk_size) - - self.path = path - - async def read(self, bot: "Bot") -> AsyncGenerator[bytes, None]: - async with aiofiles.open(self.path, "rb") as f: - while chunk := await f.read(self.chunk_size): - yield chunk - - -class URLInputFile(InputFile): - def __init__( - self, - url: str, - headers: Optional[Dict[str, Any]] = None, - filename: Optional[str] = None, - chunk_size: int = DEFAULT_CHUNK_SIZE, - timeout: int = 30, - bot: Optional["Bot"] = None, - ): - """ - Represents object for streaming files from internet - - :param url: URL in internet - :param headers: HTTP Headers - :param filename: Filename to be propagated to telegram. - :param chunk_size: Uploading chunk size - :param timeout: Timeout for downloading - :param bot: Bot instance to use HTTP session from. - If not specified, will be used current bot - """ - super().__init__(filename=filename, chunk_size=chunk_size) - if headers is None: - headers = {} - - self.url = url - self.headers = headers - self.timeout = timeout - self.bot = bot - - async def read(self, bot: "Bot") -> AsyncGenerator[bytes, None]: - bot = self.bot or bot - stream = bot.session.stream_content( - url=self.url, - headers=self.headers, - timeout=self.timeout, - chunk_size=self.chunk_size, - raise_for_status=True, - ) - - async for chunk in stream: - yield chunk diff --git a/env/Lib/site-packages/aiogram/types/input_invoice_message_content.py b/env/Lib/site-packages/aiogram/types/input_invoice_message_content.py deleted file mode 100644 index 0dbb6d2..0000000 --- a/env/Lib/site-packages/aiogram/types/input_invoice_message_content.py +++ /dev/null @@ -1,114 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from .input_message_content import InputMessageContent - -if TYPE_CHECKING: - from .labeled_price import LabeledPrice - - -class InputInvoiceMessageContent(InputMessageContent): - """ - Represents the `content `_ of an invoice message to be sent as the result of an inline query. - - Source: https://core.telegram.org/bots/api#inputinvoicemessagecontent - """ - - title: str - """Product name, 1-32 characters""" - description: str - """Product description, 1-255 characters""" - payload: str - """Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes.""" - currency: str - """Three-letter ISO 4217 currency code, see `more on currencies `_. Pass 'XTR' for payments in `Telegram Stars `_.""" - prices: List[LabeledPrice] - """Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in `Telegram Stars `_.""" - provider_token: Optional[str] = None - """*Optional*. Payment provider token, obtained via `@BotFather `_. Pass an empty string for payments in `Telegram Stars `_.""" - max_tip_amount: Optional[int] = None - """*Optional*. The maximum accepted amount for tips in the *smallest units* of the currency (integer, **not** float/double). For example, for a maximum tip of :code:`US$ 1.45` pass :code:`max_tip_amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in `Telegram Stars `_.""" - suggested_tip_amounts: Optional[List[int]] = None - """*Optional*. A JSON-serialized array of suggested amounts of tip in the *smallest units* of the currency (integer, **not** float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed *max_tip_amount*.""" - provider_data: Optional[str] = None - """*Optional*. A JSON-serialized object for data about the invoice, which will be shared with the payment provider. A detailed description of the required fields should be provided by the payment provider.""" - photo_url: Optional[str] = None - """*Optional*. URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service.""" - photo_size: Optional[int] = None - """*Optional*. Photo size in bytes""" - photo_width: Optional[int] = None - """*Optional*. Photo width""" - photo_height: Optional[int] = None - """*Optional*. Photo height""" - need_name: Optional[bool] = None - """*Optional*. Pass :code:`True` if you require the user's full name to complete the order. Ignored for payments in `Telegram Stars `_.""" - need_phone_number: Optional[bool] = None - """*Optional*. Pass :code:`True` if you require the user's phone number to complete the order. Ignored for payments in `Telegram Stars `_.""" - need_email: Optional[bool] = None - """*Optional*. Pass :code:`True` if you require the user's email address to complete the order. Ignored for payments in `Telegram Stars `_.""" - need_shipping_address: Optional[bool] = None - """*Optional*. Pass :code:`True` if you require the user's shipping address to complete the order. Ignored for payments in `Telegram Stars `_.""" - send_phone_number_to_provider: Optional[bool] = None - """*Optional*. Pass :code:`True` if the user's phone number should be sent to the provider. Ignored for payments in `Telegram Stars `_.""" - send_email_to_provider: Optional[bool] = None - """*Optional*. Pass :code:`True` if the user's email address should be sent to the provider. Ignored for payments in `Telegram Stars `_.""" - is_flexible: Optional[bool] = None - """*Optional*. Pass :code:`True` if the final price depends on the shipping method. Ignored for payments in `Telegram Stars `_.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - title: str, - description: str, - payload: str, - currency: str, - prices: List[LabeledPrice], - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[List[int]] = None, - provider_data: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - title=title, - description=description, - payload=payload, - currency=currency, - prices=prices, - provider_token=provider_token, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - provider_data=provider_data, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - is_flexible=is_flexible, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/input_location_message_content.py b/env/Lib/site-packages/aiogram/types/input_location_message_content.py deleted file mode 100644 index 83400c1..0000000 --- a/env/Lib/site-packages/aiogram/types/input_location_message_content.py +++ /dev/null @@ -1,55 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .input_message_content import InputMessageContent - - -class InputLocationMessageContent(InputMessageContent): - """ - Represents the `content `_ of a location message to be sent as the result of an inline query. - - Source: https://core.telegram.org/bots/api#inputlocationmessagecontent - """ - - latitude: float - """Latitude of the location in degrees""" - longitude: float - """Longitude of the location in degrees""" - horizontal_accuracy: Optional[float] = None - """*Optional*. The radius of uncertainty for the location, measured in meters; 0-1500""" - live_period: Optional[int] = None - """*Optional*. Period in seconds during which the location can be updated, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely.""" - heading: Optional[int] = None - """*Optional*. For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified.""" - proximity_alert_radius: Optional[int] = None - """*Optional*. For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - latitude: float, - longitude: float, - horizontal_accuracy: Optional[float] = None, - live_period: Optional[int] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - latitude=latitude, - longitude=longitude, - horizontal_accuracy=horizontal_accuracy, - live_period=live_period, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/input_media.py b/env/Lib/site-packages/aiogram/types/input_media.py deleted file mode 100644 index f7523c9..0000000 --- a/env/Lib/site-packages/aiogram/types/input_media.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import annotations - -from .base import MutableTelegramObject - - -class InputMedia(MutableTelegramObject): - """ - This object represents the content of a media message to be sent. It should be one of - - - :class:`aiogram.types.input_media_animation.InputMediaAnimation` - - :class:`aiogram.types.input_media_document.InputMediaDocument` - - :class:`aiogram.types.input_media_audio.InputMediaAudio` - - :class:`aiogram.types.input_media_photo.InputMediaPhoto` - - :class:`aiogram.types.input_media_video.InputMediaVideo` - - Source: https://core.telegram.org/bots/api#inputmedia - """ diff --git a/env/Lib/site-packages/aiogram/types/input_media_animation.py b/env/Lib/site-packages/aiogram/types/input_media_animation.py deleted file mode 100644 index a0251f2..0000000 --- a/env/Lib/site-packages/aiogram/types/input_media_animation.py +++ /dev/null @@ -1,83 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InputMediaType -from .input_media import InputMedia - -if TYPE_CHECKING: - from .input_file import InputFile - from .message_entity import MessageEntity - - -class InputMediaAnimation(InputMedia): - """ - Represents an animation file (GIF or H.264/MPEG-4 AVC video without sound) to be sent. - - Source: https://core.telegram.org/bots/api#inputmediaanimation - """ - - type: Literal[InputMediaType.ANIMATION] = InputMediaType.ANIMATION - """Type of the result, must be *animation*""" - media: Union[str, InputFile] - """File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass 'attach://' to upload a new one using multipart/form-data under name. :ref:`More information on Sending Files » `""" - thumbnail: Optional[InputFile] = None - """*Optional*. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » `""" - caption: Optional[str] = None - """*Optional*. Caption of the animation to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the animation caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """*Optional*. Pass :code:`True`, if the caption must be shown above the message media""" - width: Optional[int] = None - """*Optional*. Animation width""" - height: Optional[int] = None - """*Optional*. Animation height""" - duration: Optional[int] = None - """*Optional*. Animation duration in seconds""" - has_spoiler: Optional[bool] = None - """*Optional*. Pass :code:`True` if the animation needs to be covered with a spoiler animation""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InputMediaType.ANIMATION] = InputMediaType.ANIMATION, - media: Union[str, InputFile], - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - width: Optional[int] = None, - height: Optional[int] = None, - duration: Optional[int] = None, - has_spoiler: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - media=media, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - width=width, - height=height, - duration=duration, - has_spoiler=has_spoiler, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/input_media_audio.py b/env/Lib/site-packages/aiogram/types/input_media_audio.py deleted file mode 100644 index c372201..0000000 --- a/env/Lib/site-packages/aiogram/types/input_media_audio.py +++ /dev/null @@ -1,73 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InputMediaType -from .input_media import InputMedia - -if TYPE_CHECKING: - from .input_file import InputFile - from .message_entity import MessageEntity - - -class InputMediaAudio(InputMedia): - """ - Represents an audio file to be treated as music to be sent. - - Source: https://core.telegram.org/bots/api#inputmediaaudio - """ - - type: Literal[InputMediaType.AUDIO] = InputMediaType.AUDIO - """Type of the result, must be *audio*""" - media: Union[str, InputFile] - """File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass 'attach://' to upload a new one using multipart/form-data under name. :ref:`More information on Sending Files » `""" - thumbnail: Optional[InputFile] = None - """*Optional*. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » `""" - caption: Optional[str] = None - """*Optional*. Caption of the audio to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the audio caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - duration: Optional[int] = None - """*Optional*. Duration of the audio in seconds""" - performer: Optional[str] = None - """*Optional*. Performer of the audio""" - title: Optional[str] = None - """*Optional*. Title of the audio""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InputMediaType.AUDIO] = InputMediaType.AUDIO, - media: Union[str, InputFile], - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - media=media, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - performer=performer, - title=title, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/input_media_document.py b/env/Lib/site-packages/aiogram/types/input_media_document.py deleted file mode 100644 index 7c24b92..0000000 --- a/env/Lib/site-packages/aiogram/types/input_media_document.py +++ /dev/null @@ -1,65 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InputMediaType -from .input_media import InputMedia - -if TYPE_CHECKING: - from .input_file import InputFile - from .message_entity import MessageEntity - - -class InputMediaDocument(InputMedia): - """ - Represents a general file to be sent. - - Source: https://core.telegram.org/bots/api#inputmediadocument - """ - - type: Literal[InputMediaType.DOCUMENT] = InputMediaType.DOCUMENT - """Type of the result, must be *document*""" - media: Union[str, InputFile] - """File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass 'attach://' to upload a new one using multipart/form-data under name. :ref:`More information on Sending Files » `""" - thumbnail: Optional[InputFile] = None - """*Optional*. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » `""" - caption: Optional[str] = None - """*Optional*. Caption of the document to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the document caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - disable_content_type_detection: Optional[bool] = None - """*Optional*. Disables automatic server-side content type detection for files uploaded using multipart/form-data. Always :code:`True`, if the document is sent as part of an album.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InputMediaType.DOCUMENT] = InputMediaType.DOCUMENT, - media: Union[str, InputFile], - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - disable_content_type_detection: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - media=media, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_content_type_detection=disable_content_type_detection, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/input_media_photo.py b/env/Lib/site-packages/aiogram/types/input_media_photo.py deleted file mode 100644 index 19daa26..0000000 --- a/env/Lib/site-packages/aiogram/types/input_media_photo.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InputMediaType -from .input_media import InputMedia - -if TYPE_CHECKING: - from .input_file import InputFile - from .message_entity import MessageEntity - - -class InputMediaPhoto(InputMedia): - """ - Represents a photo to be sent. - - Source: https://core.telegram.org/bots/api#inputmediaphoto - """ - - type: Literal[InputMediaType.PHOTO] = InputMediaType.PHOTO - """Type of the result, must be *photo*""" - media: Union[str, InputFile] - """File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass 'attach://' to upload a new one using multipart/form-data under name. :ref:`More information on Sending Files » `""" - caption: Optional[str] = None - """*Optional*. Caption of the photo to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the photo caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """*Optional*. Pass :code:`True`, if the caption must be shown above the message media""" - has_spoiler: Optional[bool] = None - """*Optional*. Pass :code:`True` if the photo needs to be covered with a spoiler animation""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InputMediaType.PHOTO] = InputMediaType.PHOTO, - media: Union[str, InputFile], - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - media=media, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/input_media_video.py b/env/Lib/site-packages/aiogram/types/input_media_video.py deleted file mode 100644 index 6f1e326..0000000 --- a/env/Lib/site-packages/aiogram/types/input_media_video.py +++ /dev/null @@ -1,87 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..client.default import Default -from ..enums import InputMediaType -from .input_media import InputMedia - -if TYPE_CHECKING: - from .input_file import InputFile - from .message_entity import MessageEntity - - -class InputMediaVideo(InputMedia): - """ - Represents a video to be sent. - - Source: https://core.telegram.org/bots/api#inputmediavideo - """ - - type: Literal[InputMediaType.VIDEO] = InputMediaType.VIDEO - """Type of the result, must be *video*""" - media: Union[str, InputFile] - """File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass 'attach://' to upload a new one using multipart/form-data under name. :ref:`More information on Sending Files » `""" - thumbnail: Optional[InputFile] = None - """*Optional*. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » `""" - caption: Optional[str] = None - """*Optional*. Caption of the video to be sent, 0-1024 characters after entities parsing""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the video caption. See `formatting options `_ for more details.""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in the caption, which can be specified instead of *parse_mode*""" - show_caption_above_media: Optional[Union[bool, Default]] = Default("show_caption_above_media") - """*Optional*. Pass :code:`True`, if the caption must be shown above the message media""" - width: Optional[int] = None - """*Optional*. Video width""" - height: Optional[int] = None - """*Optional*. Video height""" - duration: Optional[int] = None - """*Optional*. Video duration in seconds""" - supports_streaming: Optional[bool] = None - """*Optional*. Pass :code:`True` if the uploaded video is suitable for streaming""" - has_spoiler: Optional[bool] = None - """*Optional*. Pass :code:`True` if the video needs to be covered with a spoiler animation""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InputMediaType.VIDEO] = InputMediaType.VIDEO, - media: Union[str, InputFile], - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - width: Optional[int] = None, - height: Optional[int] = None, - duration: Optional[int] = None, - supports_streaming: Optional[bool] = None, - has_spoiler: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - media=media, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - width=width, - height=height, - duration=duration, - supports_streaming=supports_streaming, - has_spoiler=has_spoiler, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/input_message_content.py b/env/Lib/site-packages/aiogram/types/input_message_content.py deleted file mode 100644 index 858524a..0000000 --- a/env/Lib/site-packages/aiogram/types/input_message_content.py +++ /dev/null @@ -1,17 +0,0 @@ -from __future__ import annotations - -from .base import MutableTelegramObject - - -class InputMessageContent(MutableTelegramObject): - """ - This object represents the content of a message to be sent as a result of an inline query. Telegram clients currently support the following 5 types: - - - :class:`aiogram.types.input_text_message_content.InputTextMessageContent` - - :class:`aiogram.types.input_location_message_content.InputLocationMessageContent` - - :class:`aiogram.types.input_venue_message_content.InputVenueMessageContent` - - :class:`aiogram.types.input_contact_message_content.InputContactMessageContent` - - :class:`aiogram.types.input_invoice_message_content.InputInvoiceMessageContent` - - Source: https://core.telegram.org/bots/api#inputmessagecontent - """ diff --git a/env/Lib/site-packages/aiogram/types/input_paid_media.py b/env/Lib/site-packages/aiogram/types/input_paid_media.py deleted file mode 100644 index 9d3193d..0000000 --- a/env/Lib/site-packages/aiogram/types/input_paid_media.py +++ /dev/null @@ -1,12 +0,0 @@ -from .base import TelegramObject - - -class InputPaidMedia(TelegramObject): - """ - This object describes the paid media to be sent. Currently, it can be one of - - - :class:`aiogram.types.input_paid_media_photo.InputPaidMediaPhoto` - - :class:`aiogram.types.input_paid_media_video.InputPaidMediaVideo` - - Source: https://core.telegram.org/bots/api#inputpaidmedia - """ diff --git a/env/Lib/site-packages/aiogram/types/input_paid_media_photo.py b/env/Lib/site-packages/aiogram/types/input_paid_media_photo.py deleted file mode 100644 index 1756db5..0000000 --- a/env/Lib/site-packages/aiogram/types/input_paid_media_photo.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Union - -from ..enums import InputPaidMediaType -from .input_file import InputFile -from .input_paid_media import InputPaidMedia - - -class InputPaidMediaPhoto(InputPaidMedia): - """ - The paid media to send is a photo. - - Source: https://core.telegram.org/bots/api#inputpaidmediaphoto - """ - - type: Literal[InputPaidMediaType.PHOTO] = InputPaidMediaType.PHOTO - """Type of the media, must be *photo*""" - media: Union[str, InputFile] - """File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass 'attach://' to upload a new one using multipart/form-data under name. :ref:`More information on Sending Files » `""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InputPaidMediaType.PHOTO] = InputPaidMediaType.PHOTO, - media: Union[str, InputFile], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, media=media, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/input_paid_media_video.py b/env/Lib/site-packages/aiogram/types/input_paid_media_video.py deleted file mode 100644 index 4511afb..0000000 --- a/env/Lib/site-packages/aiogram/types/input_paid_media_video.py +++ /dev/null @@ -1,61 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional, Union - -from ..enums import InputPaidMediaType -from .input_file import InputFile -from .input_paid_media import InputPaidMedia - - -class InputPaidMediaVideo(InputPaidMedia): - """ - The paid media to send is a video. - - Source: https://core.telegram.org/bots/api#inputpaidmediavideo - """ - - type: Literal[InputPaidMediaType.VIDEO] = InputPaidMediaType.VIDEO - """Type of the media, must be *video*""" - media: Union[str, InputFile] - """File to send. Pass a file_id to send a file that exists on the Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from the Internet, or pass 'attach://' to upload a new one using multipart/form-data under name. :ref:`More information on Sending Files » `""" - thumbnail: Optional[Union[InputFile, str]] = None - """*Optional*. Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » `""" - width: Optional[int] = None - """*Optional*. Video width""" - height: Optional[int] = None - """*Optional*. Video height""" - duration: Optional[int] = None - """*Optional*. Video duration in seconds""" - supports_streaming: Optional[bool] = None - """*Optional*. Pass :code:`True` if the uploaded video is suitable for streaming""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[InputPaidMediaType.VIDEO] = InputPaidMediaType.VIDEO, - media: Union[str, InputFile], - thumbnail: Optional[Union[InputFile, str]] = None, - width: Optional[int] = None, - height: Optional[int] = None, - duration: Optional[int] = None, - supports_streaming: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - media=media, - thumbnail=thumbnail, - width=width, - height=height, - duration=duration, - supports_streaming=supports_streaming, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/input_poll_option.py b/env/Lib/site-packages/aiogram/types/input_poll_option.py deleted file mode 100644 index 7bca9f6..0000000 --- a/env/Lib/site-packages/aiogram/types/input_poll_option.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from ..client.default import Default -from .base import TelegramObject - -if TYPE_CHECKING: - from .message_entity import MessageEntity - - -class InputPollOption(TelegramObject): - """ - This object contains information about one answer option in a poll to be sent. - - Source: https://core.telegram.org/bots/api#inputpolloption - """ - - text: str - """Option text, 1-100 characters""" - text_parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the text. See `formatting options `_ for more details. Currently, only custom emoji entities are allowed""" - text_entities: Optional[List[MessageEntity]] = None - """*Optional*. A JSON-serialized list of special entities that appear in the poll option text. It can be specified instead of *text_parse_mode*""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - text: str, - text_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - text_entities: Optional[List[MessageEntity]] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - text=text, - text_parse_mode=text_parse_mode, - text_entities=text_entities, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/input_sticker.py b/env/Lib/site-packages/aiogram/types/input_sticker.py deleted file mode 100644 index 85f6686..0000000 --- a/env/Lib/site-packages/aiogram/types/input_sticker.py +++ /dev/null @@ -1,55 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from .base import TelegramObject - -if TYPE_CHECKING: - from .input_file import InputFile - from .mask_position import MaskPosition - - -class InputSticker(TelegramObject): - """ - This object describes a sticker to be added to a sticker set. - - Source: https://core.telegram.org/bots/api#inputsticker - """ - - sticker: Union[InputFile, str] - """The added sticker. Pass a *file_id* as a String to send a file that already exists on the Telegram servers, pass an HTTP URL as a String for Telegram to get a file from the Internet, upload a new one using multipart/form-data, or pass 'attach://' to upload a new one using multipart/form-data under name. Animated and video stickers can't be uploaded via HTTP URL. :ref:`More information on Sending Files » `""" - format: str - """Format of the added sticker, must be one of 'static' for a **.WEBP** or **.PNG** image, 'animated' for a **.TGS** animation, 'video' for a **WEBM** video""" - emoji_list: List[str] - """List of 1-20 emoji associated with the sticker""" - mask_position: Optional[MaskPosition] = None - """*Optional*. Position where the mask should be placed on faces. For 'mask' stickers only.""" - keywords: Optional[List[str]] = None - """*Optional*. List of 0-20 search keywords for the sticker with total length of up to 64 characters. For 'regular' and 'custom_emoji' stickers only.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - sticker: Union[InputFile, str], - format: str, - emoji_list: List[str], - mask_position: Optional[MaskPosition] = None, - keywords: Optional[List[str]] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - sticker=sticker, - format=format, - emoji_list=emoji_list, - mask_position=mask_position, - keywords=keywords, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/input_text_message_content.py b/env/Lib/site-packages/aiogram/types/input_text_message_content.py deleted file mode 100644 index 5048757..0000000 --- a/env/Lib/site-packages/aiogram/types/input_text_message_content.py +++ /dev/null @@ -1,65 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from pydantic import Field - -from ..client.default import Default -from .input_message_content import InputMessageContent - -if TYPE_CHECKING: - from .link_preview_options import LinkPreviewOptions - from .message_entity import MessageEntity - - -class InputTextMessageContent(InputMessageContent): - """ - Represents the `content `_ of a text message to be sent as the result of an inline query. - - Source: https://core.telegram.org/bots/api#inputtextmessagecontent - """ - - message_text: str - """Text of the message to be sent, 1-4096 characters""" - parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the message text. See `formatting options `_ for more details.""" - entities: Optional[List[MessageEntity]] = None - """*Optional*. List of special entities that appear in message text, which can be specified instead of *parse_mode*""" - link_preview_options: Optional[LinkPreviewOptions] = None - """*Optional*. Link preview generation options for the message""" - disable_web_page_preview: Optional[Union[bool, Default]] = Field( - Default("disable_web_page_preview"), json_schema_extra={"deprecated": True} - ) - """*Optional*. Disables link previews for links in the sent message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - message_text: str, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - entities: Optional[List[MessageEntity]] = None, - link_preview_options: Optional[LinkPreviewOptions] = None, - disable_web_page_preview: Optional[Union[bool, Default]] = Default( - "disable_web_page_preview" - ), - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - message_text=message_text, - parse_mode=parse_mode, - entities=entities, - link_preview_options=link_preview_options, - disable_web_page_preview=disable_web_page_preview, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/input_venue_message_content.py b/env/Lib/site-packages/aiogram/types/input_venue_message_content.py deleted file mode 100644 index 48dd5c4..0000000 --- a/env/Lib/site-packages/aiogram/types/input_venue_message_content.py +++ /dev/null @@ -1,63 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .input_message_content import InputMessageContent - - -class InputVenueMessageContent(InputMessageContent): - """ - Represents the `content `_ of a venue message to be sent as the result of an inline query. - - Source: https://core.telegram.org/bots/api#inputvenuemessagecontent - """ - - latitude: float - """Latitude of the venue in degrees""" - longitude: float - """Longitude of the venue in degrees""" - title: str - """Name of the venue""" - address: str - """Address of the venue""" - foursquare_id: Optional[str] = None - """*Optional*. Foursquare identifier of the venue, if known""" - foursquare_type: Optional[str] = None - """*Optional*. Foursquare type of the venue, if known. (For example, 'arts_entertainment/default', 'arts_entertainment/aquarium' or 'food/icecream'.)""" - google_place_id: Optional[str] = None - """*Optional*. Google Places identifier of the venue""" - google_place_type: Optional[str] = None - """*Optional*. Google Places type of the venue. (See `supported types `_.)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - latitude: float, - longitude: float, - title: str, - address: str, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - latitude=latitude, - longitude=longitude, - title=title, - address=address, - foursquare_id=foursquare_id, - foursquare_type=foursquare_type, - google_place_id=google_place_id, - google_place_type=google_place_type, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/invoice.py b/env/Lib/site-packages/aiogram/types/invoice.py deleted file mode 100644 index 7c70f0b..0000000 --- a/env/Lib/site-packages/aiogram/types/invoice.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class Invoice(TelegramObject): - """ - This object contains basic information about an invoice. - - Source: https://core.telegram.org/bots/api#invoice - """ - - title: str - """Product name""" - description: str - """Product description""" - start_parameter: str - """Unique bot deep-linking parameter that can be used to generate this invoice""" - currency: str - """Three-letter ISO 4217 `currency `_ code, or 'XTR' for payments in `Telegram Stars `_""" - total_amount: int - """Total price in the *smallest units* of the currency (integer, **not** float/double). For example, for a price of :code:`US$ 1.45` pass :code:`amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - title: str, - description: str, - start_parameter: str, - currency: str, - total_amount: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - title=title, - description=description, - start_parameter=start_parameter, - currency=currency, - total_amount=total_amount, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/keyboard_button.py b/env/Lib/site-packages/aiogram/types/keyboard_button.py deleted file mode 100644 index 0cf7d58..0000000 --- a/env/Lib/site-packages/aiogram/types/keyboard_button.py +++ /dev/null @@ -1,78 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from pydantic import Field - -from .base import MutableTelegramObject - -if TYPE_CHECKING: - from .keyboard_button_poll_type import KeyboardButtonPollType - from .keyboard_button_request_chat import KeyboardButtonRequestChat - from .keyboard_button_request_user import KeyboardButtonRequestUser - from .keyboard_button_request_users import KeyboardButtonRequestUsers - from .web_app_info import WebAppInfo - - -class KeyboardButton(MutableTelegramObject): - """ - This object represents one button of the reply keyboard. At most one of the optional fields must be used to specify type of the button. For simple text buttons, *String* can be used instead of this object to specify the button text. - **Note:** *request_users* and *request_chat* options will only work in Telegram versions released after 3 February, 2023. Older clients will display *unsupported message*. - - Source: https://core.telegram.org/bots/api#keyboardbutton - """ - - text: str - """Text of the button. If none of the optional fields are used, it will be sent as a message when the button is pressed""" - request_users: Optional[KeyboardButtonRequestUsers] = None - """*Optional.* If specified, pressing the button will open a list of suitable users. Identifiers of selected users will be sent to the bot in a 'users_shared' service message. Available in private chats only.""" - request_chat: Optional[KeyboardButtonRequestChat] = None - """*Optional.* If specified, pressing the button will open a list of suitable chats. Tapping on a chat will send its identifier to the bot in a 'chat_shared' service message. Available in private chats only.""" - request_contact: Optional[bool] = None - """*Optional*. If :code:`True`, the user's phone number will be sent as a contact when the button is pressed. Available in private chats only.""" - request_location: Optional[bool] = None - """*Optional*. If :code:`True`, the user's current location will be sent when the button is pressed. Available in private chats only.""" - request_poll: Optional[KeyboardButtonPollType] = None - """*Optional*. If specified, the user will be asked to create a poll and send it to the bot when the button is pressed. Available in private chats only.""" - web_app: Optional[WebAppInfo] = None - """*Optional*. If specified, the described `Web App `_ will be launched when the button is pressed. The Web App will be able to send a 'web_app_data' service message. Available in private chats only.""" - request_user: Optional[KeyboardButtonRequestUser] = Field( - None, json_schema_extra={"deprecated": True} - ) - """*Optional.* If specified, pressing the button will open a list of suitable users. Tapping on any user will send their identifier to the bot in a 'user_shared' service message. Available in private chats only. - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - text: str, - request_users: Optional[KeyboardButtonRequestUsers] = None, - request_chat: Optional[KeyboardButtonRequestChat] = None, - request_contact: Optional[bool] = None, - request_location: Optional[bool] = None, - request_poll: Optional[KeyboardButtonPollType] = None, - web_app: Optional[WebAppInfo] = None, - request_user: Optional[KeyboardButtonRequestUser] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - text=text, - request_users=request_users, - request_chat=request_chat, - request_contact=request_contact, - request_location=request_location, - request_poll=request_poll, - web_app=web_app, - request_user=request_user, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/keyboard_button_poll_type.py b/env/Lib/site-packages/aiogram/types/keyboard_button_poll_type.py deleted file mode 100644 index 07eadb7..0000000 --- a/env/Lib/site-packages/aiogram/types/keyboard_button_poll_type.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import MutableTelegramObject - - -class KeyboardButtonPollType(MutableTelegramObject): - """ - This object represents type of a poll, which is allowed to be created and sent when the corresponding button is pressed. - - Source: https://core.telegram.org/bots/api#keyboardbuttonpolltype - """ - - type: Optional[str] = None - """*Optional*. If *quiz* is passed, the user will be allowed to create only polls in the quiz mode. If *regular* is passed, only regular polls will be allowed. Otherwise, the user will be allowed to create a poll of any type.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, type: Optional[str] = None, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/keyboard_button_request_chat.py b/env/Lib/site-packages/aiogram/types/keyboard_button_request_chat.py deleted file mode 100644 index 018edcf..0000000 --- a/env/Lib/site-packages/aiogram/types/keyboard_button_request_chat.py +++ /dev/null @@ -1,78 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from aiogram.types import TelegramObject - -if TYPE_CHECKING: - from .chat_administrator_rights import ChatAdministratorRights - - -class KeyboardButtonRequestChat(TelegramObject): - """ - This object defines the criteria used to request a suitable chat. Information about the selected chat will be shared with the bot when the corresponding button is pressed. The bot will be granted requested rights in the chat if appropriate. `More about requesting chats » `_. - - Source: https://core.telegram.org/bots/api#keyboardbuttonrequestchat - """ - - request_id: int - """Signed 32-bit identifier of the request, which will be received back in the :class:`aiogram.types.chat_shared.ChatShared` object. Must be unique within the message""" - chat_is_channel: bool - """Pass :code:`True` to request a channel chat, pass :code:`False` to request a group or a supergroup chat.""" - chat_is_forum: Optional[bool] = None - """*Optional*. Pass :code:`True` to request a forum supergroup, pass :code:`False` to request a non-forum chat. If not specified, no additional restrictions are applied.""" - chat_has_username: Optional[bool] = None - """*Optional*. Pass :code:`True` to request a supergroup or a channel with a username, pass :code:`False` to request a chat without a username. If not specified, no additional restrictions are applied.""" - chat_is_created: Optional[bool] = None - """*Optional*. Pass :code:`True` to request a chat owned by the user. Otherwise, no additional restrictions are applied.""" - user_administrator_rights: Optional[ChatAdministratorRights] = None - """*Optional*. A JSON-serialized object listing the required administrator rights of the user in the chat. The rights must be a superset of *bot_administrator_rights*. If not specified, no additional restrictions are applied.""" - bot_administrator_rights: Optional[ChatAdministratorRights] = None - """*Optional*. A JSON-serialized object listing the required administrator rights of the bot in the chat. The rights must be a subset of *user_administrator_rights*. If not specified, no additional restrictions are applied.""" - bot_is_member: Optional[bool] = None - """*Optional*. Pass :code:`True` to request a chat with the bot as a member. Otherwise, no additional restrictions are applied.""" - request_title: Optional[bool] = None - """*Optional*. Pass :code:`True` to request the chat's title""" - request_username: Optional[bool] = None - """*Optional*. Pass :code:`True` to request the chat's username""" - request_photo: Optional[bool] = None - """*Optional*. Pass :code:`True` to request the chat's photo""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - request_id: int, - chat_is_channel: bool, - chat_is_forum: Optional[bool] = None, - chat_has_username: Optional[bool] = None, - chat_is_created: Optional[bool] = None, - user_administrator_rights: Optional[ChatAdministratorRights] = None, - bot_administrator_rights: Optional[ChatAdministratorRights] = None, - bot_is_member: Optional[bool] = None, - request_title: Optional[bool] = None, - request_username: Optional[bool] = None, - request_photo: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - request_id=request_id, - chat_is_channel=chat_is_channel, - chat_is_forum=chat_is_forum, - chat_has_username=chat_has_username, - chat_is_created=chat_is_created, - user_administrator_rights=user_administrator_rights, - bot_administrator_rights=bot_administrator_rights, - bot_is_member=bot_is_member, - request_title=request_title, - request_username=request_username, - request_photo=request_photo, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/keyboard_button_request_user.py b/env/Lib/site-packages/aiogram/types/keyboard_button_request_user.py deleted file mode 100644 index ab44ab2..0000000 --- a/env/Lib/site-packages/aiogram/types/keyboard_button_request_user.py +++ /dev/null @@ -1,44 +0,0 @@ -from typing import TYPE_CHECKING, Any, Optional - -from aiogram.types import TelegramObject - - -class KeyboardButtonRequestUser(TelegramObject): - """ - This object defines the criteria used to request a suitable user. The identifier of the selected user will be shared with the bot when the corresponding button is pressed. `More about requesting users » `_ - - .. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023 - - Source: https://core.telegram.org/bots/api#keyboardbuttonrequestuser - """ - - request_id: int - """Signed 32-bit identifier of the request, which will be received back in the :class:`aiogram.types.user_shared.UserShared` object. Must be unique within the message""" - user_is_bot: Optional[bool] = None - """*Optional*. Pass :code:`True` to request a bot, pass :code:`False` to request a regular user. If not specified, no additional restrictions are applied.""" - user_is_premium: Optional[bool] = None - """*Optional*. Pass :code:`True` to request a premium user, pass :code:`False` to request a non-premium user. If not specified, no additional restrictions are applied.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - request_id: int, - user_is_bot: Optional[bool] = None, - user_is_premium: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - request_id=request_id, - user_is_bot=user_is_bot, - user_is_premium=user_is_premium, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/keyboard_button_request_users.py b/env/Lib/site-packages/aiogram/types/keyboard_button_request_users.py deleted file mode 100644 index 631f04b..0000000 --- a/env/Lib/site-packages/aiogram/types/keyboard_button_request_users.py +++ /dev/null @@ -1,57 +0,0 @@ -from typing import TYPE_CHECKING, Any, Optional - -from aiogram.types import TelegramObject - - -class KeyboardButtonRequestUsers(TelegramObject): - """ - This object defines the criteria used to request suitable users. Information about the selected users will be shared with the bot when the corresponding button is pressed. `More about requesting users » `_ - - Source: https://core.telegram.org/bots/api#keyboardbuttonrequestusers - """ - - request_id: int - """Signed 32-bit identifier of the request that will be received back in the :class:`aiogram.types.users_shared.UsersShared` object. Must be unique within the message""" - user_is_bot: Optional[bool] = None - """*Optional*. Pass :code:`True` to request bots, pass :code:`False` to request regular users. If not specified, no additional restrictions are applied.""" - user_is_premium: Optional[bool] = None - """*Optional*. Pass :code:`True` to request premium users, pass :code:`False` to request non-premium users. If not specified, no additional restrictions are applied.""" - max_quantity: Optional[int] = None - """*Optional*. The maximum number of users to be selected; 1-10. Defaults to 1.""" - request_name: Optional[bool] = None - """*Optional*. Pass :code:`True` to request the users' first and last names""" - request_username: Optional[bool] = None - """*Optional*. Pass :code:`True` to request the users' usernames""" - request_photo: Optional[bool] = None - """*Optional*. Pass :code:`True` to request the users' photos""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - request_id: int, - user_is_bot: Optional[bool] = None, - user_is_premium: Optional[bool] = None, - max_quantity: Optional[int] = None, - request_name: Optional[bool] = None, - request_username: Optional[bool] = None, - request_photo: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - request_id=request_id, - user_is_bot=user_is_bot, - user_is_premium=user_is_premium, - max_quantity=max_quantity, - request_name=request_name, - request_username=request_username, - request_photo=request_photo, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/labeled_price.py b/env/Lib/site-packages/aiogram/types/labeled_price.py deleted file mode 100644 index 42d97af..0000000 --- a/env/Lib/site-packages/aiogram/types/labeled_price.py +++ /dev/null @@ -1,31 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import MutableTelegramObject - - -class LabeledPrice(MutableTelegramObject): - """ - This object represents a portion of the price for goods or services. - - Source: https://core.telegram.org/bots/api#labeledprice - """ - - label: str - """Portion label""" - amount: int - """Price of the product in the *smallest units* of the `currency `_ (integer, **not** float/double). For example, for a price of :code:`US$ 1.45` pass :code:`amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, label: str, amount: int, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(label=label, amount=amount, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/link_preview_options.py b/env/Lib/site-packages/aiogram/types/link_preview_options.py deleted file mode 100644 index 8964c5e..0000000 --- a/env/Lib/site-packages/aiogram/types/link_preview_options.py +++ /dev/null @@ -1,56 +0,0 @@ -from typing import TYPE_CHECKING, Any, Optional, Union - -from ..client.default import Default -from .base import TelegramObject - - -class LinkPreviewOptions(TelegramObject): - """ - Describes the options used for link preview generation. - - Source: https://core.telegram.org/bots/api#linkpreviewoptions - """ - - is_disabled: Optional[Union[bool, Default]] = Default("link_preview_is_disabled") - """*Optional*. :code:`True`, if the link preview is disabled""" - url: Optional[str] = None - """*Optional*. URL to use for the link preview. If empty, then the first URL found in the message text will be used""" - prefer_small_media: Optional[Union[bool, Default]] = Default("link_preview_prefer_small_media") - """*Optional*. :code:`True`, if the media in the link preview is supposed to be shrunk; ignored if the URL isn't explicitly specified or media size change isn't supported for the preview""" - prefer_large_media: Optional[Union[bool, Default]] = Default("link_preview_prefer_large_media") - """*Optional*. :code:`True`, if the media in the link preview is supposed to be enlarged; ignored if the URL isn't explicitly specified or media size change isn't supported for the preview""" - show_above_text: Optional[Union[bool, Default]] = Default("link_preview_show_above_text") - """*Optional*. :code:`True`, if the link preview must be shown above the message text; otherwise, the link preview will be shown below the message text""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - is_disabled: Optional[Union[bool, Default]] = Default("link_preview_is_disabled"), - url: Optional[str] = None, - prefer_small_media: Optional[Union[bool, Default]] = Default( - "link_preview_prefer_small_media" - ), - prefer_large_media: Optional[Union[bool, Default]] = Default( - "link_preview_prefer_large_media" - ), - show_above_text: Optional[Union[bool, Default]] = Default( - "link_preview_show_above_text" - ), - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - is_disabled=is_disabled, - url=url, - prefer_small_media=prefer_small_media, - prefer_large_media=prefer_large_media, - show_above_text=show_above_text, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/location.py b/env/Lib/site-packages/aiogram/types/location.py deleted file mode 100644 index 32673da..0000000 --- a/env/Lib/site-packages/aiogram/types/location.py +++ /dev/null @@ -1,55 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - - -class Location(TelegramObject): - """ - This object represents a point on the map. - - Source: https://core.telegram.org/bots/api#location - """ - - latitude: float - """Latitude as defined by the sender""" - longitude: float - """Longitude as defined by the sender""" - horizontal_accuracy: Optional[float] = None - """*Optional*. The radius of uncertainty for the location, measured in meters; 0-1500""" - live_period: Optional[int] = None - """*Optional*. Time relative to the message sending date, during which the location can be updated; in seconds. For active live locations only.""" - heading: Optional[int] = None - """*Optional*. The direction in which user is moving, in degrees; 1-360. For active live locations only.""" - proximity_alert_radius: Optional[int] = None - """*Optional*. The maximum distance for proximity alerts about approaching another chat member, in meters. For sent live locations only.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - latitude: float, - longitude: float, - horizontal_accuracy: Optional[float] = None, - live_period: Optional[int] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - latitude=latitude, - longitude=longitude, - horizontal_accuracy=horizontal_accuracy, - live_period=live_period, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/login_url.py b/env/Lib/site-packages/aiogram/types/login_url.py deleted file mode 100644 index 6f6c94a..0000000 --- a/env/Lib/site-packages/aiogram/types/login_url.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - - -class LoginUrl(TelegramObject): - """ - This object represents a parameter of the inline keyboard button used to automatically authorize a user. Serves as a great replacement for the `Telegram Login Widget `_ when the user is coming from Telegram. All the user needs to do is tap/click a button and confirm that they want to log in: - Telegram apps support these buttons as of `version 5.7 `_. - - Sample bot: `@discussbot `_ - - Source: https://core.telegram.org/bots/api#loginurl - """ - - url: str - """An HTTPS URL to be opened with user authorization data added to the query string when the button is pressed. If the user refuses to provide authorization data, the original URL without information about the user will be opened. The data added is the same as described in `Receiving authorization data `_.""" - forward_text: Optional[str] = None - """*Optional*. New text of the button in forwarded messages.""" - bot_username: Optional[str] = None - """*Optional*. Username of a bot, which will be used for user authorization. See `Setting up a bot `_ for more details. If not specified, the current bot's username will be assumed. The *url*'s domain must be the same as the domain linked with the bot. See `Linking your domain to the bot `_ for more details.""" - request_write_access: Optional[bool] = None - """*Optional*. Pass :code:`True` to request the permission for your bot to send messages to the user.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - url: str, - forward_text: Optional[str] = None, - bot_username: Optional[str] = None, - request_write_access: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - url=url, - forward_text=forward_text, - bot_username=bot_username, - request_write_access=request_write_access, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/mask_position.py b/env/Lib/site-packages/aiogram/types/mask_position.py deleted file mode 100644 index d02852a..0000000 --- a/env/Lib/site-packages/aiogram/types/mask_position.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class MaskPosition(TelegramObject): - """ - This object describes the position on faces where a mask should be placed by default. - - Source: https://core.telegram.org/bots/api#maskposition - """ - - point: str - """The part of the face relative to which the mask should be placed. One of 'forehead', 'eyes', 'mouth', or 'chin'.""" - x_shift: float - """Shift by X-axis measured in widths of the mask scaled to the face size, from left to right. For example, choosing -1.0 will place mask just to the left of the default mask position.""" - y_shift: float - """Shift by Y-axis measured in heights of the mask scaled to the face size, from top to bottom. For example, 1.0 will place the mask just below the default mask position.""" - scale: float - """Mask scaling coefficient. For example, 2.0 means double size.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - point: str, - x_shift: float, - y_shift: float, - scale: float, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - point=point, x_shift=x_shift, y_shift=y_shift, scale=scale, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/maybe_inaccessible_message.py b/env/Lib/site-packages/aiogram/types/maybe_inaccessible_message.py deleted file mode 100644 index fe95ced..0000000 --- a/env/Lib/site-packages/aiogram/types/maybe_inaccessible_message.py +++ /dev/null @@ -1,12 +0,0 @@ -from aiogram.types import TelegramObject - - -class MaybeInaccessibleMessage(TelegramObject): - """ - This object describes a message that can be inaccessible to the bot. It can be one of - - - :class:`aiogram.types.message.Message` - - :class:`aiogram.types.inaccessible_message.InaccessibleMessage` - - Source: https://core.telegram.org/bots/api#maybeinaccessiblemessage - """ diff --git a/env/Lib/site-packages/aiogram/types/menu_button.py b/env/Lib/site-packages/aiogram/types/menu_button.py deleted file mode 100644 index 4c4fbf3..0000000 --- a/env/Lib/site-packages/aiogram/types/menu_button.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import MutableTelegramObject - -if TYPE_CHECKING: - from .web_app_info import WebAppInfo - - -class MenuButton(MutableTelegramObject): - """ - This object describes the bot's menu button in a private chat. It should be one of - - - :class:`aiogram.types.menu_button_commands.MenuButtonCommands` - - :class:`aiogram.types.menu_button_web_app.MenuButtonWebApp` - - :class:`aiogram.types.menu_button_default.MenuButtonDefault` - - If a menu button other than :class:`aiogram.types.menu_button_default.MenuButtonDefault` is set for a private chat, then it is applied in the chat. Otherwise the default menu button is applied. By default, the menu button opens the list of bot commands. - - Source: https://core.telegram.org/bots/api#menubutton - """ - - type: str - """Type of the button""" - text: Optional[str] = None - """*Optional*. Text on the button""" - web_app: Optional[WebAppInfo] = None - """*Optional*. Description of the Web App that will be launched when the user presses the button. The Web App will be able to send an arbitrary message on behalf of the user using the method :class:`aiogram.methods.answer_web_app_query.AnswerWebAppQuery`. Alternatively, a :code:`t.me` link to a Web App of the bot can be specified in the object instead of the Web App's URL, in which case the Web App will be opened as if the user pressed the link.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: str, - text: Optional[str] = None, - web_app: Optional[WebAppInfo] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, text=text, web_app=web_app, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/menu_button_commands.py b/env/Lib/site-packages/aiogram/types/menu_button_commands.py deleted file mode 100644 index 54ed20b..0000000 --- a/env/Lib/site-packages/aiogram/types/menu_button_commands.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import MenuButtonType -from .menu_button import MenuButton - - -class MenuButtonCommands(MenuButton): - """ - Represents a menu button, which opens the bot's list of commands. - - Source: https://core.telegram.org/bots/api#menubuttoncommands - """ - - type: Literal[MenuButtonType.COMMANDS] = MenuButtonType.COMMANDS - """Type of the button, must be *commands*""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[MenuButtonType.COMMANDS] = MenuButtonType.COMMANDS, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/menu_button_default.py b/env/Lib/site-packages/aiogram/types/menu_button_default.py deleted file mode 100644 index 12ce30e..0000000 --- a/env/Lib/site-packages/aiogram/types/menu_button_default.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import MenuButtonType -from .menu_button import MenuButton - - -class MenuButtonDefault(MenuButton): - """ - Describes that no specific value for the menu button was set. - - Source: https://core.telegram.org/bots/api#menubuttondefault - """ - - type: Literal[MenuButtonType.DEFAULT] = MenuButtonType.DEFAULT - """Type of the button, must be *default*""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[MenuButtonType.DEFAULT] = MenuButtonType.DEFAULT, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/menu_button_web_app.py b/env/Lib/site-packages/aiogram/types/menu_button_web_app.py deleted file mode 100644 index 0fc9e41..0000000 --- a/env/Lib/site-packages/aiogram/types/menu_button_web_app.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import MenuButtonType -from .menu_button import MenuButton - -if TYPE_CHECKING: - from .web_app_info import WebAppInfo - - -class MenuButtonWebApp(MenuButton): - """ - Represents a menu button, which launches a `Web App `_. - - Source: https://core.telegram.org/bots/api#menubuttonwebapp - """ - - type: Literal[MenuButtonType.WEB_APP] = MenuButtonType.WEB_APP - """Type of the button, must be *web_app*""" - text: str - """Text on the button""" - web_app: WebAppInfo - """Description of the Web App that will be launched when the user presses the button. The Web App will be able to send an arbitrary message on behalf of the user using the method :class:`aiogram.methods.answer_web_app_query.AnswerWebAppQuery`. Alternatively, a :code:`t.me` link to a Web App of the bot can be specified in the object instead of the Web App's URL, in which case the Web App will be opened as if the user pressed the link.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[MenuButtonType.WEB_APP] = MenuButtonType.WEB_APP, - text: str, - web_app: WebAppInfo, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, text=text, web_app=web_app, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/message.py b/env/Lib/site-packages/aiogram/types/message.py deleted file mode 100644 index 57defef..0000000 --- a/env/Lib/site-packages/aiogram/types/message.py +++ /dev/null @@ -1,4229 +0,0 @@ -from __future__ import annotations - -import datetime -from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union - -from pydantic import Field - -from aiogram.utils.text_decorations import ( - TextDecoration, - html_decoration, - markdown_decoration, -) - -from ..client.default import Default -from ..enums import ContentType -from .custom import DateTime -from .maybe_inaccessible_message import MaybeInaccessibleMessage -from .reply_parameters import ReplyParameters - -if TYPE_CHECKING: - from ..methods import ( - CopyMessage, - DeleteMessage, - EditMessageCaption, - EditMessageLiveLocation, - EditMessageMedia, - EditMessageReplyMarkup, - EditMessageText, - ForwardMessage, - PinChatMessage, - SendAnimation, - SendAudio, - SendContact, - SendDice, - SendDocument, - SendGame, - SendInvoice, - SendLocation, - SendMediaGroup, - SendMessage, - SendPaidMedia, - SendPhoto, - SendPoll, - SendSticker, - SendVenue, - SendVideo, - SendVideoNote, - SendVoice, - SetMessageReaction, - StopMessageLiveLocation, - UnpinChatMessage, - ) - from .animation import Animation - from .audio import Audio - from .chat import Chat - from .chat_background import ChatBackground - from .chat_boost_added import ChatBoostAdded - from .chat_shared import ChatShared - from .contact import Contact - from .dice import Dice - from .document import Document - from .external_reply_info import ExternalReplyInfo - from .force_reply import ForceReply - from .forum_topic_closed import ForumTopicClosed - from .forum_topic_created import ForumTopicCreated - from .forum_topic_edited import ForumTopicEdited - from .forum_topic_reopened import ForumTopicReopened - from .game import Game - from .general_forum_topic_hidden import GeneralForumTopicHidden - from .general_forum_topic_unhidden import GeneralForumTopicUnhidden - from .giveaway import Giveaway - from .giveaway_completed import GiveawayCompleted - from .giveaway_created import GiveawayCreated - from .giveaway_winners import GiveawayWinners - from .inaccessible_message import InaccessibleMessage - from .inline_keyboard_markup import InlineKeyboardMarkup - from .input_file import InputFile - from .input_media_animation import InputMediaAnimation - from .input_media_audio import InputMediaAudio - from .input_media_document import InputMediaDocument - from .input_media_photo import InputMediaPhoto - from .input_media_video import InputMediaVideo - from .input_paid_media_photo import InputPaidMediaPhoto - from .input_paid_media_video import InputPaidMediaVideo - from .input_poll_option import InputPollOption - from .invoice import Invoice - from .labeled_price import LabeledPrice - from .link_preview_options import LinkPreviewOptions - from .location import Location - from .message_auto_delete_timer_changed import MessageAutoDeleteTimerChanged - from .message_entity import MessageEntity - from .message_origin_channel import MessageOriginChannel - from .message_origin_chat import MessageOriginChat - from .message_origin_hidden_user import MessageOriginHiddenUser - from .message_origin_user import MessageOriginUser - from .paid_media_info import PaidMediaInfo - from .passport_data import PassportData - from .photo_size import PhotoSize - from .poll import Poll - from .proximity_alert_triggered import ProximityAlertTriggered - from .reaction_type_custom_emoji import ReactionTypeCustomEmoji - from .reaction_type_emoji import ReactionTypeEmoji - from .reaction_type_paid import ReactionTypePaid - from .refunded_payment import RefundedPayment - from .reply_keyboard_markup import ReplyKeyboardMarkup - from .reply_keyboard_remove import ReplyKeyboardRemove - from .sticker import Sticker - from .story import Story - from .successful_payment import SuccessfulPayment - from .text_quote import TextQuote - from .user import User - from .user_shared import UserShared - from .users_shared import UsersShared - from .venue import Venue - from .video import Video - from .video_chat_ended import VideoChatEnded - from .video_chat_participants_invited import VideoChatParticipantsInvited - from .video_chat_scheduled import VideoChatScheduled - from .video_chat_started import VideoChatStarted - from .video_note import VideoNote - from .voice import Voice - from .web_app_data import WebAppData - from .write_access_allowed import WriteAccessAllowed - - -class Message(MaybeInaccessibleMessage): - """ - This object represents a message. - - Source: https://core.telegram.org/bots/api#message - """ - - message_id: int - """Unique message identifier inside this chat""" - date: DateTime - """Date the message was sent in Unix time. It is always a positive number, representing a valid date.""" - chat: Chat - """Chat the message belongs to""" - message_thread_id: Optional[int] = None - """*Optional*. Unique identifier of a message thread to which the message belongs; for supergroups only""" - from_user: Optional[User] = Field(None, alias="from") - """*Optional*. Sender of the message; may be empty for messages sent to channels. For backward compatibility, if the message was sent on behalf of a chat, the field contains a fake sender user in non-channel chats""" - sender_chat: Optional[Chat] = None - """*Optional*. Sender of the message when sent on behalf of a chat. For example, the supergroup itself for messages sent by its anonymous administrators or a linked channel for messages automatically forwarded to the channel's discussion group. For backward compatibility, if the message was sent on behalf of a chat, the field *from* contains a fake sender user in non-channel chats.""" - sender_boost_count: Optional[int] = None - """*Optional*. If the sender of the message boosted the chat, the number of boosts added by the user""" - sender_business_bot: Optional[User] = None - """*Optional*. The bot that actually sent the message on behalf of the business account. Available only for outgoing messages sent on behalf of the connected business account.""" - business_connection_id: Optional[str] = None - """*Optional*. Unique identifier of the business connection from which the message was received. If non-empty, the message belongs to a chat of the corresponding business account that is independent from any potential bot chat which might share the same identifier.""" - forward_origin: Optional[ - Union[MessageOriginUser, MessageOriginHiddenUser, MessageOriginChat, MessageOriginChannel] - ] = None - """*Optional*. Information about the original message for forwarded messages""" - is_topic_message: Optional[bool] = None - """*Optional*. :code:`True`, if the message is sent to a forum topic""" - is_automatic_forward: Optional[bool] = None - """*Optional*. :code:`True`, if the message is a channel post that was automatically forwarded to the connected discussion group""" - reply_to_message: Optional[Message] = None - """*Optional*. For replies in the same chat and message thread, the original message. Note that the Message object in this field will not contain further *reply_to_message* fields even if it itself is a reply.""" - external_reply: Optional[ExternalReplyInfo] = None - """*Optional*. Information about the message that is being replied to, which may come from another chat or forum topic""" - quote: Optional[TextQuote] = None - """*Optional*. For replies that quote part of the original message, the quoted part of the message""" - reply_to_story: Optional[Story] = None - """*Optional*. For replies to a story, the original story""" - via_bot: Optional[User] = None - """*Optional*. Bot through which the message was sent""" - edit_date: Optional[int] = None - """*Optional*. Date the message was last edited in Unix time""" - has_protected_content: Optional[bool] = None - """*Optional*. :code:`True`, if the message can't be forwarded""" - is_from_offline: Optional[bool] = None - """*Optional*. True, if the message was sent by an implicit action, for example, as an away or a greeting business message, or as a scheduled message""" - media_group_id: Optional[str] = None - """*Optional*. The unique identifier of a media message group this message belongs to""" - author_signature: Optional[str] = None - """*Optional*. Signature of the post author for messages in channels, or the custom title of an anonymous group administrator""" - text: Optional[str] = None - """*Optional*. For text messages, the actual UTF-8 text of the message""" - entities: Optional[List[MessageEntity]] = None - """*Optional*. For text messages, special entities like usernames, URLs, bot commands, etc. that appear in the text""" - link_preview_options: Optional[LinkPreviewOptions] = None - """*Optional*. Options used for link preview generation for the message, if it is a text message and link preview options were changed""" - effect_id: Optional[str] = None - """*Optional*. Unique identifier of the message effect added to the message""" - animation: Optional[Animation] = None - """*Optional*. Message is an animation, information about the animation. For backward compatibility, when this field is set, the *document* field will also be set""" - audio: Optional[Audio] = None - """*Optional*. Message is an audio file, information about the file""" - document: Optional[Document] = None - """*Optional*. Message is a general file, information about the file""" - paid_media: Optional[PaidMediaInfo] = None - """*Optional*. Message contains paid media; information about the paid media""" - photo: Optional[List[PhotoSize]] = None - """*Optional*. Message is a photo, available sizes of the photo""" - sticker: Optional[Sticker] = None - """*Optional*. Message is a sticker, information about the sticker""" - story: Optional[Story] = None - """*Optional*. Message is a forwarded story""" - video: Optional[Video] = None - """*Optional*. Message is a video, information about the video""" - video_note: Optional[VideoNote] = None - """*Optional*. Message is a `video note `_, information about the video message""" - voice: Optional[Voice] = None - """*Optional*. Message is a voice message, information about the file""" - caption: Optional[str] = None - """*Optional*. Caption for the animation, audio, document, paid media, photo, video or voice""" - caption_entities: Optional[List[MessageEntity]] = None - """*Optional*. For messages with a caption, special entities like usernames, URLs, bot commands, etc. that appear in the caption""" - show_caption_above_media: Optional[bool] = None - """*Optional*. True, if the caption must be shown above the message media""" - has_media_spoiler: Optional[bool] = None - """*Optional*. :code:`True`, if the message media is covered by a spoiler animation""" - contact: Optional[Contact] = None - """*Optional*. Message is a shared contact, information about the contact""" - dice: Optional[Dice] = None - """*Optional*. Message is a dice with random value""" - game: Optional[Game] = None - """*Optional*. Message is a game, information about the game. `More about games » `_""" - poll: Optional[Poll] = None - """*Optional*. Message is a native poll, information about the poll""" - venue: Optional[Venue] = None - """*Optional*. Message is a venue, information about the venue. For backward compatibility, when this field is set, the *location* field will also be set""" - location: Optional[Location] = None - """*Optional*. Message is a shared location, information about the location""" - new_chat_members: Optional[List[User]] = None - """*Optional*. New members that were added to the group or supergroup and information about them (the bot itself may be one of these members)""" - left_chat_member: Optional[User] = None - """*Optional*. A member was removed from the group, information about them (this member may be the bot itself)""" - new_chat_title: Optional[str] = None - """*Optional*. A chat title was changed to this value""" - new_chat_photo: Optional[List[PhotoSize]] = None - """*Optional*. A chat photo was change to this value""" - delete_chat_photo: Optional[bool] = None - """*Optional*. Service message: the chat photo was deleted""" - group_chat_created: Optional[bool] = None - """*Optional*. Service message: the group has been created""" - supergroup_chat_created: Optional[bool] = None - """*Optional*. Service message: the supergroup has been created. This field can't be received in a message coming through updates, because bot can't be a member of a supergroup when it is created. It can only be found in reply_to_message if someone replies to a very first message in a directly created supergroup.""" - channel_chat_created: Optional[bool] = None - """*Optional*. Service message: the channel has been created. This field can't be received in a message coming through updates, because bot can't be a member of a channel when it is created. It can only be found in reply_to_message if someone replies to a very first message in a channel.""" - message_auto_delete_timer_changed: Optional[MessageAutoDeleteTimerChanged] = None - """*Optional*. Service message: auto-delete timer settings changed in the chat""" - migrate_to_chat_id: Optional[int] = None - """*Optional*. The group has been migrated to a supergroup with the specified identifier. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this identifier.""" - migrate_from_chat_id: Optional[int] = None - """*Optional*. The supergroup has been migrated from a group with the specified identifier. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this identifier.""" - pinned_message: Optional[Union[Message, InaccessibleMessage]] = None - """*Optional*. Specified message was pinned. Note that the Message object in this field will not contain further *reply_to_message* fields even if it itself is a reply.""" - invoice: Optional[Invoice] = None - """*Optional*. Message is an invoice for a `payment `_, information about the invoice. `More about payments » `_""" - successful_payment: Optional[SuccessfulPayment] = None - """*Optional*. Message is a service message about a successful payment, information about the payment. `More about payments » `_""" - refunded_payment: Optional[RefundedPayment] = None - """*Optional*. Message is a service message about a refunded payment, information about the payment. `More about payments » `_""" - users_shared: Optional[UsersShared] = None - """*Optional*. Service message: users were shared with the bot""" - chat_shared: Optional[ChatShared] = None - """*Optional*. Service message: a chat was shared with the bot""" - connected_website: Optional[str] = None - """*Optional*. The domain name of the website on which the user has logged in. `More about Telegram Login » `_""" - write_access_allowed: Optional[WriteAccessAllowed] = None - """*Optional*. Service message: the user allowed the bot to write messages after adding it to the attachment or side menu, launching a Web App from a link, or accepting an explicit request from a Web App sent by the method `requestWriteAccess `_""" - passport_data: Optional[PassportData] = None - """*Optional*. Telegram Passport data""" - proximity_alert_triggered: Optional[ProximityAlertTriggered] = None - """*Optional*. Service message. A user in the chat triggered another user's proximity alert while sharing Live Location.""" - boost_added: Optional[ChatBoostAdded] = None - """*Optional*. Service message: user boosted the chat""" - chat_background_set: Optional[ChatBackground] = None - """*Optional*. Service message: chat background set""" - forum_topic_created: Optional[ForumTopicCreated] = None - """*Optional*. Service message: forum topic created""" - forum_topic_edited: Optional[ForumTopicEdited] = None - """*Optional*. Service message: forum topic edited""" - forum_topic_closed: Optional[ForumTopicClosed] = None - """*Optional*. Service message: forum topic closed""" - forum_topic_reopened: Optional[ForumTopicReopened] = None - """*Optional*. Service message: forum topic reopened""" - general_forum_topic_hidden: Optional[GeneralForumTopicHidden] = None - """*Optional*. Service message: the 'General' forum topic hidden""" - general_forum_topic_unhidden: Optional[GeneralForumTopicUnhidden] = None - """*Optional*. Service message: the 'General' forum topic unhidden""" - giveaway_created: Optional[GiveawayCreated] = None - """*Optional*. Service message: a scheduled giveaway was created""" - giveaway: Optional[Giveaway] = None - """*Optional*. The message is a scheduled giveaway message""" - giveaway_winners: Optional[GiveawayWinners] = None - """*Optional*. A giveaway with public winners was completed""" - giveaway_completed: Optional[GiveawayCompleted] = None - """*Optional*. Service message: a giveaway without public winners was completed""" - video_chat_scheduled: Optional[VideoChatScheduled] = None - """*Optional*. Service message: video chat scheduled""" - video_chat_started: Optional[VideoChatStarted] = None - """*Optional*. Service message: video chat started""" - video_chat_ended: Optional[VideoChatEnded] = None - """*Optional*. Service message: video chat ended""" - video_chat_participants_invited: Optional[VideoChatParticipantsInvited] = None - """*Optional*. Service message: new participants invited to a video chat""" - web_app_data: Optional[WebAppData] = None - """*Optional*. Service message: data sent by a Web App""" - reply_markup: Optional[InlineKeyboardMarkup] = None - """*Optional*. Inline keyboard attached to the message. :code:`login_url` buttons are represented as ordinary :code:`url` buttons.""" - forward_date: Optional[DateTime] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. For forwarded messages, date the original message was sent in Unix time - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - forward_from: Optional[User] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. For forwarded messages, sender of the original message - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - forward_from_chat: Optional[Chat] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. For messages forwarded from channels or from anonymous administrators, information about the original sender chat - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - forward_from_message_id: Optional[int] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. For messages forwarded from channels, identifier of the original message in the channel - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - forward_sender_name: Optional[str] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. Sender's name for messages forwarded from users who disallow adding a link to their account in forwarded messages - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - forward_signature: Optional[str] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. For forwarded messages that were originally sent in channels or by an anonymous chat administrator, signature of the message sender if present - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - user_shared: Optional[UserShared] = Field(None, json_schema_extra={"deprecated": True}) - """*Optional*. Service message: a user was shared with the bot - -.. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - message_id: int, - date: DateTime, - chat: Chat, - message_thread_id: Optional[int] = None, - from_user: Optional[User] = None, - sender_chat: Optional[Chat] = None, - sender_boost_count: Optional[int] = None, - sender_business_bot: Optional[User] = None, - business_connection_id: Optional[str] = None, - forward_origin: Optional[ - Union[ - MessageOriginUser, - MessageOriginHiddenUser, - MessageOriginChat, - MessageOriginChannel, - ] - ] = None, - is_topic_message: Optional[bool] = None, - is_automatic_forward: Optional[bool] = None, - reply_to_message: Optional[Message] = None, - external_reply: Optional[ExternalReplyInfo] = None, - quote: Optional[TextQuote] = None, - reply_to_story: Optional[Story] = None, - via_bot: Optional[User] = None, - edit_date: Optional[int] = None, - has_protected_content: Optional[bool] = None, - is_from_offline: Optional[bool] = None, - media_group_id: Optional[str] = None, - author_signature: Optional[str] = None, - text: Optional[str] = None, - entities: Optional[List[MessageEntity]] = None, - link_preview_options: Optional[LinkPreviewOptions] = None, - effect_id: Optional[str] = None, - animation: Optional[Animation] = None, - audio: Optional[Audio] = None, - document: Optional[Document] = None, - paid_media: Optional[PaidMediaInfo] = None, - photo: Optional[List[PhotoSize]] = None, - sticker: Optional[Sticker] = None, - story: Optional[Story] = None, - video: Optional[Video] = None, - video_note: Optional[VideoNote] = None, - voice: Optional[Voice] = None, - caption: Optional[str] = None, - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - has_media_spoiler: Optional[bool] = None, - contact: Optional[Contact] = None, - dice: Optional[Dice] = None, - game: Optional[Game] = None, - poll: Optional[Poll] = None, - venue: Optional[Venue] = None, - location: Optional[Location] = None, - new_chat_members: Optional[List[User]] = None, - left_chat_member: Optional[User] = None, - new_chat_title: Optional[str] = None, - new_chat_photo: Optional[List[PhotoSize]] = None, - delete_chat_photo: Optional[bool] = None, - group_chat_created: Optional[bool] = None, - supergroup_chat_created: Optional[bool] = None, - channel_chat_created: Optional[bool] = None, - message_auto_delete_timer_changed: Optional[MessageAutoDeleteTimerChanged] = None, - migrate_to_chat_id: Optional[int] = None, - migrate_from_chat_id: Optional[int] = None, - pinned_message: Optional[Union[Message, InaccessibleMessage]] = None, - invoice: Optional[Invoice] = None, - successful_payment: Optional[SuccessfulPayment] = None, - refunded_payment: Optional[RefundedPayment] = None, - users_shared: Optional[UsersShared] = None, - chat_shared: Optional[ChatShared] = None, - connected_website: Optional[str] = None, - write_access_allowed: Optional[WriteAccessAllowed] = None, - passport_data: Optional[PassportData] = None, - proximity_alert_triggered: Optional[ProximityAlertTriggered] = None, - boost_added: Optional[ChatBoostAdded] = None, - chat_background_set: Optional[ChatBackground] = None, - forum_topic_created: Optional[ForumTopicCreated] = None, - forum_topic_edited: Optional[ForumTopicEdited] = None, - forum_topic_closed: Optional[ForumTopicClosed] = None, - forum_topic_reopened: Optional[ForumTopicReopened] = None, - general_forum_topic_hidden: Optional[GeneralForumTopicHidden] = None, - general_forum_topic_unhidden: Optional[GeneralForumTopicUnhidden] = None, - giveaway_created: Optional[GiveawayCreated] = None, - giveaway: Optional[Giveaway] = None, - giveaway_winners: Optional[GiveawayWinners] = None, - giveaway_completed: Optional[GiveawayCompleted] = None, - video_chat_scheduled: Optional[VideoChatScheduled] = None, - video_chat_started: Optional[VideoChatStarted] = None, - video_chat_ended: Optional[VideoChatEnded] = None, - video_chat_participants_invited: Optional[VideoChatParticipantsInvited] = None, - web_app_data: Optional[WebAppData] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - forward_date: Optional[DateTime] = None, - forward_from: Optional[User] = None, - forward_from_chat: Optional[Chat] = None, - forward_from_message_id: Optional[int] = None, - forward_sender_name: Optional[str] = None, - forward_signature: Optional[str] = None, - user_shared: Optional[UserShared] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - message_id=message_id, - date=date, - chat=chat, - message_thread_id=message_thread_id, - from_user=from_user, - sender_chat=sender_chat, - sender_boost_count=sender_boost_count, - sender_business_bot=sender_business_bot, - business_connection_id=business_connection_id, - forward_origin=forward_origin, - is_topic_message=is_topic_message, - is_automatic_forward=is_automatic_forward, - reply_to_message=reply_to_message, - external_reply=external_reply, - quote=quote, - reply_to_story=reply_to_story, - via_bot=via_bot, - edit_date=edit_date, - has_protected_content=has_protected_content, - is_from_offline=is_from_offline, - media_group_id=media_group_id, - author_signature=author_signature, - text=text, - entities=entities, - link_preview_options=link_preview_options, - effect_id=effect_id, - animation=animation, - audio=audio, - document=document, - paid_media=paid_media, - photo=photo, - sticker=sticker, - story=story, - video=video, - video_note=video_note, - voice=voice, - caption=caption, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_media_spoiler=has_media_spoiler, - contact=contact, - dice=dice, - game=game, - poll=poll, - venue=venue, - location=location, - new_chat_members=new_chat_members, - left_chat_member=left_chat_member, - new_chat_title=new_chat_title, - new_chat_photo=new_chat_photo, - delete_chat_photo=delete_chat_photo, - group_chat_created=group_chat_created, - supergroup_chat_created=supergroup_chat_created, - channel_chat_created=channel_chat_created, - message_auto_delete_timer_changed=message_auto_delete_timer_changed, - migrate_to_chat_id=migrate_to_chat_id, - migrate_from_chat_id=migrate_from_chat_id, - pinned_message=pinned_message, - invoice=invoice, - successful_payment=successful_payment, - refunded_payment=refunded_payment, - users_shared=users_shared, - chat_shared=chat_shared, - connected_website=connected_website, - write_access_allowed=write_access_allowed, - passport_data=passport_data, - proximity_alert_triggered=proximity_alert_triggered, - boost_added=boost_added, - chat_background_set=chat_background_set, - forum_topic_created=forum_topic_created, - forum_topic_edited=forum_topic_edited, - forum_topic_closed=forum_topic_closed, - forum_topic_reopened=forum_topic_reopened, - general_forum_topic_hidden=general_forum_topic_hidden, - general_forum_topic_unhidden=general_forum_topic_unhidden, - giveaway_created=giveaway_created, - giveaway=giveaway, - giveaway_winners=giveaway_winners, - giveaway_completed=giveaway_completed, - video_chat_scheduled=video_chat_scheduled, - video_chat_started=video_chat_started, - video_chat_ended=video_chat_ended, - video_chat_participants_invited=video_chat_participants_invited, - web_app_data=web_app_data, - reply_markup=reply_markup, - forward_date=forward_date, - forward_from=forward_from, - forward_from_chat=forward_from_chat, - forward_from_message_id=forward_from_message_id, - forward_sender_name=forward_sender_name, - forward_signature=forward_signature, - user_shared=user_shared, - **__pydantic_kwargs, - ) - - @property - def content_type(self) -> str: - if self.text: - return ContentType.TEXT - if self.audio: - return ContentType.AUDIO - if self.animation: - return ContentType.ANIMATION - if self.document: - return ContentType.DOCUMENT - if self.game: - return ContentType.GAME - if self.photo: - return ContentType.PHOTO - if self.sticker: - return ContentType.STICKER - if self.video: - return ContentType.VIDEO - if self.video_note: - return ContentType.VIDEO_NOTE - if self.voice: - return ContentType.VOICE - if self.contact: - return ContentType.CONTACT - if self.venue: - return ContentType.VENUE - if self.location: - return ContentType.LOCATION - if self.new_chat_members: - return ContentType.NEW_CHAT_MEMBERS - if self.left_chat_member: - return ContentType.LEFT_CHAT_MEMBER - if self.invoice: - return ContentType.INVOICE - if self.successful_payment: - return ContentType.SUCCESSFUL_PAYMENT - if self.users_shared: - return ContentType.USERS_SHARED - if self.connected_website: - return ContentType.CONNECTED_WEBSITE - if self.migrate_from_chat_id: - return ContentType.MIGRATE_FROM_CHAT_ID - if self.migrate_to_chat_id: - return ContentType.MIGRATE_TO_CHAT_ID - if self.pinned_message: - return ContentType.PINNED_MESSAGE - if self.new_chat_title: - return ContentType.NEW_CHAT_TITLE - if self.new_chat_photo: - return ContentType.NEW_CHAT_PHOTO - if self.delete_chat_photo: - return ContentType.DELETE_CHAT_PHOTO - if self.group_chat_created: - return ContentType.GROUP_CHAT_CREATED - if self.supergroup_chat_created: - return ContentType.SUPERGROUP_CHAT_CREATED - if self.channel_chat_created: - return ContentType.CHANNEL_CHAT_CREATED - if self.paid_media: - return ContentType.PAID_MEDIA - if self.passport_data: - return ContentType.PASSPORT_DATA - if self.proximity_alert_triggered: - return ContentType.PROXIMITY_ALERT_TRIGGERED - if self.poll: - return ContentType.POLL - if self.dice: - return ContentType.DICE - if self.message_auto_delete_timer_changed: - return ContentType.MESSAGE_AUTO_DELETE_TIMER_CHANGED - if self.forum_topic_created: - return ContentType.FORUM_TOPIC_CREATED - if self.forum_topic_edited: - return ContentType.FORUM_TOPIC_EDITED - if self.forum_topic_closed: - return ContentType.FORUM_TOPIC_CLOSED - if self.forum_topic_reopened: - return ContentType.FORUM_TOPIC_REOPENED - if self.general_forum_topic_hidden: - return ContentType.GENERAL_FORUM_TOPIC_HIDDEN - if self.general_forum_topic_unhidden: - return ContentType.GENERAL_FORUM_TOPIC_UNHIDDEN - if self.giveaway_created: - return ContentType.GIVEAWAY_CREATED - if self.giveaway: - return ContentType.GIVEAWAY - if self.giveaway_completed: - return ContentType.GIVEAWAY_COMPLETED - if self.giveaway_winners: - return ContentType.GIVEAWAY_WINNERS - if self.video_chat_scheduled: - return ContentType.VIDEO_CHAT_SCHEDULED - if self.video_chat_started: - return ContentType.VIDEO_CHAT_STARTED - if self.video_chat_ended: - return ContentType.VIDEO_CHAT_ENDED - if self.video_chat_participants_invited: - return ContentType.VIDEO_CHAT_PARTICIPANTS_INVITED - if self.web_app_data: - return ContentType.WEB_APP_DATA - if self.user_shared: - return ContentType.USER_SHARED - if self.chat_shared: - return ContentType.CHAT_SHARED - if self.story: - return ContentType.STORY - if self.write_access_allowed: - return ContentType.WRITE_ACCESS_ALLOWED - if self.chat_background_set: - return ContentType.CHAT_BACKGROUND_SET - if self.boost_added: - return ContentType.BOOST_ADDED - if self.refunded_payment: - return ContentType.REFUNDED_PAYMENT - - return ContentType.UNKNOWN - - def _unparse_entities(self, text_decoration: TextDecoration) -> str: - text = self.text or self.caption or "" - entities = self.entities or self.caption_entities or [] - return text_decoration.unparse(text=text, entities=entities) - - @property - def html_text(self) -> str: - return self._unparse_entities(html_decoration) - - @property - def md_text(self) -> str: - return self._unparse_entities(markdown_decoration) - - def as_reply_parameters( - self, - allow_sending_without_reply: Optional[Union[bool, Default]] = Default( - "allow_sending_without_reply" - ), - quote: Optional[str] = None, - quote_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - quote_entities: Optional[List[MessageEntity]] = None, - quote_position: Optional[int] = None, - ) -> ReplyParameters: - return ReplyParameters( - message_id=self.message_id, - chat_id=self.chat.id, - allow_sending_without_reply=allow_sending_without_reply, - quote=quote, - quote_parse_mode=quote_parse_mode, - quote_entities=quote_entities, - quote_position=quote_position, - ) - - def reply_animation( - self, - animation: Union[InputFile, str], - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendAnimation: - """ - Shortcut for method :class:`aiogram.methods.send_animation.SendAnimation` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendanimation - - :param animation: Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. :ref:`More information on Sending Files » ` - :param duration: Duration of sent animation in seconds - :param width: Animation width - :param height: Animation height - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Animation caption (may also be used when resending animation by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the animation caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the animation needs to be covered with a spoiler animation - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_animation.SendAnimation` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendAnimation - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendAnimation( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - animation=animation, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_animation( - self, - animation: Union[InputFile, str], - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendAnimation: - """ - Shortcut for method :class:`aiogram.methods.send_animation.SendAnimation` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send animation files (GIF or H.264/MPEG-4 AVC video without sound). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send animation files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendanimation - - :param animation: Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. :ref:`More information on Sending Files » ` - :param duration: Duration of sent animation in seconds - :param width: Animation width - :param height: Animation height - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Animation caption (may also be used when resending animation by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the animation caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the animation needs to be covered with a spoiler animation - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_animation.SendAnimation` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendAnimation - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendAnimation( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - animation=animation, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_audio( - self, - audio: Union[InputFile, str], - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendAudio: - """ - Shortcut for method :class:`aiogram.methods.send_audio.SendAudio` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future. - For sending voice messages, use the :class:`aiogram.methods.send_voice.SendVoice` method instead. - - Source: https://core.telegram.org/bots/api#sendaudio - - :param audio: Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param caption: Audio caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the audio caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param duration: Duration of the audio in seconds - :param performer: Performer - :param title: Track name - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_audio.SendAudio` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendAudio - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendAudio( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - audio=audio, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - performer=performer, - title=title, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_audio( - self, - audio: Union[InputFile, str], - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendAudio: - """ - Shortcut for method :class:`aiogram.methods.send_audio.SendAudio` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send audio files, if you want Telegram clients to display them in the music player. Your audio must be in the .MP3 or .M4A format. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send audio files of up to 50 MB in size, this limit may be changed in the future. - For sending voice messages, use the :class:`aiogram.methods.send_voice.SendVoice` method instead. - - Source: https://core.telegram.org/bots/api#sendaudio - - :param audio: Audio file to send. Pass a file_id as String to send an audio file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an audio file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param caption: Audio caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the audio caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param duration: Duration of the audio in seconds - :param performer: Performer - :param title: Track name - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_audio.SendAudio` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendAudio - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendAudio( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - audio=audio, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - performer=performer, - title=title, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_contact( - self, - phone_number: str, - first_name: str, - last_name: Optional[str] = None, - vcard: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendContact: - """ - Shortcut for method :class:`aiogram.methods.send_contact.SendContact` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send phone contacts. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendcontact - - :param phone_number: Contact's phone number - :param first_name: Contact's first name - :param last_name: Contact's last name - :param vcard: Additional data about the contact in the form of a `vCard `_, 0-2048 bytes - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_contact.SendContact` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendContact - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendContact( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - phone_number=phone_number, - first_name=first_name, - last_name=last_name, - vcard=vcard, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_contact( - self, - phone_number: str, - first_name: str, - last_name: Optional[str] = None, - vcard: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendContact: - """ - Shortcut for method :class:`aiogram.methods.send_contact.SendContact` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send phone contacts. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendcontact - - :param phone_number: Contact's phone number - :param first_name: Contact's first name - :param last_name: Contact's last name - :param vcard: Additional data about the contact in the form of a `vCard `_, 0-2048 bytes - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_contact.SendContact` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendContact - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendContact( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - phone_number=phone_number, - first_name=first_name, - last_name=last_name, - vcard=vcard, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_document( - self, - document: Union[InputFile, str], - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - disable_content_type_detection: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendDocument: - """ - Shortcut for method :class:`aiogram.methods.send_document.SendDocument` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send general files. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#senddocument - - :param document: File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Document caption (may also be used when resending documents by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the document caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param disable_content_type_detection: Disables automatic server-side content type detection for files uploaded using multipart/form-data - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_document.SendDocument` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendDocument - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendDocument( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - document=document, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_content_type_detection=disable_content_type_detection, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_document( - self, - document: Union[InputFile, str], - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - disable_content_type_detection: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendDocument: - """ - Shortcut for method :class:`aiogram.methods.send_document.SendDocument` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send general files. On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#senddocument - - :param document: File to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Document caption (may also be used when resending documents by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the document caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param disable_content_type_detection: Disables automatic server-side content type detection for files uploaded using multipart/form-data - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_document.SendDocument` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendDocument - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendDocument( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - document=document, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_content_type_detection=disable_content_type_detection, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_game( - self, - game_short_name: str, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendGame: - """ - Shortcut for method :class:`aiogram.methods.send_game.SendGame` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send a game. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendgame - - :param game_short_name: Short name of the game, serves as the unique identifier for the game. Set up your games via `@BotFather `_. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. If empty, one 'Play game_title' button will be shown. If not empty, the first button must launch the game. - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_game.SendGame` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendGame - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendGame( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - game_short_name=game_short_name, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_game( - self, - game_short_name: str, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendGame: - """ - Shortcut for method :class:`aiogram.methods.send_game.SendGame` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send a game. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendgame - - :param game_short_name: Short name of the game, serves as the unique identifier for the game. Set up your games via `@BotFather `_. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. If empty, one 'Play game_title' button will be shown. If not empty, the first button must launch the game. - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_game.SendGame` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendGame - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendGame( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - game_short_name=game_short_name, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_invoice( - self, - title: str, - description: str, - payload: str, - currency: str, - prices: List[LabeledPrice], - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[List[int]] = None, - start_parameter: Optional[str] = None, - provider_data: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendInvoice: - """ - Shortcut for method :class:`aiogram.methods.send_invoice.SendInvoice` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send invoices. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendinvoice - - :param title: Product name, 1-32 characters - :param description: Product description, 1-255 characters - :param payload: Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes. - :param currency: Three-letter ISO 4217 currency code, see `more on currencies `_. Pass 'XTR' for payments in `Telegram Stars `_. - :param prices: Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in `Telegram Stars `_. - :param provider_token: Payment provider token, obtained via `@BotFather `_. Pass an empty string for payments in `Telegram Stars `_. - :param max_tip_amount: The maximum accepted amount for tips in the *smallest units* of the currency (integer, **not** float/double). For example, for a maximum tip of :code:`US$ 1.45` pass :code:`max_tip_amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in `Telegram Stars `_. - :param suggested_tip_amounts: A JSON-serialized array of suggested amounts of tips in the *smallest units* of the currency (integer, **not** float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed *max_tip_amount*. - :param start_parameter: Unique deep-linking parameter. If left empty, **forwarded copies** of the sent message will have a *Pay* button, allowing multiple users to pay directly from the forwarded message, using the same invoice. If non-empty, forwarded copies of the sent message will have a *URL* button with a deep link to the bot (instead of a *Pay* button), with the value used as the start parameter - :param provider_data: JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider. - :param photo_url: URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for. - :param photo_size: Photo size in bytes - :param photo_width: Photo width - :param photo_height: Photo height - :param need_name: Pass :code:`True` if you require the user's full name to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_phone_number: Pass :code:`True` if you require the user's phone number to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_email: Pass :code:`True` if you require the user's email address to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_shipping_address: Pass :code:`True` if you require the user's shipping address to complete the order. Ignored for payments in `Telegram Stars `_. - :param send_phone_number_to_provider: Pass :code:`True` if the user's phone number should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param send_email_to_provider: Pass :code:`True` if the user's email address should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param is_flexible: Pass :code:`True` if the final price depends on the shipping method. Ignored for payments in `Telegram Stars `_. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. If empty, one 'Pay :code:`total price`' button will be shown. If not empty, the first button must be a Pay button. - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_invoice.SendInvoice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendInvoice - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendInvoice( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - title=title, - description=description, - payload=payload, - currency=currency, - prices=prices, - provider_token=provider_token, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - start_parameter=start_parameter, - provider_data=provider_data, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - is_flexible=is_flexible, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_invoice( - self, - title: str, - description: str, - payload: str, - currency: str, - prices: List[LabeledPrice], - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[List[int]] = None, - start_parameter: Optional[str] = None, - provider_data: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendInvoice: - """ - Shortcut for method :class:`aiogram.methods.send_invoice.SendInvoice` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send invoices. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendinvoice - - :param title: Product name, 1-32 characters - :param description: Product description, 1-255 characters - :param payload: Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes. - :param currency: Three-letter ISO 4217 currency code, see `more on currencies `_. Pass 'XTR' for payments in `Telegram Stars `_. - :param prices: Price breakdown, a JSON-serialized list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.). Must contain exactly one item for payments in `Telegram Stars `_. - :param provider_token: Payment provider token, obtained via `@BotFather `_. Pass an empty string for payments in `Telegram Stars `_. - :param max_tip_amount: The maximum accepted amount for tips in the *smallest units* of the currency (integer, **not** float/double). For example, for a maximum tip of :code:`US$ 1.45` pass :code:`max_tip_amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies). Defaults to 0. Not supported for payments in `Telegram Stars `_. - :param suggested_tip_amounts: A JSON-serialized array of suggested amounts of tips in the *smallest units* of the currency (integer, **not** float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed *max_tip_amount*. - :param start_parameter: Unique deep-linking parameter. If left empty, **forwarded copies** of the sent message will have a *Pay* button, allowing multiple users to pay directly from the forwarded message, using the same invoice. If non-empty, forwarded copies of the sent message will have a *URL* button with a deep link to the bot (instead of a *Pay* button), with the value used as the start parameter - :param provider_data: JSON-serialized data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider. - :param photo_url: URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for. - :param photo_size: Photo size in bytes - :param photo_width: Photo width - :param photo_height: Photo height - :param need_name: Pass :code:`True` if you require the user's full name to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_phone_number: Pass :code:`True` if you require the user's phone number to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_email: Pass :code:`True` if you require the user's email address to complete the order. Ignored for payments in `Telegram Stars `_. - :param need_shipping_address: Pass :code:`True` if you require the user's shipping address to complete the order. Ignored for payments in `Telegram Stars `_. - :param send_phone_number_to_provider: Pass :code:`True` if the user's phone number should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param send_email_to_provider: Pass :code:`True` if the user's email address should be sent to the provider. Ignored for payments in `Telegram Stars `_. - :param is_flexible: Pass :code:`True` if the final price depends on the shipping method. Ignored for payments in `Telegram Stars `_. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. If empty, one 'Pay :code:`total price`' button will be shown. If not empty, the first button must be a Pay button. - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_invoice.SendInvoice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendInvoice - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendInvoice( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - title=title, - description=description, - payload=payload, - currency=currency, - prices=prices, - provider_token=provider_token, - max_tip_amount=max_tip_amount, - suggested_tip_amounts=suggested_tip_amounts, - start_parameter=start_parameter, - provider_data=provider_data, - photo_url=photo_url, - photo_size=photo_size, - photo_width=photo_width, - photo_height=photo_height, - need_name=need_name, - need_phone_number=need_phone_number, - need_email=need_email, - need_shipping_address=need_shipping_address, - send_phone_number_to_provider=send_phone_number_to_provider, - send_email_to_provider=send_email_to_provider, - is_flexible=is_flexible, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_location( - self, - latitude: float, - longitude: float, - horizontal_accuracy: Optional[float] = None, - live_period: Optional[int] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendLocation: - """ - Shortcut for method :class:`aiogram.methods.send_location.SendLocation` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send point on the map. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendlocation - - :param latitude: Latitude of the location - :param longitude: Longitude of the location - :param horizontal_accuracy: The radius of uncertainty for the location, measured in meters; 0-1500 - :param live_period: Period in seconds during which the location will be updated (see `Live Locations `_, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely. - :param heading: For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified. - :param proximity_alert_radius: For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_location.SendLocation` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendLocation - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendLocation( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - latitude=latitude, - longitude=longitude, - horizontal_accuracy=horizontal_accuracy, - live_period=live_period, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_location( - self, - latitude: float, - longitude: float, - horizontal_accuracy: Optional[float] = None, - live_period: Optional[int] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendLocation: - """ - Shortcut for method :class:`aiogram.methods.send_location.SendLocation` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send point on the map. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendlocation - - :param latitude: Latitude of the location - :param longitude: Longitude of the location - :param horizontal_accuracy: The radius of uncertainty for the location, measured in meters; 0-1500 - :param live_period: Period in seconds during which the location will be updated (see `Live Locations `_, should be between 60 and 86400, or 0x7FFFFFFF for live locations that can be edited indefinitely. - :param heading: For live locations, a direction in which the user is moving, in degrees. Must be between 1 and 360 if specified. - :param proximity_alert_radius: For live locations, a maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_location.SendLocation` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendLocation - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendLocation( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - latitude=latitude, - longitude=longitude, - horizontal_accuracy=horizontal_accuracy, - live_period=live_period, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_media_group( - self, - media: List[Union[InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo]], - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendMediaGroup: - """ - Shortcut for method :class:`aiogram.methods.send_media_group.SendMediaGroup` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send a group of photos, videos, documents or audios as an album. Documents and audio files can be only grouped in an album with messages of the same type. On success, an array of `Messages `_ that were sent is returned. - - Source: https://core.telegram.org/bots/api#sendmediagroup - - :param media: A JSON-serialized array describing messages to be sent, must include 2-10 items - :param disable_notification: Sends messages `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent messages from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_media_group.SendMediaGroup` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendMediaGroup - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendMediaGroup( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - media=media, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_media_group( - self, - media: List[Union[InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo]], - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendMediaGroup: - """ - Shortcut for method :class:`aiogram.methods.send_media_group.SendMediaGroup` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send a group of photos, videos, documents or audios as an album. Documents and audio files can be only grouped in an album with messages of the same type. On success, an array of `Messages `_ that were sent is returned. - - Source: https://core.telegram.org/bots/api#sendmediagroup - - :param media: A JSON-serialized array describing messages to be sent, must include 2-10 items - :param disable_notification: Sends messages `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent messages from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the messages are a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_media_group.SendMediaGroup` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendMediaGroup - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendMediaGroup( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - media=media, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply( - self, - text: str, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - entities: Optional[List[MessageEntity]] = None, - link_preview_options: Optional[Union[LinkPreviewOptions, Default]] = Default( - "link_preview" - ), - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - disable_web_page_preview: Optional[Union[bool, Default]] = Default( - "link_preview_is_disabled" - ), - **kwargs: Any, - ) -> SendMessage: - """ - Shortcut for method :class:`aiogram.methods.send_message.SendMessage` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send text messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendmessage - - :param text: Text of the message to be sent, 1-4096 characters after entities parsing - :param parse_mode: Mode for parsing entities in the message text. See `formatting options `_ for more details. - :param entities: A JSON-serialized list of special entities that appear in message text, which can be specified instead of *parse_mode* - :param link_preview_options: Link preview generation options for the message - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param disable_web_page_preview: Disables link previews for links in this message - :return: instance of method :class:`aiogram.methods.send_message.SendMessage` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendMessage - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendMessage( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - text=text, - parse_mode=parse_mode, - entities=entities, - link_preview_options=link_preview_options, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - disable_web_page_preview=disable_web_page_preview, - **kwargs, - ).as_(self._bot) - - def answer( - self, - text: str, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - entities: Optional[List[MessageEntity]] = None, - link_preview_options: Optional[Union[LinkPreviewOptions, Default]] = Default( - "link_preview" - ), - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - disable_web_page_preview: Optional[Union[bool, Default]] = Default( - "link_preview_is_disabled" - ), - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendMessage: - """ - Shortcut for method :class:`aiogram.methods.send_message.SendMessage` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send text messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendmessage - - :param text: Text of the message to be sent, 1-4096 characters after entities parsing - :param parse_mode: Mode for parsing entities in the message text. See `formatting options `_ for more details. - :param entities: A JSON-serialized list of special entities that appear in message text, which can be specified instead of *parse_mode* - :param link_preview_options: Link preview generation options for the message - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param disable_web_page_preview: Disables link previews for links in this message - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_message.SendMessage` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendMessage - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendMessage( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - text=text, - parse_mode=parse_mode, - entities=entities, - link_preview_options=link_preview_options, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - disable_web_page_preview=disable_web_page_preview, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_photo( - self, - photo: Union[InputFile, str], - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendPhoto: - """ - Shortcut for method :class:`aiogram.methods.send_photo.SendPhoto` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send photos. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendphoto - - :param photo: Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. :ref:`More information on Sending Files » ` - :param caption: Photo caption (may also be used when resending photos by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the photo caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the photo needs to be covered with a spoiler animation - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_photo.SendPhoto` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendPhoto - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendPhoto( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - photo=photo, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_photo( - self, - photo: Union[InputFile, str], - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendPhoto: - """ - Shortcut for method :class:`aiogram.methods.send_photo.SendPhoto` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send photos. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendphoto - - :param photo: Photo to send. Pass a file_id as String to send a photo that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a photo from the Internet, or upload a new photo using multipart/form-data. The photo must be at most 10 MB in size. The photo's width and height must not exceed 10000 in total. Width and height ratio must be at most 20. :ref:`More information on Sending Files » ` - :param caption: Photo caption (may also be used when resending photos by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the photo caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the photo needs to be covered with a spoiler animation - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_photo.SendPhoto` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendPhoto - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendPhoto( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - photo=photo, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_poll( - self, - question: str, - options: List[Union[InputPollOption, str]], - question_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - question_entities: Optional[List[MessageEntity]] = None, - is_anonymous: Optional[bool] = None, - type: Optional[str] = None, - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[int] = None, - explanation: Optional[str] = None, - explanation_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - explanation_entities: Optional[List[MessageEntity]] = None, - open_period: Optional[int] = None, - close_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - is_closed: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendPoll: - """ - Shortcut for method :class:`aiogram.methods.send_poll.SendPoll` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send a native poll. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendpoll - - :param question: Poll question, 1-300 characters - :param options: A JSON-serialized list of 2-10 answer options - :param question_parse_mode: Mode for parsing entities in the question. See `formatting options `_ for more details. Currently, only custom emoji entities are allowed - :param question_entities: A JSON-serialized list of special entities that appear in the poll question. It can be specified instead of *question_parse_mode* - :param is_anonymous: :code:`True`, if the poll needs to be anonymous, defaults to :code:`True` - :param type: Poll type, 'quiz' or 'regular', defaults to 'regular' - :param allows_multiple_answers: :code:`True`, if the poll allows multiple answers, ignored for polls in quiz mode, defaults to :code:`False` - :param correct_option_id: 0-based identifier of the correct answer option, required for polls in quiz mode - :param explanation: Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters with at most 2 line feeds after entities parsing - :param explanation_parse_mode: Mode for parsing entities in the explanation. See `formatting options `_ for more details. - :param explanation_entities: A JSON-serialized list of special entities that appear in the poll explanation. It can be specified instead of *explanation_parse_mode* - :param open_period: Amount of time in seconds the poll will be active after creation, 5-600. Can't be used together with *close_date*. - :param close_date: Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 600 seconds in the future. Can't be used together with *open_period*. - :param is_closed: Pass :code:`True` if the poll needs to be immediately closed. This can be useful for poll preview. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_poll.SendPoll` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendPoll - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendPoll( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - question=question, - options=options, - question_parse_mode=question_parse_mode, - question_entities=question_entities, - is_anonymous=is_anonymous, - type=type, - allows_multiple_answers=allows_multiple_answers, - correct_option_id=correct_option_id, - explanation=explanation, - explanation_parse_mode=explanation_parse_mode, - explanation_entities=explanation_entities, - open_period=open_period, - close_date=close_date, - is_closed=is_closed, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_poll( - self, - question: str, - options: List[Union[InputPollOption, str]], - question_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - question_entities: Optional[List[MessageEntity]] = None, - is_anonymous: Optional[bool] = None, - type: Optional[str] = None, - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[int] = None, - explanation: Optional[str] = None, - explanation_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - explanation_entities: Optional[List[MessageEntity]] = None, - open_period: Optional[int] = None, - close_date: Optional[Union[datetime.datetime, datetime.timedelta, int]] = None, - is_closed: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendPoll: - """ - Shortcut for method :class:`aiogram.methods.send_poll.SendPoll` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send a native poll. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendpoll - - :param question: Poll question, 1-300 characters - :param options: A JSON-serialized list of 2-10 answer options - :param question_parse_mode: Mode for parsing entities in the question. See `formatting options `_ for more details. Currently, only custom emoji entities are allowed - :param question_entities: A JSON-serialized list of special entities that appear in the poll question. It can be specified instead of *question_parse_mode* - :param is_anonymous: :code:`True`, if the poll needs to be anonymous, defaults to :code:`True` - :param type: Poll type, 'quiz' or 'regular', defaults to 'regular' - :param allows_multiple_answers: :code:`True`, if the poll allows multiple answers, ignored for polls in quiz mode, defaults to :code:`False` - :param correct_option_id: 0-based identifier of the correct answer option, required for polls in quiz mode - :param explanation: Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters with at most 2 line feeds after entities parsing - :param explanation_parse_mode: Mode for parsing entities in the explanation. See `formatting options `_ for more details. - :param explanation_entities: A JSON-serialized list of special entities that appear in the poll explanation. It can be specified instead of *explanation_parse_mode* - :param open_period: Amount of time in seconds the poll will be active after creation, 5-600. Can't be used together with *close_date*. - :param close_date: Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 600 seconds in the future. Can't be used together with *open_period*. - :param is_closed: Pass :code:`True` if the poll needs to be immediately closed. This can be useful for poll preview. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_poll.SendPoll` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendPoll - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendPoll( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - question=question, - options=options, - question_parse_mode=question_parse_mode, - question_entities=question_entities, - is_anonymous=is_anonymous, - type=type, - allows_multiple_answers=allows_multiple_answers, - correct_option_id=correct_option_id, - explanation=explanation, - explanation_parse_mode=explanation_parse_mode, - explanation_entities=explanation_entities, - open_period=open_period, - close_date=close_date, - is_closed=is_closed, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_dice( - self, - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendDice: - """ - Shortcut for method :class:`aiogram.methods.send_dice.SendDice` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send an animated emoji that will display a random value. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#senddice - - :param emoji: Emoji on which the dice throw animation is based. Currently, must be one of '🎲', '🎯', '🏀', '⚽', '🎳', or '🎰'. Dice can have values 1-6 for '🎲', '🎯' and '🎳', values 1-5 for '🏀' and '⚽', and values 1-64 for '🎰'. Defaults to '🎲' - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_dice.SendDice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendDice - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendDice( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_dice( - self, - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendDice: - """ - Shortcut for method :class:`aiogram.methods.send_dice.SendDice` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send an animated emoji that will display a random value. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#senddice - - :param emoji: Emoji on which the dice throw animation is based. Currently, must be one of '🎲', '🎯', '🏀', '⚽', '🎳', or '🎰'. Dice can have values 1-6 for '🎲', '🎯' and '🎳', values 1-5 for '🏀' and '⚽', and values 1-64 for '🎰'. Defaults to '🎲' - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_dice.SendDice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendDice - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendDice( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_sticker( - self, - sticker: Union[InputFile, str], - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendSticker: - """ - Shortcut for method :class:`aiogram.methods.send_sticker.SendSticker` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send static .WEBP, `animated `_ .TGS, or `video `_ .WEBM stickers. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendsticker - - :param sticker: Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. :ref:`More information on Sending Files » `. Video and animated stickers can't be sent via an HTTP URL. - :param emoji: Emoji associated with the sticker; only for just uploaded stickers - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_sticker.SendSticker` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendSticker - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendSticker( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - sticker=sticker, - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_sticker( - self, - sticker: Union[InputFile, str], - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendSticker: - """ - Shortcut for method :class:`aiogram.methods.send_sticker.SendSticker` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send static .WEBP, `animated `_ .TGS, or `video `_ .WEBM stickers. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendsticker - - :param sticker: Sticker to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a .WEBP sticker from the Internet, or upload a new .WEBP, .TGS, or .WEBM sticker using multipart/form-data. :ref:`More information on Sending Files » `. Video and animated stickers can't be sent via an HTTP URL. - :param emoji: Emoji associated with the sticker; only for just uploaded stickers - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_sticker.SendSticker` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendSticker - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendSticker( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - sticker=sticker, - emoji=emoji, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_venue( - self, - latitude: float, - longitude: float, - title: str, - address: str, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendVenue: - """ - Shortcut for method :class:`aiogram.methods.send_venue.SendVenue` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send information about a venue. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvenue - - :param latitude: Latitude of the venue - :param longitude: Longitude of the venue - :param title: Name of the venue - :param address: Address of the venue - :param foursquare_id: Foursquare identifier of the venue - :param foursquare_type: Foursquare type of the venue, if known. (For example, 'arts_entertainment/default', 'arts_entertainment/aquarium' or 'food/icecream'.) - :param google_place_id: Google Places identifier of the venue - :param google_place_type: Google Places type of the venue. (See `supported types `_.) - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_venue.SendVenue` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVenue - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendVenue( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - latitude=latitude, - longitude=longitude, - title=title, - address=address, - foursquare_id=foursquare_id, - foursquare_type=foursquare_type, - google_place_id=google_place_id, - google_place_type=google_place_type, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_venue( - self, - latitude: float, - longitude: float, - title: str, - address: str, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVenue: - """ - Shortcut for method :class:`aiogram.methods.send_venue.SendVenue` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send information about a venue. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvenue - - :param latitude: Latitude of the venue - :param longitude: Longitude of the venue - :param title: Name of the venue - :param address: Address of the venue - :param foursquare_id: Foursquare identifier of the venue - :param foursquare_type: Foursquare type of the venue, if known. (For example, 'arts_entertainment/default', 'arts_entertainment/aquarium' or 'food/icecream'.) - :param google_place_id: Google Places identifier of the venue - :param google_place_type: Google Places type of the venue. (See `supported types `_.) - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_venue.SendVenue` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVenue - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendVenue( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - latitude=latitude, - longitude=longitude, - title=title, - address=address, - foursquare_id=foursquare_id, - foursquare_type=foursquare_type, - google_place_id=google_place_id, - google_place_type=google_place_type, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_video( - self, - video: Union[InputFile, str], - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - supports_streaming: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendVideo: - """ - Shortcut for method :class:`aiogram.methods.send_video.SendVideo` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvideo - - :param video: Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. :ref:`More information on Sending Files » ` - :param duration: Duration of sent video in seconds - :param width: Video width - :param height: Video height - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Video caption (may also be used when resending videos by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the video caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the video needs to be covered with a spoiler animation - :param supports_streaming: Pass :code:`True` if the uploaded video is suitable for streaming - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_video.SendVideo` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVideo - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendVideo( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - video=video, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - supports_streaming=supports_streaming, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_video( - self, - video: Union[InputFile, str], - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - has_spoiler: Optional[bool] = None, - supports_streaming: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVideo: - """ - Shortcut for method :class:`aiogram.methods.send_video.SendVideo` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send video files of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvideo - - :param video: Video to send. Pass a file_id as String to send a video that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a video from the Internet, or upload a new video using multipart/form-data. :ref:`More information on Sending Files » ` - :param duration: Duration of sent video in seconds - :param width: Video width - :param height: Video height - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param caption: Video caption (may also be used when resending videos by *file_id*), 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the video caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param has_spoiler: Pass :code:`True` if the video needs to be covered with a spoiler animation - :param supports_streaming: Pass :code:`True` if the uploaded video is suitable for streaming - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_video.SendVideo` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVideo - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendVideo( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - video=video, - duration=duration, - width=width, - height=height, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - has_spoiler=has_spoiler, - supports_streaming=supports_streaming, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_video_note( - self, - video_note: Union[InputFile, str], - duration: Optional[int] = None, - length: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendVideoNote: - """ - Shortcut for method :class:`aiogram.methods.send_video_note.SendVideoNote` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - As of `v.4.0 `_, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvideonote - - :param video_note: Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. :ref:`More information on Sending Files » `. Sending video notes by a URL is currently unsupported - :param duration: Duration of sent video in seconds - :param length: Video width and height, i.e. diameter of the video message - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_video_note.SendVideoNote` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVideoNote - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendVideoNote( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - video_note=video_note, - duration=duration, - length=length, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_video_note( - self, - video_note: Union[InputFile, str], - duration: Optional[int] = None, - length: Optional[int] = None, - thumbnail: Optional[InputFile] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVideoNote: - """ - Shortcut for method :class:`aiogram.methods.send_video_note.SendVideoNote` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - As of `v.4.0 `_, Telegram clients support rounded square MPEG4 videos of up to 1 minute long. Use this method to send video messages. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendvideonote - - :param video_note: Video note to send. Pass a file_id as String to send a video note that exists on the Telegram servers (recommended) or upload a new video using multipart/form-data. :ref:`More information on Sending Files » `. Sending video notes by a URL is currently unsupported - :param duration: Duration of sent video in seconds - :param length: Video width and height, i.e. diameter of the video message - :param thumbnail: Thumbnail of the file sent; can be ignored if thumbnail generation for the file is supported server-side. The thumbnail should be in JPEG format and less than 200 kB in size. A thumbnail's width and height should not exceed 320. Ignored if the file is not uploaded using multipart/form-data. Thumbnails can't be reused and can be only uploaded as a new file, so you can pass 'attach://' if the thumbnail was uploaded using multipart/form-data under . :ref:`More information on Sending Files » ` - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_video_note.SendVideoNote` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVideoNote - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendVideoNote( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - video_note=video_note, - duration=duration, - length=length, - thumbnail=thumbnail, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def reply_voice( - self, - voice: Union[InputFile, str], - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - **kwargs: Any, - ) -> SendVoice: - """ - Shortcut for method :class:`aiogram.methods.send_voice.SendVoice` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as :class:`aiogram.types.audio.Audio` or :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvoice - - :param voice: Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param caption: Voice message caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the voice message caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param duration: Duration of the voice message in seconds - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :return: instance of method :class:`aiogram.methods.send_voice.SendVoice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVoice - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendVoice( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - voice=voice, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - **kwargs, - ).as_(self._bot) - - def answer_voice( - self, - voice: Union[InputFile, str], - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> SendVoice: - """ - Shortcut for method :class:`aiogram.methods.send_voice.SendVoice` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send audio files, if you want Telegram clients to display the file as a playable voice message. For this to work, your audio must be in an .OGG file encoded with OPUS, or in .MP3 format, or in .M4A format (other formats may be sent as :class:`aiogram.types.audio.Audio` or :class:`aiogram.types.document.Document`). On success, the sent :class:`aiogram.types.message.Message` is returned. Bots can currently send voice messages of up to 50 MB in size, this limit may be changed in the future. - - Source: https://core.telegram.org/bots/api#sendvoice - - :param voice: Audio file to send. Pass a file_id as String to send a file that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get a file from the Internet, or upload a new one using multipart/form-data. :ref:`More information on Sending Files » ` - :param caption: Voice message caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the voice message caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param duration: Duration of the voice message in seconds - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param message_effect_id: Unique identifier of the message effect to be added to the message; for private chats only - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.send_voice.SendVoice` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendVoice - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendVoice( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - voice=voice, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - disable_notification=disable_notification, - protect_content=protect_content, - message_effect_id=message_effect_id, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def send_copy( # noqa: C901 - self: Message, - chat_id: Union[str, int], - disable_notification: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, None] = None, - allow_sending_without_reply: Optional[bool] = None, - message_thread_id: Optional[int] = None, - business_connection_id: Optional[str] = None, - parse_mode: Optional[str] = None, - message_effect_id: Optional[str] = None, - ) -> Union[ - ForwardMessage, - SendAnimation, - SendAudio, - SendContact, - SendDocument, - SendLocation, - SendMessage, - SendPhoto, - SendPoll, - SendDice, - SendSticker, - SendVenue, - SendVideo, - SendVideoNote, - SendVoice, - ]: - """ - Send copy of a message. - - Is similar to :meth:`aiogram.client.bot.Bot.copy_message` - but returning the sent message instead of :class:`aiogram.types.message_id.MessageId` - - .. note:: - - This method doesn't use the API method named `copyMessage` and - historically implemented before the similar method is added to API - - :param chat_id: - :param disable_notification: - :param reply_to_message_id: - :param reply_parameters: - :param reply_markup: - :param allow_sending_without_reply: - :param message_thread_id: - :param business_connection_id: - :param parse_mode: - :param message_effect_id: - :return: - """ - from ..methods import ( - ForwardMessage, - SendAnimation, - SendAudio, - SendContact, - SendDice, - SendDocument, - SendLocation, - SendMessage, - SendPhoto, - SendPoll, - SendSticker, - SendVenue, - SendVideo, - SendVideoNote, - SendVoice, - ) - - kwargs: Dict[str, Any] = { - "chat_id": chat_id, - "reply_markup": reply_markup or self.reply_markup, - "disable_notification": disable_notification, - "reply_to_message_id": reply_to_message_id, - "reply_parameters": reply_parameters, - "message_thread_id": message_thread_id, - "business_connection_id": business_connection_id, - "allow_sending_without_reply": allow_sending_without_reply, - # when sending a copy, we don't need any parse mode - # because all entities are already prepared - "parse_mode": parse_mode, - "message_effect_id": message_effect_id or self.effect_id, - } - - if self.text: - return SendMessage( - text=self.text, - entities=self.entities, - **kwargs, - ).as_(self._bot) - if self.audio: - return SendAudio( - audio=self.audio.file_id, - caption=self.caption, - title=self.audio.title, - performer=self.audio.performer, - duration=self.audio.duration, - caption_entities=self.caption_entities, - **kwargs, - ).as_(self._bot) - if self.animation: - return SendAnimation( - animation=self.animation.file_id, - caption=self.caption, - caption_entities=self.caption_entities, - **kwargs, - ).as_(self._bot) - if self.document: - return SendDocument( - document=self.document.file_id, - caption=self.caption, - caption_entities=self.caption_entities, - **kwargs, - ).as_(self._bot) - if self.photo: - return SendPhoto( - photo=self.photo[-1].file_id, - caption=self.caption, - caption_entities=self.caption_entities, - **kwargs, - ).as_(self._bot) - if self.sticker: - return SendSticker( - sticker=self.sticker.file_id, - **kwargs, - ).as_(self._bot) - if self.video: - return SendVideo( - video=self.video.file_id, - caption=self.caption, - caption_entities=self.caption_entities, - **kwargs, - ).as_(self._bot) - if self.video_note: - return SendVideoNote( - video_note=self.video_note.file_id, - **kwargs, - ).as_(self._bot) - if self.voice: - return SendVoice( - voice=self.voice.file_id, - **kwargs, - ).as_(self._bot) - if self.contact: - return SendContact( - phone_number=self.contact.phone_number, - first_name=self.contact.first_name, - last_name=self.contact.last_name, - vcard=self.contact.vcard, - **kwargs, - ).as_(self._bot) - if self.venue: - return SendVenue( - latitude=self.venue.location.latitude, - longitude=self.venue.location.longitude, - title=self.venue.title, - address=self.venue.address, - foursquare_id=self.venue.foursquare_id, - foursquare_type=self.venue.foursquare_type, - **kwargs, - ).as_(self._bot) - if self.location: - return SendLocation( - latitude=self.location.latitude, - longitude=self.location.longitude, - **kwargs, - ).as_(self._bot) - if self.poll: - from .input_poll_option import InputPollOption - - return SendPoll( - question=self.poll.question, - options=[ - InputPollOption( - text=option.text, - voter_count=option.voter_count, - text_entities=option.text_entities, - text_parse_mode=None, - ) - for option in self.poll.options - ], - **kwargs, - ).as_(self._bot) - if self.dice: # Dice value can't be controlled - return SendDice( - **kwargs, - ).as_(self._bot) - if self.story: - return ForwardMessage( - from_chat_id=self.chat.id, - message_id=self.message_id, - **kwargs, - ).as_(self._bot) - - raise TypeError("This type of message can't be copied.") - - def copy_to( - self, - chat_id: Union[int, str], - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - allow_sending_without_reply: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, - **kwargs: Any, - ) -> CopyMessage: - """ - Shortcut for method :class:`aiogram.methods.copy_message.CopyMessage` - will automatically fill method attributes: - - - :code:`from_chat_id` - - :code:`message_id` - - Use this method to copy messages of any kind. Service messages, paid media messages, giveaway messages, giveaway winners messages, and invoice messages can't be copied. A quiz :class:`aiogram.methods.poll.Poll` can be copied only if the value of the field *correct_option_id* is known to the bot. The method is analogous to the method :class:`aiogram.methods.forward_message.ForwardMessage`, but the copied message doesn't have a link to the original message. Returns the :class:`aiogram.types.message_id.MessageId` of the sent message on success. - - Source: https://core.telegram.org/bots/api#copymessage - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param caption: New caption for media, 0-1024 characters after entities parsing. If not specified, the original caption is kept - :param parse_mode: Mode for parsing entities in the new caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the new caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media. Ignored if a new caption isn't specified. - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :param allow_sending_without_reply: Pass :code:`True` if the message should be sent even if the specified replied-to message is not found - :param reply_to_message_id: If the message is a reply, ID of the original message - :return: instance of method :class:`aiogram.methods.copy_message.CopyMessage` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import CopyMessage - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return CopyMessage( - from_chat_id=self.chat.id, - message_id=self.message_id, - chat_id=chat_id, - message_thread_id=message_thread_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - disable_notification=disable_notification, - protect_content=protect_content, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - allow_sending_without_reply=allow_sending_without_reply, - reply_to_message_id=reply_to_message_id, - **kwargs, - ).as_(self._bot) - - def edit_text( - self, - text: str, - business_connection_id: Optional[str] = None, - inline_message_id: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - entities: Optional[List[MessageEntity]] = None, - link_preview_options: Optional[LinkPreviewOptions] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - disable_web_page_preview: Optional[Union[bool, Default]] = Default( - "link_preview_is_disabled" - ), - **kwargs: Any, - ) -> EditMessageText: - """ - Shortcut for method :class:`aiogram.methods.edit_message_text.EditMessageText` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_id` - - Use this method to edit text and `game `_ messages. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - - Source: https://core.telegram.org/bots/api#editmessagetext - - :param text: New text of the message, 1-4096 characters after entities parsing - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param parse_mode: Mode for parsing entities in the message text. See `formatting options `_ for more details. - :param entities: A JSON-serialized list of special entities that appear in message text, which can be specified instead of *parse_mode* - :param link_preview_options: Link preview generation options for the message - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. - :param disable_web_page_preview: Disables link previews for links in this message - :return: instance of method :class:`aiogram.methods.edit_message_text.EditMessageText` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import EditMessageText - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return EditMessageText( - chat_id=self.chat.id, - message_id=self.message_id, - text=text, - business_connection_id=business_connection_id, - inline_message_id=inline_message_id, - parse_mode=parse_mode, - entities=entities, - link_preview_options=link_preview_options, - reply_markup=reply_markup, - disable_web_page_preview=disable_web_page_preview, - **kwargs, - ).as_(self._bot) - - def forward( - self, - chat_id: Union[int, str], - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[Union[bool, Default]] = Default("protect_content"), - **kwargs: Any, - ) -> ForwardMessage: - """ - Shortcut for method :class:`aiogram.methods.forward_message.ForwardMessage` - will automatically fill method attributes: - - - :code:`from_chat_id` - - :code:`message_id` - - Use this method to forward messages of any kind. Service messages and messages with protected content can't be forwarded. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#forwardmessage - - :param chat_id: Unique identifier for the target chat or username of the target channel (in the format :code:`@channelusername`) - :param message_thread_id: Unique identifier for the target message thread (topic) of the forum; for forum supergroups only - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the forwarded message from forwarding and saving - :return: instance of method :class:`aiogram.methods.forward_message.ForwardMessage` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import ForwardMessage - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return ForwardMessage( - from_chat_id=self.chat.id, - message_id=self.message_id, - chat_id=chat_id, - message_thread_id=message_thread_id, - disable_notification=disable_notification, - protect_content=protect_content, - **kwargs, - ).as_(self._bot) - - def edit_media( - self, - media: Union[ - InputMediaAnimation, - InputMediaDocument, - InputMediaAudio, - InputMediaPhoto, - InputMediaVideo, - ], - business_connection_id: Optional[str] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - **kwargs: Any, - ) -> EditMessageMedia: - """ - Shortcut for method :class:`aiogram.methods.edit_message_media.EditMessageMedia` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_id` - - Use this method to edit animation, audio, document, photo, or video messages. If a message is part of a message album, then it can be edited only to an audio for audio albums, only to a document for document albums and to a photo or a video otherwise. When an inline message is edited, a new file can't be uploaded; use a previously uploaded file via its file_id or specify a URL. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - - Source: https://core.telegram.org/bots/api#editmessagemedia - - :param media: A JSON-serialized object for a new media content of the message - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param reply_markup: A JSON-serialized object for a new `inline keyboard `_. - :return: instance of method :class:`aiogram.methods.edit_message_media.EditMessageMedia` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import EditMessageMedia - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return EditMessageMedia( - chat_id=self.chat.id, - message_id=self.message_id, - media=media, - business_connection_id=business_connection_id, - inline_message_id=inline_message_id, - reply_markup=reply_markup, - **kwargs, - ).as_(self._bot) - - def edit_reply_markup( - self, - business_connection_id: Optional[str] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - **kwargs: Any, - ) -> EditMessageReplyMarkup: - """ - Shortcut for method :class:`aiogram.methods.edit_message_reply_markup.EditMessageReplyMarkup` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_id` - - Use this method to edit only the reply markup of messages. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - - Source: https://core.telegram.org/bots/api#editmessagereplymarkup - - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. - :return: instance of method :class:`aiogram.methods.edit_message_reply_markup.EditMessageReplyMarkup` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import EditMessageReplyMarkup - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return EditMessageReplyMarkup( - chat_id=self.chat.id, - message_id=self.message_id, - business_connection_id=business_connection_id, - inline_message_id=inline_message_id, - reply_markup=reply_markup, - **kwargs, - ).as_(self._bot) - - def delete_reply_markup( - self, - business_connection_id: Optional[str] = None, - inline_message_id: Optional[str] = None, - **kwargs: Any, - ) -> EditMessageReplyMarkup: - """ - Shortcut for method :class:`aiogram.methods.edit_message_reply_markup.EditMessageReplyMarkup` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_id` - - :code:`reply_markup` - - Use this method to edit only the reply markup of messages. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - - Source: https://core.telegram.org/bots/api#editmessagereplymarkup - - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :return: instance of method :class:`aiogram.methods.edit_message_reply_markup.EditMessageReplyMarkup` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import EditMessageReplyMarkup - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return EditMessageReplyMarkup( - chat_id=self.chat.id, - message_id=self.message_id, - reply_markup=None, - business_connection_id=business_connection_id, - inline_message_id=inline_message_id, - **kwargs, - ).as_(self._bot) - - def edit_live_location( - self, - latitude: float, - longitude: float, - business_connection_id: Optional[str] = None, - inline_message_id: Optional[str] = None, - live_period: Optional[int] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - **kwargs: Any, - ) -> EditMessageLiveLocation: - """ - Shortcut for method :class:`aiogram.methods.edit_message_live_location.EditMessageLiveLocation` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_id` - - Use this method to edit live location messages. A location can be edited until its *live_period* expires or editing is explicitly disabled by a call to :class:`aiogram.methods.stop_message_live_location.StopMessageLiveLocation`. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. - - Source: https://core.telegram.org/bots/api#editmessagelivelocation - - :param latitude: Latitude of new location - :param longitude: Longitude of new location - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param live_period: New period in seconds during which the location can be updated, starting from the message send date. If 0x7FFFFFFF is specified, then the location can be updated forever. Otherwise, the new value must not exceed the current *live_period* by more than a day, and the live location expiration date must remain within the next 90 days. If not specified, then *live_period* remains unchanged - :param horizontal_accuracy: The radius of uncertainty for the location, measured in meters; 0-1500 - :param heading: Direction in which the user is moving, in degrees. Must be between 1 and 360 if specified. - :param proximity_alert_radius: The maximum distance for proximity alerts about approaching another chat member, in meters. Must be between 1 and 100000 if specified. - :param reply_markup: A JSON-serialized object for a new `inline keyboard `_. - :return: instance of method :class:`aiogram.methods.edit_message_live_location.EditMessageLiveLocation` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import EditMessageLiveLocation - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return EditMessageLiveLocation( - chat_id=self.chat.id, - message_id=self.message_id, - latitude=latitude, - longitude=longitude, - business_connection_id=business_connection_id, - inline_message_id=inline_message_id, - live_period=live_period, - horizontal_accuracy=horizontal_accuracy, - heading=heading, - proximity_alert_radius=proximity_alert_radius, - reply_markup=reply_markup, - **kwargs, - ).as_(self._bot) - - def stop_live_location( - self, - business_connection_id: Optional[str] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - **kwargs: Any, - ) -> StopMessageLiveLocation: - """ - Shortcut for method :class:`aiogram.methods.stop_message_live_location.StopMessageLiveLocation` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_id` - - Use this method to stop updating a live location message before *live_period* expires. On success, if the message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. - - Source: https://core.telegram.org/bots/api#stopmessagelivelocation - - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param reply_markup: A JSON-serialized object for a new `inline keyboard `_. - :return: instance of method :class:`aiogram.methods.stop_message_live_location.StopMessageLiveLocation` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import StopMessageLiveLocation - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return StopMessageLiveLocation( - chat_id=self.chat.id, - message_id=self.message_id, - business_connection_id=business_connection_id, - inline_message_id=inline_message_id, - reply_markup=reply_markup, - **kwargs, - ).as_(self._bot) - - def edit_caption( - self, - business_connection_id: Optional[str] = None, - inline_message_id: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[Union[bool, Default]] = Default( - "show_caption_above_media" - ), - reply_markup: Optional[InlineKeyboardMarkup] = None, - **kwargs: Any, - ) -> EditMessageCaption: - """ - Shortcut for method :class:`aiogram.methods.edit_message_caption.EditMessageCaption` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_id` - - Use this method to edit captions of messages. On success, if the edited message is not an inline message, the edited :class:`aiogram.types.message.Message` is returned, otherwise :code:`True` is returned. Note that business messages that were not sent by the bot and do not contain an inline keyboard can only be edited within **48 hours** from the time they were sent. - - Source: https://core.telegram.org/bots/api#editmessagecaption - - :param business_connection_id: Unique identifier of the business connection on behalf of which the message to be edited was sent - :param inline_message_id: Required if *chat_id* and *message_id* are not specified. Identifier of the inline message - :param caption: New caption of the message, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the message caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media. Supported only for animation, photo and video messages. - :param reply_markup: A JSON-serialized object for an `inline keyboard `_. - :return: instance of method :class:`aiogram.methods.edit_message_caption.EditMessageCaption` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import EditMessageCaption - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return EditMessageCaption( - chat_id=self.chat.id, - message_id=self.message_id, - business_connection_id=business_connection_id, - inline_message_id=inline_message_id, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - reply_markup=reply_markup, - **kwargs, - ).as_(self._bot) - - def delete( - self, - **kwargs: Any, - ) -> DeleteMessage: - """ - Shortcut for method :class:`aiogram.methods.delete_message.DeleteMessage` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_id` - - Use this method to delete a message, including service messages, with the following limitations: - - - A message can only be deleted if it was sent less than 48 hours ago. - - - Service messages about a supergroup, channel, or forum topic creation can't be deleted. - - - A dice message in a private chat can only be deleted if it was sent more than 24 hours ago. - - - Bots can delete outgoing messages in private chats, groups, and supergroups. - - - Bots can delete incoming messages in private chats. - - - Bots granted *can_post_messages* permissions can delete outgoing messages in channels. - - - If the bot is an administrator of a group, it can delete any message there. - - - If the bot has *can_delete_messages* permission in a supergroup or a channel, it can delete any message there. - - Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletemessage - - :return: instance of method :class:`aiogram.methods.delete_message.DeleteMessage` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import DeleteMessage - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return DeleteMessage( - chat_id=self.chat.id, - message_id=self.message_id, - **kwargs, - ).as_(self._bot) - - def pin( - self, - business_connection_id: Optional[str] = None, - disable_notification: Optional[bool] = None, - **kwargs: Any, - ) -> PinChatMessage: - """ - Shortcut for method :class:`aiogram.methods.pin_chat_message.PinChatMessage` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_id` - - Use this method to add a message to the list of pinned messages in a chat. If the chat is not a private chat, the bot must be an administrator in the chat for this to work and must have the 'can_pin_messages' administrator right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#pinchatmessage - - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be pinned - :param disable_notification: Pass :code:`True` if it is not necessary to send a notification to all chat members about the new pinned message. Notifications are always disabled in channels and private chats. - :return: instance of method :class:`aiogram.methods.pin_chat_message.PinChatMessage` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import PinChatMessage - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return PinChatMessage( - chat_id=self.chat.id, - message_id=self.message_id, - business_connection_id=business_connection_id, - disable_notification=disable_notification, - **kwargs, - ).as_(self._bot) - - def unpin( - self, - business_connection_id: Optional[str] = None, - **kwargs: Any, - ) -> UnpinChatMessage: - """ - Shortcut for method :class:`aiogram.methods.unpin_chat_message.UnpinChatMessage` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_id` - - Use this method to remove a message from the list of pinned messages in a chat. If the chat is not a private chat, the bot must be an administrator in the chat for this to work and must have the 'can_pin_messages' administrator right in a supergroup or 'can_edit_messages' administrator right in a channel. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#unpinchatmessage - - :param business_connection_id: Unique identifier of the business connection on behalf of which the message will be unpinned - :return: instance of method :class:`aiogram.methods.unpin_chat_message.UnpinChatMessage` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import UnpinChatMessage - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return UnpinChatMessage( - chat_id=self.chat.id, - message_id=self.message_id, - business_connection_id=business_connection_id, - **kwargs, - ).as_(self._bot) - - def get_url( - self, force_private: bool = False, include_thread_id: bool = False - ) -> Optional[str]: - """ - Returns message URL. Cannot be used in private (one-to-one) chats. - If chat has a username, returns URL like https://t.me/username/message_id - Otherwise (or if {force_private} flag is set), returns https://t.me/c/shifted_chat_id/message_id - - :param force_private: if set, a private URL is returned even for a public chat - :param include_thread_id: if set, adds chat thread id to URL and returns like https://t.me/username/thread_id/message_id - :return: string with full message URL - """ - if self.chat.type in ("private", "group"): - return None - - chat_value = ( - f"c/{self.chat.shifted_id}" - if not self.chat.username or force_private - else self.chat.username - ) - - message_id_value = ( - f"{self.message_thread_id}/{self.message_id}" - if include_thread_id and self.message_thread_id and self.is_topic_message - else f"{self.message_id}" - ) - - return f"https://t.me/{chat_value}/{message_id_value}" - - def react( - self, - reaction: Optional[ - List[Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid]] - ] = None, - is_big: Optional[bool] = None, - **kwargs: Any, - ) -> SetMessageReaction: - """ - Shortcut for method :class:`aiogram.methods.set_message_reaction.SetMessageReaction` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_id` - - Use this method to change the chosen reactions on a message. Service messages can't be reacted to. Automatically forwarded messages from a channel to its discussion group have the same available reactions as messages in the channel. Bots can't use paid reactions. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setmessagereaction - - :param reaction: A JSON-serialized list of reaction types to set on the message. Currently, as non-premium users, bots can set up to one reaction per message. A custom emoji reaction can be used if it is either already present on the message or explicitly allowed by chat administrators. Paid reactions can't be used by bots. - :param is_big: Pass :code:`True` to set the reaction with a big animation - :return: instance of method :class:`aiogram.methods.set_message_reaction.SetMessageReaction` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SetMessageReaction - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SetMessageReaction( - chat_id=self.chat.id, - message_id=self.message_id, - reaction=reaction, - is_big=is_big, - **kwargs, - ).as_(self._bot) - - def answer_paid_media( - self, - star_count: int, - media: List[Union[InputPaidMediaPhoto, InputPaidMediaVideo]], - caption: Optional[str] = None, - parse_mode: Optional[str] = None, - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - **kwargs: Any, - ) -> SendPaidMedia: - """ - Shortcut for method :class:`aiogram.methods.send_paid_media.SendPaidMedia` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - Use this method to send paid media. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendpaidmedia - - :param star_count: The number of Telegram Stars that must be paid to buy access to the media - :param media: A JSON-serialized array describing the media to be sent; up to 10 items - :param caption: Media caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the media caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param reply_parameters: Description of the message to reply to - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :return: instance of method :class:`aiogram.methods.send_paid_media.SendPaidMedia` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendPaidMedia - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendPaidMedia( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - star_count=star_count, - media=media, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - disable_notification=disable_notification, - protect_content=protect_content, - reply_parameters=reply_parameters, - reply_markup=reply_markup, - **kwargs, - ).as_(self._bot) - - def reply_paid_media( - self, - star_count: int, - media: List[Union[InputPaidMediaPhoto, InputPaidMediaVideo]], - caption: Optional[str] = None, - parse_mode: Optional[str] = None, - caption_entities: Optional[List[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - reply_markup: Optional[ - Union[InlineKeyboardMarkup, ReplyKeyboardMarkup, ReplyKeyboardRemove, ForceReply] - ] = None, - **kwargs: Any, - ) -> SendPaidMedia: - """ - Shortcut for method :class:`aiogram.methods.send_paid_media.SendPaidMedia` - will automatically fill method attributes: - - - :code:`chat_id` - - :code:`message_thread_id` - - :code:`business_connection_id` - - :code:`reply_parameters` - - Use this method to send paid media. On success, the sent :class:`aiogram.types.message.Message` is returned. - - Source: https://core.telegram.org/bots/api#sendpaidmedia - - :param star_count: The number of Telegram Stars that must be paid to buy access to the media - :param media: A JSON-serialized array describing the media to be sent; up to 10 items - :param caption: Media caption, 0-1024 characters after entities parsing - :param parse_mode: Mode for parsing entities in the media caption. See `formatting options `_ for more details. - :param caption_entities: A JSON-serialized list of special entities that appear in the caption, which can be specified instead of *parse_mode* - :param show_caption_above_media: Pass :code:`True`, if the caption must be shown above the message media - :param disable_notification: Sends the message `silently `_. Users will receive a notification with no sound. - :param protect_content: Protects the contents of the sent message from forwarding and saving - :param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard `_, `custom reply keyboard `_, instructions to remove a reply keyboard or to force a reply from the user - :return: instance of method :class:`aiogram.methods.send_paid_media.SendPaidMedia` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SendPaidMedia - - assert ( - self.chat is not None - ), "This method can be used only if chat is present in the message." - - return SendPaidMedia( - chat_id=self.chat.id, - message_thread_id=self.message_thread_id if self.is_topic_message else None, - business_connection_id=self.business_connection_id, - reply_parameters=self.as_reply_parameters(), - star_count=star_count, - media=media, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - show_caption_above_media=show_caption_above_media, - disable_notification=disable_notification, - protect_content=protect_content, - reply_markup=reply_markup, - **kwargs, - ).as_(self._bot) diff --git a/env/Lib/site-packages/aiogram/types/message_auto_delete_timer_changed.py b/env/Lib/site-packages/aiogram/types/message_auto_delete_timer_changed.py deleted file mode 100644 index 8414a24..0000000 --- a/env/Lib/site-packages/aiogram/types/message_auto_delete_timer_changed.py +++ /dev/null @@ -1,31 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class MessageAutoDeleteTimerChanged(TelegramObject): - """ - This object represents a service message about a change in auto-delete timer settings. - - Source: https://core.telegram.org/bots/api#messageautodeletetimerchanged - """ - - message_auto_delete_time: int - """New auto-delete time for messages in the chat; in seconds""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, message_auto_delete_time: int, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - message_auto_delete_time=message_auto_delete_time, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/message_entity.py b/env/Lib/site-packages/aiogram/types/message_entity.py deleted file mode 100644 index ee774b0..0000000 --- a/env/Lib/site-packages/aiogram/types/message_entity.py +++ /dev/null @@ -1,68 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from ..utils.text_decorations import add_surrogates, remove_surrogates -from .base import MutableTelegramObject - -if TYPE_CHECKING: - from .user import User - - -class MessageEntity(MutableTelegramObject): - """ - This object represents one special entity in a text message. For example, hashtags, usernames, URLs, etc. - - Source: https://core.telegram.org/bots/api#messageentity - """ - - type: str - """Type of the entity. Currently, can be 'mention' (:code:`@username`), 'hashtag' (:code:`#hashtag`), 'cashtag' (:code:`$USD`), 'bot_command' (:code:`/start@jobs_bot`), 'url' (:code:`https://telegram.org`), 'email' (:code:`do-not-reply@telegram.org`), 'phone_number' (:code:`+1-212-555-0123`), 'bold' (**bold text**), 'italic' (*italic text*), 'underline' (underlined text), 'strikethrough' (strikethrough text), 'spoiler' (spoiler message), 'blockquote' (block quotation), 'expandable_blockquote' (collapsed-by-default block quotation), 'code' (monowidth string), 'pre' (monowidth block), 'text_link' (for clickable text URLs), 'text_mention' (for users `without usernames `_), 'custom_emoji' (for inline custom emoji stickers)""" - offset: int - """Offset in `UTF-16 code units `_ to the start of the entity""" - length: int - """Length of the entity in `UTF-16 code units `_""" - url: Optional[str] = None - """*Optional*. For 'text_link' only, URL that will be opened after user taps on the text""" - user: Optional[User] = None - """*Optional*. For 'text_mention' only, the mentioned user""" - language: Optional[str] = None - """*Optional*. For 'pre' only, the programming language of the entity text""" - custom_emoji_id: Optional[str] = None - """*Optional*. For 'custom_emoji' only, unique identifier of the custom emoji. Use :class:`aiogram.methods.get_custom_emoji_stickers.GetCustomEmojiStickers` to get full information about the sticker""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: str, - offset: int, - length: int, - url: Optional[str] = None, - user: Optional[User] = None, - language: Optional[str] = None, - custom_emoji_id: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - offset=offset, - length=length, - url=url, - user=user, - language=language, - custom_emoji_id=custom_emoji_id, - **__pydantic_kwargs, - ) - - def extract_from(self, text: str) -> str: - return remove_surrogates( - add_surrogates(text)[self.offset * 2 : (self.offset + self.length) * 2] - ) diff --git a/env/Lib/site-packages/aiogram/types/message_id.py b/env/Lib/site-packages/aiogram/types/message_id.py deleted file mode 100644 index d50888f..0000000 --- a/env/Lib/site-packages/aiogram/types/message_id.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class MessageId(TelegramObject): - """ - This object represents a unique message identifier. - - Source: https://core.telegram.org/bots/api#messageid - """ - - message_id: int - """Unique message identifier""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__(__pydantic__self__, *, message_id: int, **__pydantic_kwargs: Any) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(message_id=message_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/message_origin.py b/env/Lib/site-packages/aiogram/types/message_origin.py deleted file mode 100644 index 01f9977..0000000 --- a/env/Lib/site-packages/aiogram/types/message_origin.py +++ /dev/null @@ -1,14 +0,0 @@ -from aiogram.types import TelegramObject - - -class MessageOrigin(TelegramObject): - """ - This object describes the origin of a message. It can be one of - - - :class:`aiogram.types.message_origin_user.MessageOriginUser` - - :class:`aiogram.types.message_origin_hidden_user.MessageOriginHiddenUser` - - :class:`aiogram.types.message_origin_chat.MessageOriginChat` - - :class:`aiogram.types.message_origin_channel.MessageOriginChannel` - - Source: https://core.telegram.org/bots/api#messageorigin - """ diff --git a/env/Lib/site-packages/aiogram/types/message_origin_channel.py b/env/Lib/site-packages/aiogram/types/message_origin_channel.py deleted file mode 100644 index 9decfaf..0000000 --- a/env/Lib/site-packages/aiogram/types/message_origin_channel.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional - -from ..enums import MessageOriginType -from .custom import DateTime -from .message_origin import MessageOrigin - -if TYPE_CHECKING: - from .chat import Chat - - -class MessageOriginChannel(MessageOrigin): - """ - The message was originally sent to a channel chat. - - Source: https://core.telegram.org/bots/api#messageoriginchannel - """ - - type: Literal[MessageOriginType.CHANNEL] = MessageOriginType.CHANNEL - """Type of the message origin, always 'channel'""" - date: DateTime - """Date the message was sent originally in Unix time""" - chat: Chat - """Channel chat to which the message was originally sent""" - message_id: int - """Unique message identifier inside the chat""" - author_signature: Optional[str] = None - """*Optional*. Signature of the original post author""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[MessageOriginType.CHANNEL] = MessageOriginType.CHANNEL, - date: DateTime, - chat: Chat, - message_id: int, - author_signature: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - date=date, - chat=chat, - message_id=message_id, - author_signature=author_signature, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/message_origin_chat.py b/env/Lib/site-packages/aiogram/types/message_origin_chat.py deleted file mode 100644 index b1e5fb9..0000000 --- a/env/Lib/site-packages/aiogram/types/message_origin_chat.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional - -from ..enums import MessageOriginType -from .custom import DateTime -from .message_origin import MessageOrigin - -if TYPE_CHECKING: - from .chat import Chat - - -class MessageOriginChat(MessageOrigin): - """ - The message was originally sent on behalf of a chat to a group chat. - - Source: https://core.telegram.org/bots/api#messageoriginchat - """ - - type: Literal[MessageOriginType.CHAT] = MessageOriginType.CHAT - """Type of the message origin, always 'chat'""" - date: DateTime - """Date the message was sent originally in Unix time""" - sender_chat: Chat - """Chat that sent the message originally""" - author_signature: Optional[str] = None - """*Optional*. For messages originally sent by an anonymous chat administrator, original message author signature""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[MessageOriginType.CHAT] = MessageOriginType.CHAT, - date: DateTime, - sender_chat: Chat, - author_signature: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - date=date, - sender_chat=sender_chat, - author_signature=author_signature, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/message_origin_hidden_user.py b/env/Lib/site-packages/aiogram/types/message_origin_hidden_user.py deleted file mode 100644 index cd702f1..0000000 --- a/env/Lib/site-packages/aiogram/types/message_origin_hidden_user.py +++ /dev/null @@ -1,40 +0,0 @@ -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import MessageOriginType -from .custom import DateTime -from .message_origin import MessageOrigin - - -class MessageOriginHiddenUser(MessageOrigin): - """ - The message was originally sent by an unknown user. - - Source: https://core.telegram.org/bots/api#messageoriginhiddenuser - """ - - type: Literal[MessageOriginType.HIDDEN_USER] = MessageOriginType.HIDDEN_USER - """Type of the message origin, always 'hidden_user'""" - date: DateTime - """Date the message was sent originally in Unix time""" - sender_user_name: str - """Name of the user that sent the message originally""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[MessageOriginType.HIDDEN_USER] = MessageOriginType.HIDDEN_USER, - date: DateTime, - sender_user_name: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, date=date, sender_user_name=sender_user_name, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/message_origin_user.py b/env/Lib/site-packages/aiogram/types/message_origin_user.py deleted file mode 100644 index d77ac7a..0000000 --- a/env/Lib/site-packages/aiogram/types/message_origin_user.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import MessageOriginType -from .custom import DateTime -from .message_origin import MessageOrigin - -if TYPE_CHECKING: - from .user import User - - -class MessageOriginUser(MessageOrigin): - """ - The message was originally sent by a known user. - - Source: https://core.telegram.org/bots/api#messageoriginuser - """ - - type: Literal[MessageOriginType.USER] = MessageOriginType.USER - """Type of the message origin, always 'user'""" - date: DateTime - """Date the message was sent originally in Unix time""" - sender_user: User - """User that sent the message originally""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[MessageOriginType.USER] = MessageOriginType.USER, - date: DateTime, - sender_user: User, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, date=date, sender_user=sender_user, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/message_reaction_count_updated.py b/env/Lib/site-packages/aiogram/types/message_reaction_count_updated.py deleted file mode 100644 index e9d0f8b..0000000 --- a/env/Lib/site-packages/aiogram/types/message_reaction_count_updated.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List - -from .base import TelegramObject - -if TYPE_CHECKING: - from .chat import Chat - from .custom import DateTime - from .reaction_count import ReactionCount - - -class MessageReactionCountUpdated(TelegramObject): - """ - This object represents reaction changes on a message with anonymous reactions. - - Source: https://core.telegram.org/bots/api#messagereactioncountupdated - """ - - chat: Chat - """The chat containing the message""" - message_id: int - """Unique message identifier inside the chat""" - date: DateTime - """Date of the change in Unix time""" - reactions: List[ReactionCount] - """List of reactions that are present on the message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat: Chat, - message_id: int, - date: DateTime, - reactions: List[ReactionCount], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat=chat, - message_id=message_id, - date=date, - reactions=reactions, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/message_reaction_updated.py b/env/Lib/site-packages/aiogram/types/message_reaction_updated.py deleted file mode 100644 index 7831c77..0000000 --- a/env/Lib/site-packages/aiogram/types/message_reaction_updated.py +++ /dev/null @@ -1,71 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from .base import TelegramObject - -if TYPE_CHECKING: - from .chat import Chat - from .custom import DateTime - from .reaction_type_custom_emoji import ReactionTypeCustomEmoji - from .reaction_type_emoji import ReactionTypeEmoji - from .reaction_type_paid import ReactionTypePaid - from .user import User - - -class MessageReactionUpdated(TelegramObject): - """ - This object represents a change of a reaction on a message performed by a user. - - Source: https://core.telegram.org/bots/api#messagereactionupdated - """ - - chat: Chat - """The chat containing the message the user reacted to""" - message_id: int - """Unique identifier of the message inside the chat""" - date: DateTime - """Date of the change in Unix time""" - old_reaction: List[Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid]] - """Previous list of reaction types that were set by the user""" - new_reaction: List[Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid]] - """New list of reaction types that have been set by the user""" - user: Optional[User] = None - """*Optional*. The user that changed the reaction, if the user isn't anonymous""" - actor_chat: Optional[Chat] = None - """*Optional*. The chat on behalf of which the reaction was changed, if the user is anonymous""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - chat: Chat, - message_id: int, - date: DateTime, - old_reaction: List[ - Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid] - ], - new_reaction: List[ - Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid] - ], - user: Optional[User] = None, - actor_chat: Optional[Chat] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - chat=chat, - message_id=message_id, - date=date, - old_reaction=old_reaction, - new_reaction=new_reaction, - user=user, - actor_chat=actor_chat, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/order_info.py b/env/Lib/site-packages/aiogram/types/order_info.py deleted file mode 100644 index 5d71f65..0000000 --- a/env/Lib/site-packages/aiogram/types/order_info.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .shipping_address import ShippingAddress - - -class OrderInfo(TelegramObject): - """ - This object represents information about an order. - - Source: https://core.telegram.org/bots/api#orderinfo - """ - - name: Optional[str] = None - """*Optional*. User name""" - phone_number: Optional[str] = None - """*Optional*. User's phone number""" - email: Optional[str] = None - """*Optional*. User email""" - shipping_address: Optional[ShippingAddress] = None - """*Optional*. User shipping address""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - name: Optional[str] = None, - phone_number: Optional[str] = None, - email: Optional[str] = None, - shipping_address: Optional[ShippingAddress] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - name=name, - phone_number=phone_number, - email=email, - shipping_address=shipping_address, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/paid_media.py b/env/Lib/site-packages/aiogram/types/paid_media.py deleted file mode 100644 index d17c44d..0000000 --- a/env/Lib/site-packages/aiogram/types/paid_media.py +++ /dev/null @@ -1,13 +0,0 @@ -from .base import TelegramObject - - -class PaidMedia(TelegramObject): - """ - This object describes paid media. Currently, it can be one of - - - :class:`aiogram.types.paid_media_preview.PaidMediaPreview` - - :class:`aiogram.types.paid_media_photo.PaidMediaPhoto` - - :class:`aiogram.types.paid_media_video.PaidMediaVideo` - - Source: https://core.telegram.org/bots/api#paidmedia - """ diff --git a/env/Lib/site-packages/aiogram/types/paid_media_info.py b/env/Lib/site-packages/aiogram/types/paid_media_info.py deleted file mode 100644 index db5bbf0..0000000 --- a/env/Lib/site-packages/aiogram/types/paid_media_info.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Union - -from .base import TelegramObject - -if TYPE_CHECKING: - from .paid_media_photo import PaidMediaPhoto - from .paid_media_preview import PaidMediaPreview - from .paid_media_video import PaidMediaVideo - - -class PaidMediaInfo(TelegramObject): - """ - Describes the paid media added to a message. - - Source: https://core.telegram.org/bots/api#paidmediainfo - """ - - star_count: int - """The number of Telegram Stars that must be paid to buy access to the media""" - paid_media: List[Union[PaidMediaPreview, PaidMediaPhoto, PaidMediaVideo]] - """Information about the paid media""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - star_count: int, - paid_media: List[Union[PaidMediaPreview, PaidMediaPhoto, PaidMediaVideo]], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(star_count=star_count, paid_media=paid_media, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/paid_media_photo.py b/env/Lib/site-packages/aiogram/types/paid_media_photo.py deleted file mode 100644 index 71c2e10..0000000 --- a/env/Lib/site-packages/aiogram/types/paid_media_photo.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal - -from ..enums import PaidMediaType -from .paid_media import PaidMedia - -if TYPE_CHECKING: - from .photo_size import PhotoSize - - -class PaidMediaPhoto(PaidMedia): - """ - The paid media is a photo. - - Source: https://core.telegram.org/bots/api#paidmediaphoto - """ - - type: Literal[PaidMediaType.PHOTO] = PaidMediaType.PHOTO - """Type of the paid media, always 'photo'""" - photo: List[PhotoSize] - """The photo""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[PaidMediaType.PHOTO] = PaidMediaType.PHOTO, - photo: List[PhotoSize], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, photo=photo, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/paid_media_preview.py b/env/Lib/site-packages/aiogram/types/paid_media_preview.py deleted file mode 100644 index 5054de2..0000000 --- a/env/Lib/site-packages/aiogram/types/paid_media_preview.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional - -from ..enums import PaidMediaType -from .paid_media import PaidMedia - - -class PaidMediaPreview(PaidMedia): - """ - The paid media isn't available before the payment. - - Source: https://core.telegram.org/bots/api#paidmediapreview - """ - - type: Literal[PaidMediaType.PREVIEW] = PaidMediaType.PREVIEW - """Type of the paid media, always 'preview'""" - width: Optional[int] = None - """*Optional*. Media width as defined by the sender""" - height: Optional[int] = None - """*Optional*. Media height as defined by the sender""" - duration: Optional[int] = None - """*Optional*. Duration of the media in seconds as defined by the sender""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[PaidMediaType.PREVIEW] = PaidMediaType.PREVIEW, - width: Optional[int] = None, - height: Optional[int] = None, - duration: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, width=width, height=height, duration=duration, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/paid_media_video.py b/env/Lib/site-packages/aiogram/types/paid_media_video.py deleted file mode 100644 index 28affbb..0000000 --- a/env/Lib/site-packages/aiogram/types/paid_media_video.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import PaidMediaType -from .paid_media import PaidMedia - -if TYPE_CHECKING: - from .video import Video - - -class PaidMediaVideo(PaidMedia): - """ - The paid media is a video. - - Source: https://core.telegram.org/bots/api#paidmediavideo - """ - - type: Literal[PaidMediaType.VIDEO] = PaidMediaType.VIDEO - """Type of the paid media, always 'video'""" - video: Video - """The video""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[PaidMediaType.VIDEO] = PaidMediaType.VIDEO, - video: Video, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, video=video, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/passport_data.py b/env/Lib/site-packages/aiogram/types/passport_data.py deleted file mode 100644 index d93af1f..0000000 --- a/env/Lib/site-packages/aiogram/types/passport_data.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List - -from .base import TelegramObject - -if TYPE_CHECKING: - from .encrypted_credentials import EncryptedCredentials - from .encrypted_passport_element import EncryptedPassportElement - - -class PassportData(TelegramObject): - """ - Describes Telegram Passport data shared with the bot by the user. - - Source: https://core.telegram.org/bots/api#passportdata - """ - - data: List[EncryptedPassportElement] - """Array with information about documents and other Telegram Passport elements that was shared with the bot""" - credentials: EncryptedCredentials - """Encrypted credentials required to decrypt the data""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - data: List[EncryptedPassportElement], - credentials: EncryptedCredentials, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(data=data, credentials=credentials, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/passport_element_error.py b/env/Lib/site-packages/aiogram/types/passport_element_error.py deleted file mode 100644 index 36a1db8..0000000 --- a/env/Lib/site-packages/aiogram/types/passport_element_error.py +++ /dev/null @@ -1,21 +0,0 @@ -from __future__ import annotations - -from .base import MutableTelegramObject - - -class PassportElementError(MutableTelegramObject): - """ - This object represents an error in the Telegram Passport element which was submitted that should be resolved by the user. It should be one of: - - - :class:`aiogram.types.passport_element_error_data_field.PassportElementErrorDataField` - - :class:`aiogram.types.passport_element_error_front_side.PassportElementErrorFrontSide` - - :class:`aiogram.types.passport_element_error_reverse_side.PassportElementErrorReverseSide` - - :class:`aiogram.types.passport_element_error_selfie.PassportElementErrorSelfie` - - :class:`aiogram.types.passport_element_error_file.PassportElementErrorFile` - - :class:`aiogram.types.passport_element_error_files.PassportElementErrorFiles` - - :class:`aiogram.types.passport_element_error_translation_file.PassportElementErrorTranslationFile` - - :class:`aiogram.types.passport_element_error_translation_files.PassportElementErrorTranslationFiles` - - :class:`aiogram.types.passport_element_error_unspecified.PassportElementErrorUnspecified` - - Source: https://core.telegram.org/bots/api#passportelementerror - """ diff --git a/env/Lib/site-packages/aiogram/types/passport_element_error_data_field.py b/env/Lib/site-packages/aiogram/types/passport_element_error_data_field.py deleted file mode 100644 index 3bf2bb2..0000000 --- a/env/Lib/site-packages/aiogram/types/passport_element_error_data_field.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import PassportElementErrorType -from .passport_element_error import PassportElementError - - -class PassportElementErrorDataField(PassportElementError): - """ - Represents an issue in one of the data fields that was provided by the user. The error is considered resolved when the field's value changes. - - Source: https://core.telegram.org/bots/api#passportelementerrordatafield - """ - - source: Literal[PassportElementErrorType.DATA] = PassportElementErrorType.DATA - """Error source, must be *data*""" - type: str - """The section of the user's Telegram Passport which has the error, one of 'personal_details', 'passport', 'driver_license', 'identity_card', 'internal_passport', 'address'""" - field_name: str - """Name of the data field which has the error""" - data_hash: str - """Base64-encoded data hash""" - message: str - """Error message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - source: Literal[PassportElementErrorType.DATA] = PassportElementErrorType.DATA, - type: str, - field_name: str, - data_hash: str, - message: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - source=source, - type=type, - field_name=field_name, - data_hash=data_hash, - message=message, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/passport_element_error_file.py b/env/Lib/site-packages/aiogram/types/passport_element_error_file.py deleted file mode 100644 index 8bc40b3..0000000 --- a/env/Lib/site-packages/aiogram/types/passport_element_error_file.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import PassportElementErrorType -from .passport_element_error import PassportElementError - - -class PassportElementErrorFile(PassportElementError): - """ - Represents an issue with a document scan. The error is considered resolved when the file with the document scan changes. - - Source: https://core.telegram.org/bots/api#passportelementerrorfile - """ - - source: Literal[PassportElementErrorType.FILE] = PassportElementErrorType.FILE - """Error source, must be *file*""" - type: str - """The section of the user's Telegram Passport which has the issue, one of 'utility_bill', 'bank_statement', 'rental_agreement', 'passport_registration', 'temporary_registration'""" - file_hash: str - """Base64-encoded file hash""" - message: str - """Error message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - source: Literal[PassportElementErrorType.FILE] = PassportElementErrorType.FILE, - type: str, - file_hash: str, - message: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - source=source, type=type, file_hash=file_hash, message=message, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/passport_element_error_files.py b/env/Lib/site-packages/aiogram/types/passport_element_error_files.py deleted file mode 100644 index 3639da2..0000000 --- a/env/Lib/site-packages/aiogram/types/passport_element_error_files.py +++ /dev/null @@ -1,48 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal - -from ..enums import PassportElementErrorType -from .passport_element_error import PassportElementError - - -class PassportElementErrorFiles(PassportElementError): - """ - Represents an issue with a list of scans. The error is considered resolved when the list of files containing the scans changes. - - Source: https://core.telegram.org/bots/api#passportelementerrorfiles - """ - - source: Literal[PassportElementErrorType.FILES] = PassportElementErrorType.FILES - """Error source, must be *files*""" - type: str - """The section of the user's Telegram Passport which has the issue, one of 'utility_bill', 'bank_statement', 'rental_agreement', 'passport_registration', 'temporary_registration'""" - file_hashes: List[str] - """List of base64-encoded file hashes""" - message: str - """Error message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - source: Literal[PassportElementErrorType.FILES] = PassportElementErrorType.FILES, - type: str, - file_hashes: List[str], - message: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - source=source, - type=type, - file_hashes=file_hashes, - message=message, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/passport_element_error_front_side.py b/env/Lib/site-packages/aiogram/types/passport_element_error_front_side.py deleted file mode 100644 index 86315f2..0000000 --- a/env/Lib/site-packages/aiogram/types/passport_element_error_front_side.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import PassportElementErrorType -from .passport_element_error import PassportElementError - - -class PassportElementErrorFrontSide(PassportElementError): - """ - Represents an issue with the front side of a document. The error is considered resolved when the file with the front side of the document changes. - - Source: https://core.telegram.org/bots/api#passportelementerrorfrontside - """ - - source: Literal[PassportElementErrorType.FRONT_SIDE] = PassportElementErrorType.FRONT_SIDE - """Error source, must be *front_side*""" - type: str - """The section of the user's Telegram Passport which has the issue, one of 'passport', 'driver_license', 'identity_card', 'internal_passport'""" - file_hash: str - """Base64-encoded hash of the file with the front side of the document""" - message: str - """Error message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - source: Literal[ - PassportElementErrorType.FRONT_SIDE - ] = PassportElementErrorType.FRONT_SIDE, - type: str, - file_hash: str, - message: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - source=source, type=type, file_hash=file_hash, message=message, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/passport_element_error_reverse_side.py b/env/Lib/site-packages/aiogram/types/passport_element_error_reverse_side.py deleted file mode 100644 index ecb400f..0000000 --- a/env/Lib/site-packages/aiogram/types/passport_element_error_reverse_side.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import PassportElementErrorType -from .passport_element_error import PassportElementError - - -class PassportElementErrorReverseSide(PassportElementError): - """ - Represents an issue with the reverse side of a document. The error is considered resolved when the file with reverse side of the document changes. - - Source: https://core.telegram.org/bots/api#passportelementerrorreverseside - """ - - source: Literal[PassportElementErrorType.REVERSE_SIDE] = PassportElementErrorType.REVERSE_SIDE - """Error source, must be *reverse_side*""" - type: str - """The section of the user's Telegram Passport which has the issue, one of 'driver_license', 'identity_card'""" - file_hash: str - """Base64-encoded hash of the file with the reverse side of the document""" - message: str - """Error message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - source: Literal[ - PassportElementErrorType.REVERSE_SIDE - ] = PassportElementErrorType.REVERSE_SIDE, - type: str, - file_hash: str, - message: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - source=source, type=type, file_hash=file_hash, message=message, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/passport_element_error_selfie.py b/env/Lib/site-packages/aiogram/types/passport_element_error_selfie.py deleted file mode 100644 index bff6dd6..0000000 --- a/env/Lib/site-packages/aiogram/types/passport_element_error_selfie.py +++ /dev/null @@ -1,44 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import PassportElementErrorType -from .passport_element_error import PassportElementError - - -class PassportElementErrorSelfie(PassportElementError): - """ - Represents an issue with the selfie with a document. The error is considered resolved when the file with the selfie changes. - - Source: https://core.telegram.org/bots/api#passportelementerrorselfie - """ - - source: Literal[PassportElementErrorType.SELFIE] = PassportElementErrorType.SELFIE - """Error source, must be *selfie*""" - type: str - """The section of the user's Telegram Passport which has the issue, one of 'passport', 'driver_license', 'identity_card', 'internal_passport'""" - file_hash: str - """Base64-encoded hash of the file with the selfie""" - message: str - """Error message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - source: Literal[PassportElementErrorType.SELFIE] = PassportElementErrorType.SELFIE, - type: str, - file_hash: str, - message: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - source=source, type=type, file_hash=file_hash, message=message, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/passport_element_error_translation_file.py b/env/Lib/site-packages/aiogram/types/passport_element_error_translation_file.py deleted file mode 100644 index 29689ca..0000000 --- a/env/Lib/site-packages/aiogram/types/passport_element_error_translation_file.py +++ /dev/null @@ -1,48 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import PassportElementErrorType -from .passport_element_error import PassportElementError - - -class PassportElementErrorTranslationFile(PassportElementError): - """ - Represents an issue with one of the files that constitute the translation of a document. The error is considered resolved when the file changes. - - Source: https://core.telegram.org/bots/api#passportelementerrortranslationfile - """ - - source: Literal[PassportElementErrorType.TRANSLATION_FILE] = ( - PassportElementErrorType.TRANSLATION_FILE - ) - """Error source, must be *translation_file*""" - type: str - """Type of element of the user's Telegram Passport which has the issue, one of 'passport', 'driver_license', 'identity_card', 'internal_passport', 'utility_bill', 'bank_statement', 'rental_agreement', 'passport_registration', 'temporary_registration'""" - file_hash: str - """Base64-encoded file hash""" - message: str - """Error message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - source: Literal[ - PassportElementErrorType.TRANSLATION_FILE - ] = PassportElementErrorType.TRANSLATION_FILE, - type: str, - file_hash: str, - message: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - source=source, type=type, file_hash=file_hash, message=message, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/passport_element_error_translation_files.py b/env/Lib/site-packages/aiogram/types/passport_element_error_translation_files.py deleted file mode 100644 index 65e9940..0000000 --- a/env/Lib/site-packages/aiogram/types/passport_element_error_translation_files.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal - -from ..enums import PassportElementErrorType -from .passport_element_error import PassportElementError - - -class PassportElementErrorTranslationFiles(PassportElementError): - """ - Represents an issue with the translated version of a document. The error is considered resolved when a file with the document translation change. - - Source: https://core.telegram.org/bots/api#passportelementerrortranslationfiles - """ - - source: Literal[PassportElementErrorType.TRANSLATION_FILES] = ( - PassportElementErrorType.TRANSLATION_FILES - ) - """Error source, must be *translation_files*""" - type: str - """Type of element of the user's Telegram Passport which has the issue, one of 'passport', 'driver_license', 'identity_card', 'internal_passport', 'utility_bill', 'bank_statement', 'rental_agreement', 'passport_registration', 'temporary_registration'""" - file_hashes: List[str] - """List of base64-encoded file hashes""" - message: str - """Error message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - source: Literal[ - PassportElementErrorType.TRANSLATION_FILES - ] = PassportElementErrorType.TRANSLATION_FILES, - type: str, - file_hashes: List[str], - message: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - source=source, - type=type, - file_hashes=file_hashes, - message=message, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/passport_element_error_unspecified.py b/env/Lib/site-packages/aiogram/types/passport_element_error_unspecified.py deleted file mode 100644 index 3575d35..0000000 --- a/env/Lib/site-packages/aiogram/types/passport_element_error_unspecified.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import PassportElementErrorType -from .passport_element_error import PassportElementError - - -class PassportElementErrorUnspecified(PassportElementError): - """ - Represents an issue in an unspecified place. The error is considered resolved when new data is added. - - Source: https://core.telegram.org/bots/api#passportelementerrorunspecified - """ - - source: Literal[PassportElementErrorType.UNSPECIFIED] = PassportElementErrorType.UNSPECIFIED - """Error source, must be *unspecified*""" - type: str - """Type of element of the user's Telegram Passport which has the issue""" - element_hash: str - """Base64-encoded element hash""" - message: str - """Error message""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - source: Literal[ - PassportElementErrorType.UNSPECIFIED - ] = PassportElementErrorType.UNSPECIFIED, - type: str, - element_hash: str, - message: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - source=source, - type=type, - element_hash=element_hash, - message=message, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/passport_file.py b/env/Lib/site-packages/aiogram/types/passport_file.py deleted file mode 100644 index d95da61..0000000 --- a/env/Lib/site-packages/aiogram/types/passport_file.py +++ /dev/null @@ -1,48 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject -from .custom import DateTime - - -class PassportFile(TelegramObject): - """ - This object represents a file uploaded to Telegram Passport. Currently all Telegram Passport files are in JPEG format when decrypted and don't exceed 10MB. - - Source: https://core.telegram.org/bots/api#passportfile - """ - - file_id: str - """Identifier for this file, which can be used to download or reuse the file""" - file_unique_id: str - """Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.""" - file_size: int - """File size in bytes""" - file_date: DateTime - """Unix time when the file was uploaded""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - file_id: str, - file_unique_id: str, - file_size: int, - file_date: DateTime, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - file_size=file_size, - file_date=file_date, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/photo_size.py b/env/Lib/site-packages/aiogram/types/photo_size.py deleted file mode 100644 index 9a2ccbe..0000000 --- a/env/Lib/site-packages/aiogram/types/photo_size.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - - -class PhotoSize(TelegramObject): - """ - This object represents one size of a photo or a `file `_ / :class:`aiogram.methods.sticker.Sticker` thumbnail. - - Source: https://core.telegram.org/bots/api#photosize - """ - - file_id: str - """Identifier for this file, which can be used to download or reuse the file""" - file_unique_id: str - """Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.""" - width: int - """Photo width""" - height: int - """Photo height""" - file_size: Optional[int] = None - """*Optional*. File size in bytes""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - file_id: str, - file_unique_id: str, - width: int, - height: int, - file_size: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - width=width, - height=height, - file_size=file_size, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/poll.py b/env/Lib/site-packages/aiogram/types/poll.py deleted file mode 100644 index 5805224..0000000 --- a/env/Lib/site-packages/aiogram/types/poll.py +++ /dev/null @@ -1,92 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from .base import TelegramObject -from .custom import DateTime - -if TYPE_CHECKING: - from .message_entity import MessageEntity - from .poll_option import PollOption - - -class Poll(TelegramObject): - """ - This object contains information about a poll. - - Source: https://core.telegram.org/bots/api#poll - """ - - id: str - """Unique poll identifier""" - question: str - """Poll question, 1-300 characters""" - options: List[PollOption] - """List of poll options""" - total_voter_count: int - """Total number of users that voted in the poll""" - is_closed: bool - """:code:`True`, if the poll is closed""" - is_anonymous: bool - """:code:`True`, if the poll is anonymous""" - type: str - """Poll type, currently can be 'regular' or 'quiz'""" - allows_multiple_answers: bool - """:code:`True`, if the poll allows multiple answers""" - question_entities: Optional[List[MessageEntity]] = None - """*Optional*. Special entities that appear in the *question*. Currently, only custom emoji entities are allowed in poll questions""" - correct_option_id: Optional[int] = None - """*Optional*. 0-based identifier of the correct answer option. Available only for polls in the quiz mode, which are closed, or was sent (not forwarded) by the bot or to the private chat with the bot.""" - explanation: Optional[str] = None - """*Optional*. Text that is shown when a user chooses an incorrect answer or taps on the lamp icon in a quiz-style poll, 0-200 characters""" - explanation_entities: Optional[List[MessageEntity]] = None - """*Optional*. Special entities like usernames, URLs, bot commands, etc. that appear in the *explanation*""" - open_period: Optional[int] = None - """*Optional*. Amount of time in seconds the poll will be active after creation""" - close_date: Optional[DateTime] = None - """*Optional*. Point in time (Unix timestamp) when the poll will be automatically closed""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - id: str, - question: str, - options: List[PollOption], - total_voter_count: int, - is_closed: bool, - is_anonymous: bool, - type: str, - allows_multiple_answers: bool, - question_entities: Optional[List[MessageEntity]] = None, - correct_option_id: Optional[int] = None, - explanation: Optional[str] = None, - explanation_entities: Optional[List[MessageEntity]] = None, - open_period: Optional[int] = None, - close_date: Optional[DateTime] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - id=id, - question=question, - options=options, - total_voter_count=total_voter_count, - is_closed=is_closed, - is_anonymous=is_anonymous, - type=type, - allows_multiple_answers=allows_multiple_answers, - question_entities=question_entities, - correct_option_id=correct_option_id, - explanation=explanation, - explanation_entities=explanation_entities, - open_period=open_period, - close_date=close_date, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/poll_answer.py b/env/Lib/site-packages/aiogram/types/poll_answer.py deleted file mode 100644 index c12be34..0000000 --- a/env/Lib/site-packages/aiogram/types/poll_answer.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .chat import Chat - from .user import User - - -class PollAnswer(TelegramObject): - """ - This object represents an answer of a user in a non-anonymous poll. - - Source: https://core.telegram.org/bots/api#pollanswer - """ - - poll_id: str - """Unique poll identifier""" - option_ids: List[int] - """0-based identifiers of chosen answer options. May be empty if the vote was retracted.""" - voter_chat: Optional[Chat] = None - """*Optional*. The chat that changed the answer to the poll, if the voter is anonymous""" - user: Optional[User] = None - """*Optional*. The user that changed the answer to the poll, if the voter isn't anonymous""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - poll_id: str, - option_ids: List[int], - voter_chat: Optional[Chat] = None, - user: Optional[User] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - poll_id=poll_id, - option_ids=option_ids, - voter_chat=voter_chat, - user=user, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/poll_option.py b/env/Lib/site-packages/aiogram/types/poll_option.py deleted file mode 100644 index f380934..0000000 --- a/env/Lib/site-packages/aiogram/types/poll_option.py +++ /dev/null @@ -1,46 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .message_entity import MessageEntity - - -class PollOption(TelegramObject): - """ - This object contains information about one answer option in a poll. - - Source: https://core.telegram.org/bots/api#polloption - """ - - text: str - """Option text, 1-100 characters""" - voter_count: int - """Number of users that voted for this option""" - text_entities: Optional[List[MessageEntity]] = None - """*Optional*. Special entities that appear in the option *text*. Currently, only custom emoji entities are allowed in poll option texts""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - text: str, - voter_count: int, - text_entities: Optional[List[MessageEntity]] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - text=text, - voter_count=voter_count, - text_entities=text_entities, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/pre_checkout_query.py b/env/Lib/site-packages/aiogram/types/pre_checkout_query.py deleted file mode 100644 index 41bda8c..0000000 --- a/env/Lib/site-packages/aiogram/types/pre_checkout_query.py +++ /dev/null @@ -1,98 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from pydantic import Field - -from .base import TelegramObject - -if TYPE_CHECKING: - from ..methods import AnswerPreCheckoutQuery - from .order_info import OrderInfo - from .user import User - - -class PreCheckoutQuery(TelegramObject): - """ - This object contains information about an incoming pre-checkout query. - - Source: https://core.telegram.org/bots/api#precheckoutquery - """ - - id: str - """Unique query identifier""" - from_user: User = Field(..., alias="from") - """User who sent the query""" - currency: str - """Three-letter ISO 4217 `currency `_ code, or 'XTR' for payments in `Telegram Stars `_""" - total_amount: int - """Total price in the *smallest units* of the currency (integer, **not** float/double). For example, for a price of :code:`US$ 1.45` pass :code:`amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).""" - invoice_payload: str - """Bot-specified invoice payload""" - shipping_option_id: Optional[str] = None - """*Optional*. Identifier of the shipping option chosen by the user""" - order_info: Optional[OrderInfo] = None - """*Optional*. Order information provided by the user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - id: str, - from_user: User, - currency: str, - total_amount: int, - invoice_payload: str, - shipping_option_id: Optional[str] = None, - order_info: Optional[OrderInfo] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - id=id, - from_user=from_user, - currency=currency, - total_amount=total_amount, - invoice_payload=invoice_payload, - shipping_option_id=shipping_option_id, - order_info=order_info, - **__pydantic_kwargs, - ) - - def answer( - self, - ok: bool, - error_message: Optional[str] = None, - **kwargs: Any, - ) -> AnswerPreCheckoutQuery: - """ - Shortcut for method :class:`aiogram.methods.answer_pre_checkout_query.AnswerPreCheckoutQuery` - will automatically fill method attributes: - - - :code:`pre_checkout_query_id` - - Once the user has confirmed their payment and shipping details, the Bot API sends the final confirmation in the form of an :class:`aiogram.types.update.Update` with the field *pre_checkout_query*. Use this method to respond to such pre-checkout queries. On success, :code:`True` is returned. **Note:** The Bot API must receive an answer within 10 seconds after the pre-checkout query was sent. - - Source: https://core.telegram.org/bots/api#answerprecheckoutquery - - :param ok: Specify :code:`True` if everything is alright (goods are available, etc.) and the bot is ready to proceed with the order. Use :code:`False` if there are any problems. - :param error_message: Required if *ok* is :code:`False`. Error message in human readable form that explains the reason for failure to proceed with the checkout (e.g. "Sorry, somebody just bought the last of our amazing black T-shirts while you were busy filling out your payment details. Please choose a different color or garment!"). Telegram will display this message to the user. - :return: instance of method :class:`aiogram.methods.answer_pre_checkout_query.AnswerPreCheckoutQuery` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import AnswerPreCheckoutQuery - - return AnswerPreCheckoutQuery( - pre_checkout_query_id=self.id, - ok=ok, - error_message=error_message, - **kwargs, - ).as_(self._bot) diff --git a/env/Lib/site-packages/aiogram/types/proximity_alert_triggered.py b/env/Lib/site-packages/aiogram/types/proximity_alert_triggered.py deleted file mode 100644 index f5a30c6..0000000 --- a/env/Lib/site-packages/aiogram/types/proximity_alert_triggered.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - -if TYPE_CHECKING: - from .user import User - - -class ProximityAlertTriggered(TelegramObject): - """ - This object represents the content of a service message, sent whenever a user in the chat triggers a proximity alert set by another user. - - Source: https://core.telegram.org/bots/api#proximityalerttriggered - """ - - traveler: User - """User that triggered the alert""" - watcher: User - """User that set the alert""" - distance: int - """The distance between the users""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - traveler: User, - watcher: User, - distance: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - traveler=traveler, watcher=watcher, distance=distance, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/reaction_count.py b/env/Lib/site-packages/aiogram/types/reaction_count.py deleted file mode 100644 index e4ee167..0000000 --- a/env/Lib/site-packages/aiogram/types/reaction_count.py +++ /dev/null @@ -1,40 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Union - -from .base import TelegramObject - -if TYPE_CHECKING: - from .reaction_type_custom_emoji import ReactionTypeCustomEmoji - from .reaction_type_emoji import ReactionTypeEmoji - from .reaction_type_paid import ReactionTypePaid - - -class ReactionCount(TelegramObject): - """ - Represents a reaction added to a message along with the number of times it was added. - - Source: https://core.telegram.org/bots/api#reactioncount - """ - - type: Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid] - """Type of the reaction""" - total_count: int - """Number of times the reaction was added""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Union[ReactionTypeEmoji, ReactionTypeCustomEmoji, ReactionTypePaid], - total_count: int, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, total_count=total_count, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/reaction_type.py b/env/Lib/site-packages/aiogram/types/reaction_type.py deleted file mode 100644 index 335d35d..0000000 --- a/env/Lib/site-packages/aiogram/types/reaction_type.py +++ /dev/null @@ -1,13 +0,0 @@ -from .base import TelegramObject - - -class ReactionType(TelegramObject): - """ - This object describes the type of a reaction. Currently, it can be one of - - - :class:`aiogram.types.reaction_type_emoji.ReactionTypeEmoji` - - :class:`aiogram.types.reaction_type_custom_emoji.ReactionTypeCustomEmoji` - - :class:`aiogram.types.reaction_type_paid.ReactionTypePaid` - - Source: https://core.telegram.org/bots/api#reactiontype - """ diff --git a/env/Lib/site-packages/aiogram/types/reaction_type_custom_emoji.py b/env/Lib/site-packages/aiogram/types/reaction_type_custom_emoji.py deleted file mode 100644 index c86ec5e..0000000 --- a/env/Lib/site-packages/aiogram/types/reaction_type_custom_emoji.py +++ /dev/null @@ -1,34 +0,0 @@ -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import ReactionTypeType -from .reaction_type import ReactionType - - -class ReactionTypeCustomEmoji(ReactionType): - """ - The reaction is based on a custom emoji. - - Source: https://core.telegram.org/bots/api#reactiontypecustomemoji - """ - - type: Literal[ReactionTypeType.CUSTOM_EMOJI] = ReactionTypeType.CUSTOM_EMOJI - """Type of the reaction, always 'custom_emoji'""" - custom_emoji_id: str - """Custom emoji identifier""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[ReactionTypeType.CUSTOM_EMOJI] = ReactionTypeType.CUSTOM_EMOJI, - custom_emoji_id: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, custom_emoji_id=custom_emoji_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/reaction_type_emoji.py b/env/Lib/site-packages/aiogram/types/reaction_type_emoji.py deleted file mode 100644 index a209fe2..0000000 --- a/env/Lib/site-packages/aiogram/types/reaction_type_emoji.py +++ /dev/null @@ -1,34 +0,0 @@ -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import ReactionTypeType -from .reaction_type import ReactionType - - -class ReactionTypeEmoji(ReactionType): - """ - The reaction is based on an emoji. - - Source: https://core.telegram.org/bots/api#reactiontypeemoji - """ - - type: Literal[ReactionTypeType.EMOJI] = ReactionTypeType.EMOJI - """Type of the reaction, always 'emoji'""" - emoji: str - """Reaction emoji. Currently, it can be one of "👍", "👎", "❤", "🔥", "🥰", "👏", "😁", "🤔", "🤯", "😱", "🤬", "😢", "🎉", "🤩", "🤮", "💩", "🙏", "👌", "🕊", "🤡", "🥱", "🥴", "😍", "🐳", "❤‍🔥", "🌚", "🌭", "💯", "🤣", "⚡", "🍌", "🏆", "💔", "🤨", "😐", "🍓", "🍾", "💋", "🖕", "😈", "😴", "😭", "🤓", "👻", "👨‍💻", "👀", "🎃", "🙈", "😇", "😨", "🤝", "✍", "🤗", "🫡", "🎅", "🎄", "☃", "💅", "🤪", "🗿", "🆒", "💘", "🙉", "🦄", "😘", "💊", "🙊", "😎", "👾", "🤷‍♂", "🤷", "🤷‍♀", "😡" """ - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[ReactionTypeType.EMOJI] = ReactionTypeType.EMOJI, - emoji: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, emoji=emoji, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/reaction_type_paid.py b/env/Lib/site-packages/aiogram/types/reaction_type_paid.py deleted file mode 100644 index 8e95a83..0000000 --- a/env/Lib/site-packages/aiogram/types/reaction_type_paid.py +++ /dev/null @@ -1,28 +0,0 @@ -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import ReactionTypeType -from .reaction_type import ReactionType - - -class ReactionTypePaid(ReactionType): - """ - The reaction is paid. - - Source: https://core.telegram.org/bots/api#reactiontypepaid - """ - - type: Literal["paid"] = "paid" - """Type of the reaction, always 'paid'""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, type: Literal["paid"] = "paid", **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/refunded_payment.py b/env/Lib/site-packages/aiogram/types/refunded_payment.py deleted file mode 100644 index 8b889dc..0000000 --- a/env/Lib/site-packages/aiogram/types/refunded_payment.py +++ /dev/null @@ -1,49 +0,0 @@ -from typing import TYPE_CHECKING, Any, Literal, Optional - -from .base import TelegramObject - - -class RefundedPayment(TelegramObject): - """ - This object contains basic information about a refunded payment. - - Source: https://core.telegram.org/bots/api#refundedpayment - """ - - currency: Literal["XTR"] = "XTR" - """Three-letter ISO 4217 `currency `_ code, or 'XTR' for payments in `Telegram Stars `_. Currently, always 'XTR'""" - total_amount: int - """Total refunded price in the *smallest units* of the currency (integer, **not** float/double). For example, for a price of :code:`US$ 1.45`, :code:`total_amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).""" - invoice_payload: str - """Bot-specified invoice payload""" - telegram_payment_charge_id: str - """Telegram payment identifier""" - provider_payment_charge_id: Optional[str] = None - """*Optional*. Provider payment identifier""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - currency: Literal["XTR"] = "XTR", - total_amount: int, - invoice_payload: str, - telegram_payment_charge_id: str, - provider_payment_charge_id: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - currency=currency, - total_amount=total_amount, - invoice_payload=invoice_payload, - telegram_payment_charge_id=telegram_payment_charge_id, - provider_payment_charge_id=provider_payment_charge_id, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/reply_keyboard_markup.py b/env/Lib/site-packages/aiogram/types/reply_keyboard_markup.py deleted file mode 100644 index f3d6dab..0000000 --- a/env/Lib/site-packages/aiogram/types/reply_keyboard_markup.py +++ /dev/null @@ -1,58 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from .base import MutableTelegramObject - -if TYPE_CHECKING: - from .keyboard_button import KeyboardButton - - -class ReplyKeyboardMarkup(MutableTelegramObject): - """ - This object represents a `custom keyboard `_ with reply options (see `Introduction to bots `_ for details and examples). Not supported in channels and for messages sent on behalf of a Telegram Business account. - - Source: https://core.telegram.org/bots/api#replykeyboardmarkup - """ - - keyboard: List[List[KeyboardButton]] - """Array of button rows, each represented by an Array of :class:`aiogram.types.keyboard_button.KeyboardButton` objects""" - is_persistent: Optional[bool] = None - """*Optional*. Requests clients to always show the keyboard when the regular keyboard is hidden. Defaults to *false*, in which case the custom keyboard can be hidden and opened with a keyboard icon.""" - resize_keyboard: Optional[bool] = None - """*Optional*. Requests clients to resize the keyboard vertically for optimal fit (e.g., make the keyboard smaller if there are just two rows of buttons). Defaults to *false*, in which case the custom keyboard is always of the same height as the app's standard keyboard.""" - one_time_keyboard: Optional[bool] = None - """*Optional*. Requests clients to hide the keyboard as soon as it's been used. The keyboard will still be available, but clients will automatically display the usual letter-keyboard in the chat - the user can press a special button in the input field to see the custom keyboard again. Defaults to *false*.""" - input_field_placeholder: Optional[str] = None - """*Optional*. The placeholder to be shown in the input field when the keyboard is active; 1-64 characters""" - selective: Optional[bool] = None - """*Optional*. Use this parameter if you want to show the keyboard to specific users only. Targets: 1) users that are @mentioned in the *text* of the :class:`aiogram.types.message.Message` object; 2) if the bot's message is a reply to a message in the same chat and forum topic, sender of the original message.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - keyboard: List[List[KeyboardButton]], - is_persistent: Optional[bool] = None, - resize_keyboard: Optional[bool] = None, - one_time_keyboard: Optional[bool] = None, - input_field_placeholder: Optional[str] = None, - selective: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - keyboard=keyboard, - is_persistent=is_persistent, - resize_keyboard=resize_keyboard, - one_time_keyboard=one_time_keyboard, - input_field_placeholder=input_field_placeholder, - selective=selective, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/reply_keyboard_remove.py b/env/Lib/site-packages/aiogram/types/reply_keyboard_remove.py deleted file mode 100644 index 9c135a1..0000000 --- a/env/Lib/site-packages/aiogram/types/reply_keyboard_remove.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional - -from .base import MutableTelegramObject - - -class ReplyKeyboardRemove(MutableTelegramObject): - """ - Upon receiving a message with this object, Telegram clients will remove the current custom keyboard and display the default letter-keyboard. By default, custom keyboards are displayed until a new keyboard is sent by a bot. An exception is made for one-time keyboards that are hidden immediately after the user presses a button (see :class:`aiogram.types.reply_keyboard_markup.ReplyKeyboardMarkup`). Not supported in channels and for messages sent on behalf of a Telegram Business account. - - Source: https://core.telegram.org/bots/api#replykeyboardremove - """ - - remove_keyboard: Literal[True] = True - """Requests clients to remove the custom keyboard (user will not be able to summon this keyboard; if you want to hide the keyboard from sight but keep it accessible, use *one_time_keyboard* in :class:`aiogram.types.reply_keyboard_markup.ReplyKeyboardMarkup`)""" - selective: Optional[bool] = None - """*Optional*. Use this parameter if you want to remove the keyboard for specific users only. Targets: 1) users that are @mentioned in the *text* of the :class:`aiogram.types.message.Message` object; 2) if the bot's message is a reply to a message in the same chat and forum topic, sender of the original message.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - remove_keyboard: Literal[True] = True, - selective: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - remove_keyboard=remove_keyboard, selective=selective, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/reply_parameters.py b/env/Lib/site-packages/aiogram/types/reply_parameters.py deleted file mode 100644 index 5b03fda..0000000 --- a/env/Lib/site-packages/aiogram/types/reply_parameters.py +++ /dev/null @@ -1,67 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional, Union - -from ..client.default import Default -from .base import TelegramObject - -if TYPE_CHECKING: - from .message_entity import MessageEntity - - -class ReplyParameters(TelegramObject): - """ - Describes reply parameters for the message that is being sent. - - Source: https://core.telegram.org/bots/api#replyparameters - """ - - message_id: int - """Identifier of the message that will be replied to in the current chat, or in the chat *chat_id* if it is specified""" - chat_id: Optional[Union[int, str]] = None - """*Optional*. If the message to be replied to is from a different chat, unique identifier for the chat or username of the channel (in the format :code:`@channelusername`). Not supported for messages sent on behalf of a business account.""" - allow_sending_without_reply: Optional[Union[bool, Default]] = Default( - "allow_sending_without_reply" - ) - """*Optional*. Pass :code:`True` if the message should be sent even if the specified message to be replied to is not found. Always :code:`False` for replies in another chat or forum topic. Always :code:`True` for messages sent on behalf of a business account.""" - quote: Optional[str] = None - """*Optional*. Quoted part of the message to be replied to; 0-1024 characters after entities parsing. The quote must be an exact substring of the message to be replied to, including *bold*, *italic*, *underline*, *strikethrough*, *spoiler*, and *custom_emoji* entities. The message will fail to send if the quote isn't found in the original message.""" - quote_parse_mode: Optional[Union[str, Default]] = Default("parse_mode") - """*Optional*. Mode for parsing entities in the quote. See `formatting options `_ for more details.""" - quote_entities: Optional[List[MessageEntity]] = None - """*Optional*. A JSON-serialized list of special entities that appear in the quote. It can be specified instead of *quote_parse_mode*.""" - quote_position: Optional[int] = None - """*Optional*. Position of the quote in the original message in UTF-16 code units""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - message_id: int, - chat_id: Optional[Union[int, str]] = None, - allow_sending_without_reply: Optional[Union[bool, Default]] = Default( - "allow_sending_without_reply" - ), - quote: Optional[str] = None, - quote_parse_mode: Optional[Union[str, Default]] = Default("parse_mode"), - quote_entities: Optional[List[MessageEntity]] = None, - quote_position: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - message_id=message_id, - chat_id=chat_id, - allow_sending_without_reply=allow_sending_without_reply, - quote=quote, - quote_parse_mode=quote_parse_mode, - quote_entities=quote_entities, - quote_position=quote_position, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/response_parameters.py b/env/Lib/site-packages/aiogram/types/response_parameters.py deleted file mode 100644 index 19fc54f..0000000 --- a/env/Lib/site-packages/aiogram/types/response_parameters.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - - -class ResponseParameters(TelegramObject): - """ - Describes why a request was unsuccessful. - - Source: https://core.telegram.org/bots/api#responseparameters - """ - - migrate_to_chat_id: Optional[int] = None - """*Optional*. The group has been migrated to a supergroup with the specified identifier. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this identifier.""" - retry_after: Optional[int] = None - """*Optional*. In case of exceeding flood control, the number of seconds left to wait before the request can be repeated""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - migrate_to_chat_id: Optional[int] = None, - retry_after: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - migrate_to_chat_id=migrate_to_chat_id, retry_after=retry_after, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/revenue_withdrawal_state.py b/env/Lib/site-packages/aiogram/types/revenue_withdrawal_state.py deleted file mode 100644 index 740323e..0000000 --- a/env/Lib/site-packages/aiogram/types/revenue_withdrawal_state.py +++ /dev/null @@ -1,15 +0,0 @@ -from __future__ import annotations - -from .base import TelegramObject - - -class RevenueWithdrawalState(TelegramObject): - """ - This object describes the state of a revenue withdrawal operation. Currently, it can be one of - - - :class:`aiogram.types.revenue_withdrawal_state_pending.RevenueWithdrawalStatePending` - - :class:`aiogram.types.revenue_withdrawal_state_succeeded.RevenueWithdrawalStateSucceeded` - - :class:`aiogram.types.revenue_withdrawal_state_failed.RevenueWithdrawalStateFailed` - - Source: https://core.telegram.org/bots/api#revenuewithdrawalstate - """ diff --git a/env/Lib/site-packages/aiogram/types/revenue_withdrawal_state_failed.py b/env/Lib/site-packages/aiogram/types/revenue_withdrawal_state_failed.py deleted file mode 100644 index 501a9ff..0000000 --- a/env/Lib/site-packages/aiogram/types/revenue_withdrawal_state_failed.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import RevenueWithdrawalStateType -from .revenue_withdrawal_state import RevenueWithdrawalState - - -class RevenueWithdrawalStateFailed(RevenueWithdrawalState): - """ - The withdrawal failed and the transaction was refunded. - - Source: https://core.telegram.org/bots/api#revenuewithdrawalstatefailed - """ - - type: Literal[RevenueWithdrawalStateType.FAILED] = RevenueWithdrawalStateType.FAILED - """Type of the state, always 'failed'""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[RevenueWithdrawalStateType.FAILED] = RevenueWithdrawalStateType.FAILED, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/revenue_withdrawal_state_pending.py b/env/Lib/site-packages/aiogram/types/revenue_withdrawal_state_pending.py deleted file mode 100644 index c4e481f..0000000 --- a/env/Lib/site-packages/aiogram/types/revenue_withdrawal_state_pending.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import RevenueWithdrawalStateType -from .revenue_withdrawal_state import RevenueWithdrawalState - - -class RevenueWithdrawalStatePending(RevenueWithdrawalState): - """ - The withdrawal is in progress. - - Source: https://core.telegram.org/bots/api#revenuewithdrawalstatepending - """ - - type: Literal[RevenueWithdrawalStateType.PENDING] = RevenueWithdrawalStateType.PENDING - """Type of the state, always 'pending'""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[RevenueWithdrawalStateType.PENDING] = RevenueWithdrawalStateType.PENDING, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/revenue_withdrawal_state_succeeded.py b/env/Lib/site-packages/aiogram/types/revenue_withdrawal_state_succeeded.py deleted file mode 100644 index 48d45f1..0000000 --- a/env/Lib/site-packages/aiogram/types/revenue_withdrawal_state_succeeded.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import RevenueWithdrawalStateType -from .custom import DateTime -from .revenue_withdrawal_state import RevenueWithdrawalState - - -class RevenueWithdrawalStateSucceeded(RevenueWithdrawalState): - """ - The withdrawal succeeded. - - Source: https://core.telegram.org/bots/api#revenuewithdrawalstatesucceeded - """ - - type: Literal[RevenueWithdrawalStateType.SUCCEEDED] = RevenueWithdrawalStateType.SUCCEEDED - """Type of the state, always 'succeeded'""" - date: DateTime - """Date the withdrawal was completed in Unix time""" - url: str - """An HTTPS URL that can be used to see transaction details""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[ - RevenueWithdrawalStateType.SUCCEEDED - ] = RevenueWithdrawalStateType.SUCCEEDED, - date: DateTime, - url: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, date=date, url=url, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/sent_web_app_message.py b/env/Lib/site-packages/aiogram/types/sent_web_app_message.py deleted file mode 100644 index e8241a5..0000000 --- a/env/Lib/site-packages/aiogram/types/sent_web_app_message.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - - -class SentWebAppMessage(TelegramObject): - """ - Describes an inline message sent by a `Web App `_ on behalf of a user. - - Source: https://core.telegram.org/bots/api#sentwebappmessage - """ - - inline_message_id: Optional[str] = None - """*Optional*. Identifier of the sent inline message. Available only if there is an `inline keyboard `_ attached to the message.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - inline_message_id: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(inline_message_id=inline_message_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/shared_user.py b/env/Lib/site-packages/aiogram/types/shared_user.py deleted file mode 100644 index e160b89..0000000 --- a/env/Lib/site-packages/aiogram/types/shared_user.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .photo_size import PhotoSize - - -class SharedUser(TelegramObject): - """ - This object contains information about a user that was shared with the bot using a :class:`aiogram.types.keyboard_button_request_users.KeyboardButtonRequestUsers` button. - - Source: https://core.telegram.org/bots/api#shareduser - """ - - user_id: int - """Identifier of the shared user. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so 64-bit integers or double-precision float types are safe for storing these identifiers. The bot may not have access to the user and could be unable to use this identifier, unless the user is already known to the bot by some other means.""" - first_name: Optional[str] = None - """*Optional*. First name of the user, if the name was requested by the bot""" - last_name: Optional[str] = None - """*Optional*. Last name of the user, if the name was requested by the bot""" - username: Optional[str] = None - """*Optional*. Username of the user, if the username was requested by the bot""" - photo: Optional[List[PhotoSize]] = None - """*Optional*. Available sizes of the chat photo, if the photo was requested by the bot""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - user_id: int, - first_name: Optional[str] = None, - last_name: Optional[str] = None, - username: Optional[str] = None, - photo: Optional[List[PhotoSize]] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - user_id=user_id, - first_name=first_name, - last_name=last_name, - username=username, - photo=photo, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/shipping_address.py b/env/Lib/site-packages/aiogram/types/shipping_address.py deleted file mode 100644 index a8293cd..0000000 --- a/env/Lib/site-packages/aiogram/types/shipping_address.py +++ /dev/null @@ -1,55 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class ShippingAddress(TelegramObject): - """ - This object represents a shipping address. - - Source: https://core.telegram.org/bots/api#shippingaddress - """ - - country_code: str - """Two-letter `ISO 3166-1 alpha-2 `_ country code""" - state: str - """State, if applicable""" - city: str - """City""" - street_line1: str - """First line for the address""" - street_line2: str - """Second line for the address""" - post_code: str - """Address post code""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - country_code: str, - state: str, - city: str, - street_line1: str, - street_line2: str, - post_code: str, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - country_code=country_code, - state=state, - city=city, - street_line1=street_line1, - street_line2=street_line2, - post_code=post_code, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/shipping_option.py b/env/Lib/site-packages/aiogram/types/shipping_option.py deleted file mode 100644 index b027451..0000000 --- a/env/Lib/site-packages/aiogram/types/shipping_option.py +++ /dev/null @@ -1,41 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List - -from .base import TelegramObject - -if TYPE_CHECKING: - from .labeled_price import LabeledPrice - - -class ShippingOption(TelegramObject): - """ - This object represents one shipping option. - - Source: https://core.telegram.org/bots/api#shippingoption - """ - - id: str - """Shipping option identifier""" - title: str - """Option title""" - prices: List[LabeledPrice] - """List of price portions""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - id: str, - title: str, - prices: List[LabeledPrice], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(id=id, title=title, prices=prices, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/shipping_query.py b/env/Lib/site-packages/aiogram/types/shipping_query.py deleted file mode 100644 index 61b4ae4..0000000 --- a/env/Lib/site-packages/aiogram/types/shipping_query.py +++ /dev/null @@ -1,90 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from pydantic import Field - -from .base import TelegramObject - -if TYPE_CHECKING: - from ..methods import AnswerShippingQuery - from ..types import ShippingOption - from .shipping_address import ShippingAddress - from .user import User - - -class ShippingQuery(TelegramObject): - """ - This object contains information about an incoming shipping query. - - Source: https://core.telegram.org/bots/api#shippingquery - """ - - id: str - """Unique query identifier""" - from_user: User = Field(..., alias="from") - """User who sent the query""" - invoice_payload: str - """Bot-specified invoice payload""" - shipping_address: ShippingAddress - """User specified shipping address""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - id: str, - from_user: User, - invoice_payload: str, - shipping_address: ShippingAddress, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - id=id, - from_user=from_user, - invoice_payload=invoice_payload, - shipping_address=shipping_address, - **__pydantic_kwargs, - ) - - def answer( - self, - ok: bool, - shipping_options: Optional[List[ShippingOption]] = None, - error_message: Optional[str] = None, - **kwargs: Any, - ) -> AnswerShippingQuery: - """ - Shortcut for method :class:`aiogram.methods.answer_shipping_query.AnswerShippingQuery` - will automatically fill method attributes: - - - :code:`shipping_query_id` - - If you sent an invoice requesting a shipping address and the parameter *is_flexible* was specified, the Bot API will send an :class:`aiogram.types.update.Update` with a *shipping_query* field to the bot. Use this method to reply to shipping queries. On success, :code:`True` is returned. - - Source: https://core.telegram.org/bots/api#answershippingquery - - :param ok: Pass :code:`True` if delivery to the specified address is possible and :code:`False` if there are any problems (for example, if delivery to the specified address is not possible) - :param shipping_options: Required if *ok* is :code:`True`. A JSON-serialized array of available shipping options. - :param error_message: Required if *ok* is :code:`False`. Error message in human readable form that explains why it is impossible to complete the order (e.g. "Sorry, delivery to your desired address is unavailable'). Telegram will display this message to the user. - :return: instance of method :class:`aiogram.methods.answer_shipping_query.AnswerShippingQuery` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import AnswerShippingQuery - - return AnswerShippingQuery( - shipping_query_id=self.id, - ok=ok, - shipping_options=shipping_options, - error_message=error_message, - **kwargs, - ).as_(self._bot) diff --git a/env/Lib/site-packages/aiogram/types/star_transaction.py b/env/Lib/site-packages/aiogram/types/star_transaction.py deleted file mode 100644 index 5d680af..0000000 --- a/env/Lib/site-packages/aiogram/types/star_transaction.py +++ /dev/null @@ -1,86 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, Union - -from .base import TelegramObject -from .custom import DateTime - -if TYPE_CHECKING: - from .transaction_partner_fragment import TransactionPartnerFragment - from .transaction_partner_other import TransactionPartnerOther - from .transaction_partner_telegram_ads import TransactionPartnerTelegramAds - from .transaction_partner_user import TransactionPartnerUser - - -class StarTransaction(TelegramObject): - """ - Describes a Telegram Star transaction. - - Source: https://core.telegram.org/bots/api#startransaction - """ - - id: str - """Unique identifier of the transaction. Coincides with the identifer of the original transaction for refund transactions. Coincides with *SuccessfulPayment.telegram_payment_charge_id* for successful incoming payments from users.""" - amount: int - """Number of Telegram Stars transferred by the transaction""" - date: DateTime - """Date the transaction was created in Unix time""" - source: Optional[ - Union[ - TransactionPartnerUser, - TransactionPartnerFragment, - TransactionPartnerTelegramAds, - TransactionPartnerOther, - ] - ] = None - """*Optional*. Source of an incoming transaction (e.g., a user purchasing goods or services, Fragment refunding a failed withdrawal). Only for incoming transactions""" - receiver: Optional[ - Union[ - TransactionPartnerUser, - TransactionPartnerFragment, - TransactionPartnerTelegramAds, - TransactionPartnerOther, - ] - ] = None - """*Optional*. Receiver of an outgoing transaction (e.g., a user for a purchase refund, Fragment for a withdrawal). Only for outgoing transactions""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - id: str, - amount: int, - date: DateTime, - source: Optional[ - Union[ - TransactionPartnerUser, - TransactionPartnerFragment, - TransactionPartnerTelegramAds, - TransactionPartnerOther, - ] - ] = None, - receiver: Optional[ - Union[ - TransactionPartnerUser, - TransactionPartnerFragment, - TransactionPartnerTelegramAds, - TransactionPartnerOther, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - id=id, - amount=amount, - date=date, - source=source, - receiver=receiver, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/star_transactions.py b/env/Lib/site-packages/aiogram/types/star_transactions.py deleted file mode 100644 index d2ee5b0..0000000 --- a/env/Lib/site-packages/aiogram/types/star_transactions.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List - -from .base import TelegramObject - -if TYPE_CHECKING: - from .star_transaction import StarTransaction - - -class StarTransactions(TelegramObject): - """ - Contains a list of Telegram Star transactions. - - Source: https://core.telegram.org/bots/api#startransactions - """ - - transactions: List[StarTransaction] - """The list of transactions""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, transactions: List[StarTransaction], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(transactions=transactions, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/sticker.py b/env/Lib/site-packages/aiogram/types/sticker.py deleted file mode 100644 index 4c1b864..0000000 --- a/env/Lib/site-packages/aiogram/types/sticker.py +++ /dev/null @@ -1,152 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from ..methods import DeleteStickerFromSet, SetStickerPositionInSet - from .file import File - from .mask_position import MaskPosition - from .photo_size import PhotoSize - - -class Sticker(TelegramObject): - """ - This object represents a sticker. - - Source: https://core.telegram.org/bots/api#sticker - """ - - file_id: str - """Identifier for this file, which can be used to download or reuse the file""" - file_unique_id: str - """Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.""" - type: str - """Type of the sticker, currently one of 'regular', 'mask', 'custom_emoji'. The type of the sticker is independent from its format, which is determined by the fields *is_animated* and *is_video*.""" - width: int - """Sticker width""" - height: int - """Sticker height""" - is_animated: bool - """:code:`True`, if the sticker is `animated `_""" - is_video: bool - """:code:`True`, if the sticker is a `video sticker `_""" - thumbnail: Optional[PhotoSize] = None - """*Optional*. Sticker thumbnail in the .WEBP or .JPG format""" - emoji: Optional[str] = None - """*Optional*. Emoji associated with the sticker""" - set_name: Optional[str] = None - """*Optional*. Name of the sticker set to which the sticker belongs""" - premium_animation: Optional[File] = None - """*Optional*. For premium regular stickers, premium animation for the sticker""" - mask_position: Optional[MaskPosition] = None - """*Optional*. For mask stickers, the position where the mask should be placed""" - custom_emoji_id: Optional[str] = None - """*Optional*. For custom emoji stickers, unique identifier of the custom emoji""" - needs_repainting: Optional[bool] = None - """*Optional*. :code:`True`, if the sticker must be repainted to a text color in messages, the color of the Telegram Premium badge in emoji status, white color on chat photos, or another appropriate color in other places""" - file_size: Optional[int] = None - """*Optional*. File size in bytes""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - file_id: str, - file_unique_id: str, - type: str, - width: int, - height: int, - is_animated: bool, - is_video: bool, - thumbnail: Optional[PhotoSize] = None, - emoji: Optional[str] = None, - set_name: Optional[str] = None, - premium_animation: Optional[File] = None, - mask_position: Optional[MaskPosition] = None, - custom_emoji_id: Optional[str] = None, - needs_repainting: Optional[bool] = None, - file_size: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - type=type, - width=width, - height=height, - is_animated=is_animated, - is_video=is_video, - thumbnail=thumbnail, - emoji=emoji, - set_name=set_name, - premium_animation=premium_animation, - mask_position=mask_position, - custom_emoji_id=custom_emoji_id, - needs_repainting=needs_repainting, - file_size=file_size, - **__pydantic_kwargs, - ) - - def set_position_in_set( - self, - position: int, - **kwargs: Any, - ) -> SetStickerPositionInSet: - """ - Shortcut for method :class:`aiogram.methods.set_sticker_position_in_set.SetStickerPositionInSet` - will automatically fill method attributes: - - - :code:`sticker` - - Use this method to move a sticker in a set created by the bot to a specific position. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#setstickerpositioninset - - :param position: New sticker position in the set, zero-based - :return: instance of method :class:`aiogram.methods.set_sticker_position_in_set.SetStickerPositionInSet` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import SetStickerPositionInSet - - return SetStickerPositionInSet( - sticker=self.file_id, - position=position, - **kwargs, - ).as_(self._bot) - - def delete_from_set( - self, - **kwargs: Any, - ) -> DeleteStickerFromSet: - """ - Shortcut for method :class:`aiogram.methods.delete_sticker_from_set.DeleteStickerFromSet` - will automatically fill method attributes: - - - :code:`sticker` - - Use this method to delete a sticker from a set created by the bot. Returns :code:`True` on success. - - Source: https://core.telegram.org/bots/api#deletestickerfromset - - :return: instance of method :class:`aiogram.methods.delete_sticker_from_set.DeleteStickerFromSet` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import DeleteStickerFromSet - - return DeleteStickerFromSet( - sticker=self.file_id, - **kwargs, - ).as_(self._bot) diff --git a/env/Lib/site-packages/aiogram/types/sticker_set.py b/env/Lib/site-packages/aiogram/types/sticker_set.py deleted file mode 100644 index 29f9962..0000000 --- a/env/Lib/site-packages/aiogram/types/sticker_set.py +++ /dev/null @@ -1,71 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from pydantic import Field - -from .base import TelegramObject - -if TYPE_CHECKING: - from .photo_size import PhotoSize - from .sticker import Sticker - - -class StickerSet(TelegramObject): - """ - This object represents a sticker set. - - Source: https://core.telegram.org/bots/api#stickerset - """ - - name: str - """Sticker set name""" - title: str - """Sticker set title""" - sticker_type: str - """Type of stickers in the set, currently one of 'regular', 'mask', 'custom_emoji'""" - stickers: List[Sticker] - """List of all set stickers""" - thumbnail: Optional[PhotoSize] = None - """*Optional*. Sticker set thumbnail in the .WEBP, .TGS, or .WEBM format""" - is_animated: Optional[bool] = Field(None, json_schema_extra={"deprecated": True}) - """:code:`True`, if the sticker set contains `animated stickers `_ - -.. deprecated:: API:7.2 - https://core.telegram.org/bots/api-changelog#march-31-2024""" - is_video: Optional[bool] = Field(None, json_schema_extra={"deprecated": True}) - """:code:`True`, if the sticker set contains `video stickers `_ - -.. deprecated:: API:7.2 - https://core.telegram.org/bots/api-changelog#march-31-2024""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - name: str, - title: str, - sticker_type: str, - stickers: List[Sticker], - thumbnail: Optional[PhotoSize] = None, - is_animated: Optional[bool] = None, - is_video: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - name=name, - title=title, - sticker_type=sticker_type, - stickers=stickers, - thumbnail=thumbnail, - is_animated=is_animated, - is_video=is_video, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/story.py b/env/Lib/site-packages/aiogram/types/story.py deleted file mode 100644 index 69aaaec..0000000 --- a/env/Lib/site-packages/aiogram/types/story.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - -if TYPE_CHECKING: - from .chat import Chat - - -class Story(TelegramObject): - """ - This object represents a story. - - Source: https://core.telegram.org/bots/api#story - """ - - chat: Chat - """Chat that posted the story""" - id: int - """Unique identifier for the story in the chat""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__(__pydantic__self__, *, chat: Chat, id: int, **__pydantic_kwargs: Any) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(chat=chat, id=id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/successful_payment.py b/env/Lib/site-packages/aiogram/types/successful_payment.py deleted file mode 100644 index 30d4356..0000000 --- a/env/Lib/site-packages/aiogram/types/successful_payment.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .order_info import OrderInfo - - -class SuccessfulPayment(TelegramObject): - """ - This object contains basic information about a successful payment. - - Source: https://core.telegram.org/bots/api#successfulpayment - """ - - currency: str - """Three-letter ISO 4217 `currency `_ code, or 'XTR' for payments in `Telegram Stars `_""" - total_amount: int - """Total price in the *smallest units* of the currency (integer, **not** float/double). For example, for a price of :code:`US$ 1.45` pass :code:`amount = 145`. See the *exp* parameter in `currencies.json `_, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).""" - invoice_payload: str - """Bot-specified invoice payload""" - telegram_payment_charge_id: str - """Telegram payment identifier""" - provider_payment_charge_id: str - """Provider payment identifier""" - shipping_option_id: Optional[str] = None - """*Optional*. Identifier of the shipping option chosen by the user""" - order_info: Optional[OrderInfo] = None - """*Optional*. Order information provided by the user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - currency: str, - total_amount: int, - invoice_payload: str, - telegram_payment_charge_id: str, - provider_payment_charge_id: str, - shipping_option_id: Optional[str] = None, - order_info: Optional[OrderInfo] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - currency=currency, - total_amount=total_amount, - invoice_payload=invoice_payload, - telegram_payment_charge_id=telegram_payment_charge_id, - provider_payment_charge_id=provider_payment_charge_id, - shipping_option_id=shipping_option_id, - order_info=order_info, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/switch_inline_query_chosen_chat.py b/env/Lib/site-packages/aiogram/types/switch_inline_query_chosen_chat.py deleted file mode 100644 index 9a25dca..0000000 --- a/env/Lib/site-packages/aiogram/types/switch_inline_query_chosen_chat.py +++ /dev/null @@ -1,49 +0,0 @@ -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - - -class SwitchInlineQueryChosenChat(TelegramObject): - """ - This object represents an inline button that switches the current user to inline mode in a chosen chat, with an optional default inline query. - - Source: https://core.telegram.org/bots/api#switchinlinequerychosenchat - """ - - query: Optional[str] = None - """*Optional*. The default inline query to be inserted in the input field. If left empty, only the bot's username will be inserted""" - allow_user_chats: Optional[bool] = None - """*Optional*. True, if private chats with users can be chosen""" - allow_bot_chats: Optional[bool] = None - """*Optional*. True, if private chats with bots can be chosen""" - allow_group_chats: Optional[bool] = None - """*Optional*. True, if group and supergroup chats can be chosen""" - allow_channel_chats: Optional[bool] = None - """*Optional*. True, if channel chats can be chosen""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - query: Optional[str] = None, - allow_user_chats: Optional[bool] = None, - allow_bot_chats: Optional[bool] = None, - allow_group_chats: Optional[bool] = None, - allow_channel_chats: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - query=query, - allow_user_chats=allow_user_chats, - allow_bot_chats=allow_bot_chats, - allow_group_chats=allow_group_chats, - allow_channel_chats=allow_channel_chats, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/text_quote.py b/env/Lib/site-packages/aiogram/types/text_quote.py deleted file mode 100644 index a882ccf..0000000 --- a/env/Lib/site-packages/aiogram/types/text_quote.py +++ /dev/null @@ -1,50 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .message_entity import MessageEntity - - -class TextQuote(TelegramObject): - """ - This object contains information about the quoted part of a message that is replied to by the given message. - - Source: https://core.telegram.org/bots/api#textquote - """ - - text: str - """Text of the quoted part of a message that is replied to by the given message""" - position: int - """Approximate quote position in the original message in UTF-16 code units as specified by the sender""" - entities: Optional[List[MessageEntity]] = None - """*Optional*. Special entities that appear in the quote. Currently, only *bold*, *italic*, *underline*, *strikethrough*, *spoiler*, and *custom_emoji* entities are kept in quotes.""" - is_manual: Optional[bool] = None - """*Optional*. True, if the quote was chosen manually by the message sender. Otherwise, the quote was added automatically by the server.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - text: str, - position: int, - entities: Optional[List[MessageEntity]] = None, - is_manual: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - text=text, - position=position, - entities=entities, - is_manual=is_manual, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/transaction_partner.py b/env/Lib/site-packages/aiogram/types/transaction_partner.py deleted file mode 100644 index a26b0fc..0000000 --- a/env/Lib/site-packages/aiogram/types/transaction_partner.py +++ /dev/null @@ -1,14 +0,0 @@ -from .base import TelegramObject - - -class TransactionPartner(TelegramObject): - """ - This object describes the source of a transaction, or its recipient for outgoing transactions. Currently, it can be one of - - - :class:`aiogram.types.transaction_partner_user.TransactionPartnerUser` - - :class:`aiogram.types.transaction_partner_fragment.TransactionPartnerFragment` - - :class:`aiogram.types.transaction_partner_telegram_ads.TransactionPartnerTelegramAds` - - :class:`aiogram.types.transaction_partner_other.TransactionPartnerOther` - - Source: https://core.telegram.org/bots/api#transactionpartner - """ diff --git a/env/Lib/site-packages/aiogram/types/transaction_partner_fragment.py b/env/Lib/site-packages/aiogram/types/transaction_partner_fragment.py deleted file mode 100644 index 350109e..0000000 --- a/env/Lib/site-packages/aiogram/types/transaction_partner_fragment.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal, Optional, Union - -from ..enums import TransactionPartnerType -from .transaction_partner import TransactionPartner - -if TYPE_CHECKING: - from .revenue_withdrawal_state_failed import RevenueWithdrawalStateFailed - from .revenue_withdrawal_state_pending import RevenueWithdrawalStatePending - from .revenue_withdrawal_state_succeeded import RevenueWithdrawalStateSucceeded - - -class TransactionPartnerFragment(TransactionPartner): - """ - Describes a withdrawal transaction with Fragment. - - Source: https://core.telegram.org/bots/api#transactionpartnerfragment - """ - - type: Literal[TransactionPartnerType.FRAGMENT] = TransactionPartnerType.FRAGMENT - """Type of the transaction partner, always 'fragment'""" - withdrawal_state: Optional[ - Union[ - RevenueWithdrawalStatePending, - RevenueWithdrawalStateSucceeded, - RevenueWithdrawalStateFailed, - ] - ] = None - """*Optional*. State of the transaction if the transaction is outgoing""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[TransactionPartnerType.FRAGMENT] = TransactionPartnerType.FRAGMENT, - withdrawal_state: Optional[ - Union[ - RevenueWithdrawalStatePending, - RevenueWithdrawalStateSucceeded, - RevenueWithdrawalStateFailed, - ] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, withdrawal_state=withdrawal_state, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/transaction_partner_other.py b/env/Lib/site-packages/aiogram/types/transaction_partner_other.py deleted file mode 100644 index 699297e..0000000 --- a/env/Lib/site-packages/aiogram/types/transaction_partner_other.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import TransactionPartnerType -from .transaction_partner import TransactionPartner - - -class TransactionPartnerOther(TransactionPartner): - """ - Describes a transaction with an unknown source or recipient. - - Source: https://core.telegram.org/bots/api#transactionpartnerother - """ - - type: Literal[TransactionPartnerType.OTHER] = TransactionPartnerType.OTHER - """Type of the transaction partner, always 'other'""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[TransactionPartnerType.OTHER] = TransactionPartnerType.OTHER, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/transaction_partner_telegram_ads.py b/env/Lib/site-packages/aiogram/types/transaction_partner_telegram_ads.py deleted file mode 100644 index 5df8eb6..0000000 --- a/env/Lib/site-packages/aiogram/types/transaction_partner_telegram_ads.py +++ /dev/null @@ -1,35 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Literal - -from ..enums import TransactionPartnerType -from .transaction_partner import TransactionPartner - - -class TransactionPartnerTelegramAds(TransactionPartner): - """ - Describes a withdrawal transaction to the Telegram Ads platform. - - Source: https://core.telegram.org/bots/api#transactionpartnertelegramads - """ - - type: Literal[TransactionPartnerType.TELEGRAM_ADS] = TransactionPartnerType.TELEGRAM_ADS - """Type of the transaction partner, always 'telegram_ads'""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[ - TransactionPartnerType.TELEGRAM_ADS - ] = TransactionPartnerType.TELEGRAM_ADS, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(type=type, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/transaction_partner_user.py b/env/Lib/site-packages/aiogram/types/transaction_partner_user.py deleted file mode 100644 index 260c9a1..0000000 --- a/env/Lib/site-packages/aiogram/types/transaction_partner_user.py +++ /dev/null @@ -1,56 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Literal, Optional, Union - -from ..enums import TransactionPartnerType -from .transaction_partner import TransactionPartner - -if TYPE_CHECKING: - from .paid_media_photo import PaidMediaPhoto - from .paid_media_preview import PaidMediaPreview - from .paid_media_video import PaidMediaVideo - from .user import User - - -class TransactionPartnerUser(TransactionPartner): - """ - Describes a transaction with a user. - - Source: https://core.telegram.org/bots/api#transactionpartneruser - """ - - type: Literal[TransactionPartnerType.USER] = TransactionPartnerType.USER - """Type of the transaction partner, always 'user'""" - user: User - """Information about the user""" - invoice_payload: Optional[str] = None - """*Optional*. Bot-specified invoice payload""" - paid_media: Optional[List[Union[PaidMediaPreview, PaidMediaPhoto, PaidMediaVideo]]] = None - """*Optional*. Information about the paid media bought by the user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - type: Literal[TransactionPartnerType.USER] = TransactionPartnerType.USER, - user: User, - invoice_payload: Optional[str] = None, - paid_media: Optional[ - List[Union[PaidMediaPreview, PaidMediaPhoto, PaidMediaVideo]] - ] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - type=type, - user=user, - invoice_payload=invoice_payload, - paid_media=paid_media, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/update.py b/env/Lib/site-packages/aiogram/types/update.py deleted file mode 100644 index 0533996..0000000 --- a/env/Lib/site-packages/aiogram/types/update.py +++ /dev/null @@ -1,211 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional, cast - -from ..utils.mypy_hacks import lru_cache -from .base import TelegramObject - -if TYPE_CHECKING: - from .business_connection import BusinessConnection - from .business_messages_deleted import BusinessMessagesDeleted - from .callback_query import CallbackQuery - from .chat_boost_removed import ChatBoostRemoved - from .chat_boost_updated import ChatBoostUpdated - from .chat_join_request import ChatJoinRequest - from .chat_member_updated import ChatMemberUpdated - from .chosen_inline_result import ChosenInlineResult - from .inline_query import InlineQuery - from .message import Message - from .message_reaction_count_updated import MessageReactionCountUpdated - from .message_reaction_updated import MessageReactionUpdated - from .poll import Poll - from .poll_answer import PollAnswer - from .pre_checkout_query import PreCheckoutQuery - from .shipping_query import ShippingQuery - - -class Update(TelegramObject): - """ - This `object `_ represents an incoming update. - - At most **one** of the optional parameters can be present in any given update. - - Source: https://core.telegram.org/bots/api#update - """ - - update_id: int - """The update's unique identifier. Update identifiers start from a certain positive number and increase sequentially. This identifier becomes especially handy if you're using `webhooks `_, since it allows you to ignore repeated updates or to restore the correct update sequence, should they get out of order. If there are no new updates for at least a week, then identifier of the next update will be chosen randomly instead of sequentially.""" - message: Optional[Message] = None - """*Optional*. New incoming message of any kind - text, photo, sticker, etc.""" - edited_message: Optional[Message] = None - """*Optional*. New version of a message that is known to the bot and was edited. This update may at times be triggered by changes to message fields that are either unavailable or not actively used by your bot.""" - channel_post: Optional[Message] = None - """*Optional*. New incoming channel post of any kind - text, photo, sticker, etc.""" - edited_channel_post: Optional[Message] = None - """*Optional*. New version of a channel post that is known to the bot and was edited. This update may at times be triggered by changes to message fields that are either unavailable or not actively used by your bot.""" - business_connection: Optional[BusinessConnection] = None - """*Optional*. The bot was connected to or disconnected from a business account, or a user edited an existing connection with the bot""" - business_message: Optional[Message] = None - """*Optional*. New message from a connected business account""" - edited_business_message: Optional[Message] = None - """*Optional*. New version of a message from a connected business account""" - deleted_business_messages: Optional[BusinessMessagesDeleted] = None - """*Optional*. Messages were deleted from a connected business account""" - message_reaction: Optional[MessageReactionUpdated] = None - """*Optional*. A reaction to a message was changed by a user. The bot must be an administrator in the chat and must explicitly specify :code:`"message_reaction"` in the list of *allowed_updates* to receive these updates. The update isn't received for reactions set by bots.""" - message_reaction_count: Optional[MessageReactionCountUpdated] = None - """*Optional*. Reactions to a message with anonymous reactions were changed. The bot must be an administrator in the chat and must explicitly specify :code:`"message_reaction_count"` in the list of *allowed_updates* to receive these updates. The updates are grouped and can be sent with delay up to a few minutes.""" - inline_query: Optional[InlineQuery] = None - """*Optional*. New incoming `inline `_ query""" - chosen_inline_result: Optional[ChosenInlineResult] = None - """*Optional*. The result of an `inline `_ query that was chosen by a user and sent to their chat partner. Please see our documentation on the `feedback collecting `_ for details on how to enable these updates for your bot.""" - callback_query: Optional[CallbackQuery] = None - """*Optional*. New incoming callback query""" - shipping_query: Optional[ShippingQuery] = None - """*Optional*. New incoming shipping query. Only for invoices with flexible price""" - pre_checkout_query: Optional[PreCheckoutQuery] = None - """*Optional*. New incoming pre-checkout query. Contains full information about checkout""" - poll: Optional[Poll] = None - """*Optional*. New poll state. Bots receive only updates about manually stopped polls and polls, which are sent by the bot""" - poll_answer: Optional[PollAnswer] = None - """*Optional*. A user changed their answer in a non-anonymous poll. Bots receive new votes only in polls that were sent by the bot itself.""" - my_chat_member: Optional[ChatMemberUpdated] = None - """*Optional*. The bot's chat member status was updated in a chat. For private chats, this update is received only when the bot is blocked or unblocked by the user.""" - chat_member: Optional[ChatMemberUpdated] = None - """*Optional*. A chat member's status was updated in a chat. The bot must be an administrator in the chat and must explicitly specify :code:`"chat_member"` in the list of *allowed_updates* to receive these updates.""" - chat_join_request: Optional[ChatJoinRequest] = None - """*Optional*. A request to join the chat has been sent. The bot must have the *can_invite_users* administrator right in the chat to receive these updates.""" - chat_boost: Optional[ChatBoostUpdated] = None - """*Optional*. A chat boost was added or changed. The bot must be an administrator in the chat to receive these updates.""" - removed_chat_boost: Optional[ChatBoostRemoved] = None - """*Optional*. A boost was removed from a chat. The bot must be an administrator in the chat to receive these updates.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - update_id: int, - message: Optional[Message] = None, - edited_message: Optional[Message] = None, - channel_post: Optional[Message] = None, - edited_channel_post: Optional[Message] = None, - business_connection: Optional[BusinessConnection] = None, - business_message: Optional[Message] = None, - edited_business_message: Optional[Message] = None, - deleted_business_messages: Optional[BusinessMessagesDeleted] = None, - message_reaction: Optional[MessageReactionUpdated] = None, - message_reaction_count: Optional[MessageReactionCountUpdated] = None, - inline_query: Optional[InlineQuery] = None, - chosen_inline_result: Optional[ChosenInlineResult] = None, - callback_query: Optional[CallbackQuery] = None, - shipping_query: Optional[ShippingQuery] = None, - pre_checkout_query: Optional[PreCheckoutQuery] = None, - poll: Optional[Poll] = None, - poll_answer: Optional[PollAnswer] = None, - my_chat_member: Optional[ChatMemberUpdated] = None, - chat_member: Optional[ChatMemberUpdated] = None, - chat_join_request: Optional[ChatJoinRequest] = None, - chat_boost: Optional[ChatBoostUpdated] = None, - removed_chat_boost: Optional[ChatBoostRemoved] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - update_id=update_id, - message=message, - edited_message=edited_message, - channel_post=channel_post, - edited_channel_post=edited_channel_post, - business_connection=business_connection, - business_message=business_message, - edited_business_message=edited_business_message, - deleted_business_messages=deleted_business_messages, - message_reaction=message_reaction, - message_reaction_count=message_reaction_count, - inline_query=inline_query, - chosen_inline_result=chosen_inline_result, - callback_query=callback_query, - shipping_query=shipping_query, - pre_checkout_query=pre_checkout_query, - poll=poll, - poll_answer=poll_answer, - my_chat_member=my_chat_member, - chat_member=chat_member, - chat_join_request=chat_join_request, - chat_boost=chat_boost, - removed_chat_boost=removed_chat_boost, - **__pydantic_kwargs, - ) - - def __hash__(self) -> int: - return hash((type(self), self.update_id)) - - @property - @lru_cache() - def event_type(self) -> str: - """ - Detect update type - If update type is unknown, raise UpdateTypeLookupError - - :return: - """ - if self.message: - return "message" - if self.edited_message: - return "edited_message" - if self.channel_post: - return "channel_post" - if self.edited_channel_post: - return "edited_channel_post" - if self.inline_query: - return "inline_query" - if self.chosen_inline_result: - return "chosen_inline_result" - if self.callback_query: - return "callback_query" - if self.shipping_query: - return "shipping_query" - if self.pre_checkout_query: - return "pre_checkout_query" - if self.poll: - return "poll" - if self.poll_answer: - return "poll_answer" - if self.my_chat_member: - return "my_chat_member" - if self.chat_member: - return "chat_member" - if self.chat_join_request: - return "chat_join_request" - if self.message_reaction: - return "message_reaction" - if self.message_reaction_count: - return "message_reaction_count" - if self.chat_boost: - return "chat_boost" - if self.removed_chat_boost: - return "removed_chat_boost" - if self.deleted_business_messages: - return "deleted_business_messages" - if self.business_connection: - return "business_connection" - if self.edited_business_message: - return "edited_business_message" - if self.business_message: - return "business_message" - - raise UpdateTypeLookupError("Update does not contain any known event type.") - - @property - def event(self) -> TelegramObject: - return cast(TelegramObject, getattr(self, self.event_type)) - - -class UpdateTypeLookupError(LookupError): - """Update does not contain any known event type.""" diff --git a/env/Lib/site-packages/aiogram/types/user.py b/env/Lib/site-packages/aiogram/types/user.py deleted file mode 100644 index 56782f2..0000000 --- a/env/Lib/site-packages/aiogram/types/user.py +++ /dev/null @@ -1,140 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from ..utils import markdown -from ..utils.link import create_tg_link -from .base import TelegramObject - -if TYPE_CHECKING: - from ..methods import GetUserProfilePhotos - - -class User(TelegramObject): - """ - This object represents a Telegram user or bot. - - Source: https://core.telegram.org/bots/api#user - """ - - id: int - """Unique identifier for this user or bot. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier.""" - is_bot: bool - """:code:`True`, if this user is a bot""" - first_name: str - """User's or bot's first name""" - last_name: Optional[str] = None - """*Optional*. User's or bot's last name""" - username: Optional[str] = None - """*Optional*. User's or bot's username""" - language_code: Optional[str] = None - """*Optional*. `IETF language tag `_ of the user's language""" - is_premium: Optional[bool] = None - """*Optional*. :code:`True`, if this user is a Telegram Premium user""" - added_to_attachment_menu: Optional[bool] = None - """*Optional*. :code:`True`, if this user added the bot to the attachment menu""" - can_join_groups: Optional[bool] = None - """*Optional*. :code:`True`, if the bot can be invited to groups. Returned only in :class:`aiogram.methods.get_me.GetMe`.""" - can_read_all_group_messages: Optional[bool] = None - """*Optional*. :code:`True`, if `privacy mode `_ is disabled for the bot. Returned only in :class:`aiogram.methods.get_me.GetMe`.""" - supports_inline_queries: Optional[bool] = None - """*Optional*. :code:`True`, if the bot supports inline queries. Returned only in :class:`aiogram.methods.get_me.GetMe`.""" - can_connect_to_business: Optional[bool] = None - """*Optional*. :code:`True`, if the bot can be connected to a Telegram Business account to receive its messages. Returned only in :class:`aiogram.methods.get_me.GetMe`.""" - has_main_web_app: Optional[bool] = None - """*Optional*. :code:`True`, if the bot has a main Web App. Returned only in :class:`aiogram.methods.get_me.GetMe`.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - id: int, - is_bot: bool, - first_name: str, - last_name: Optional[str] = None, - username: Optional[str] = None, - language_code: Optional[str] = None, - is_premium: Optional[bool] = None, - added_to_attachment_menu: Optional[bool] = None, - can_join_groups: Optional[bool] = None, - can_read_all_group_messages: Optional[bool] = None, - supports_inline_queries: Optional[bool] = None, - can_connect_to_business: Optional[bool] = None, - has_main_web_app: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - id=id, - is_bot=is_bot, - first_name=first_name, - last_name=last_name, - username=username, - language_code=language_code, - is_premium=is_premium, - added_to_attachment_menu=added_to_attachment_menu, - can_join_groups=can_join_groups, - can_read_all_group_messages=can_read_all_group_messages, - supports_inline_queries=supports_inline_queries, - can_connect_to_business=can_connect_to_business, - has_main_web_app=has_main_web_app, - **__pydantic_kwargs, - ) - - @property - def full_name(self) -> str: - if self.last_name: - return f"{self.first_name} {self.last_name}" - return self.first_name - - @property - def url(self) -> str: - return create_tg_link("user", id=self.id) - - def mention_markdown(self, name: Optional[str] = None) -> str: - if name is None: - name = self.full_name - return markdown.link(name, self.url) - - def mention_html(self, name: Optional[str] = None) -> str: - if name is None: - name = self.full_name - return markdown.hlink(name, self.url) - - def get_profile_photos( - self, - offset: Optional[int] = None, - limit: Optional[int] = None, - **kwargs: Any, - ) -> GetUserProfilePhotos: - """ - Shortcut for method :class:`aiogram.methods.get_user_profile_photos.GetUserProfilePhotos` - will automatically fill method attributes: - - - :code:`user_id` - - Use this method to get a list of profile pictures for a user. Returns a :class:`aiogram.types.user_profile_photos.UserProfilePhotos` object. - - Source: https://core.telegram.org/bots/api#getuserprofilephotos - - :param offset: Sequential number of the first photo to be returned. By default, all photos are returned. - :param limit: Limits the number of photos to be retrieved. Values between 1-100 are accepted. Defaults to 100. - :return: instance of method :class:`aiogram.methods.get_user_profile_photos.GetUserProfilePhotos` - """ - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - - from aiogram.methods import GetUserProfilePhotos - - return GetUserProfilePhotos( - user_id=self.id, - offset=offset, - limit=limit, - **kwargs, - ).as_(self._bot) diff --git a/env/Lib/site-packages/aiogram/types/user_chat_boosts.py b/env/Lib/site-packages/aiogram/types/user_chat_boosts.py deleted file mode 100644 index 3da8d37..0000000 --- a/env/Lib/site-packages/aiogram/types/user_chat_boosts.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List - -from .base import TelegramObject - -if TYPE_CHECKING: - from .chat_boost import ChatBoost - - -class UserChatBoosts(TelegramObject): - """ - This object represents a list of boosts added to a chat by a user. - - Source: https://core.telegram.org/bots/api#userchatboosts - """ - - boosts: List[ChatBoost] - """The list of boosts added to the chat by the user""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, boosts: List[ChatBoost], **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(boosts=boosts, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/user_profile_photos.py b/env/Lib/site-packages/aiogram/types/user_profile_photos.py deleted file mode 100644 index c1c5d28..0000000 --- a/env/Lib/site-packages/aiogram/types/user_profile_photos.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List - -from .base import TelegramObject - -if TYPE_CHECKING: - from .photo_size import PhotoSize - - -class UserProfilePhotos(TelegramObject): - """ - This object represent a user's profile pictures. - - Source: https://core.telegram.org/bots/api#userprofilephotos - """ - - total_count: int - """Total number of profile pictures the target user has""" - photos: List[List[PhotoSize]] - """Requested profile pictures (in up to 4 sizes each)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - total_count: int, - photos: List[List[PhotoSize]], - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(total_count=total_count, photos=photos, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/user_shared.py b/env/Lib/site-packages/aiogram/types/user_shared.py deleted file mode 100644 index 59d1ede..0000000 --- a/env/Lib/site-packages/aiogram/types/user_shared.py +++ /dev/null @@ -1,32 +0,0 @@ -from typing import TYPE_CHECKING, Any - -from aiogram.types import TelegramObject - - -class UserShared(TelegramObject): - """ - This object contains information about the user whose identifier was shared with the bot using a :class:`aiogram.types.keyboard_button_request_user.KeyboardButtonRequestUser` button. - - .. deprecated:: API:7.0 - https://core.telegram.org/bots/api-changelog#december-29-2023 - - Source: https://core.telegram.org/bots/api#usershared - """ - - request_id: int - """Identifier of the request""" - user_id: int - """Identifier of the shared user. This number may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a 64-bit integer or double-precision float type are safe for storing this identifier. The bot may not have access to the user and could be unable to use this identifier, unless the user is already known to the bot by some other means.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, request_id: int, user_id: int, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(request_id=request_id, user_id=user_id, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/users_shared.py b/env/Lib/site-packages/aiogram/types/users_shared.py deleted file mode 100644 index 351fc0e..0000000 --- a/env/Lib/site-packages/aiogram/types/users_shared.py +++ /dev/null @@ -1,48 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from pydantic import Field - -from .base import TelegramObject - -if TYPE_CHECKING: - from .shared_user import SharedUser - - -class UsersShared(TelegramObject): - """ - This object contains information about the users whose identifiers were shared with the bot using a :class:`aiogram.types.keyboard_button_request_users.KeyboardButtonRequestUsers` button. - - Source: https://core.telegram.org/bots/api#usersshared - """ - - request_id: int - """Identifier of the request""" - users: List[SharedUser] - """Information about users shared with the bot.""" - user_ids: Optional[List[int]] = Field(None, json_schema_extra={"deprecated": True}) - """Identifiers of the shared users. These numbers may have more than 32 significant bits and some programming languages may have difficulty/silent defects in interpreting them. But they have at most 52 significant bits, so 64-bit integers or double-precision float types are safe for storing these identifiers. The bot may not have access to the users and could be unable to use these identifiers, unless the users are already known to the bot by some other means. - -.. deprecated:: API:7.2 - https://core.telegram.org/bots/api-changelog#march-31-2024""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - request_id: int, - users: List[SharedUser], - user_ids: Optional[List[int]] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - request_id=request_id, users=users, user_ids=user_ids, **__pydantic_kwargs - ) diff --git a/env/Lib/site-packages/aiogram/types/venue.py b/env/Lib/site-packages/aiogram/types/venue.py deleted file mode 100644 index e0a3f84..0000000 --- a/env/Lib/site-packages/aiogram/types/venue.py +++ /dev/null @@ -1,62 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .location import Location - - -class Venue(TelegramObject): - """ - This object represents a venue. - - Source: https://core.telegram.org/bots/api#venue - """ - - location: Location - """Venue location. Can't be a live location""" - title: str - """Name of the venue""" - address: str - """Address of the venue""" - foursquare_id: Optional[str] = None - """*Optional*. Foursquare identifier of the venue""" - foursquare_type: Optional[str] = None - """*Optional*. Foursquare type of the venue. (For example, 'arts_entertainment/default', 'arts_entertainment/aquarium' or 'food/icecream'.)""" - google_place_id: Optional[str] = None - """*Optional*. Google Places identifier of the venue""" - google_place_type: Optional[str] = None - """*Optional*. Google Places type of the venue. (See `supported types `_.)""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - location: Location, - title: str, - address: str, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - location=location, - title=title, - address=address, - foursquare_id=foursquare_id, - foursquare_type=foursquare_type, - google_place_id=google_place_id, - google_place_type=google_place_type, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/video.py b/env/Lib/site-packages/aiogram/types/video.py deleted file mode 100644 index e8ecf1f..0000000 --- a/env/Lib/site-packages/aiogram/types/video.py +++ /dev/null @@ -1,70 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .photo_size import PhotoSize - - -class Video(TelegramObject): - """ - This object represents a video file. - - Source: https://core.telegram.org/bots/api#video - """ - - file_id: str - """Identifier for this file, which can be used to download or reuse the file""" - file_unique_id: str - """Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.""" - width: int - """Video width as defined by the sender""" - height: int - """Video height as defined by the sender""" - duration: int - """Duration of the video in seconds as defined by the sender""" - thumbnail: Optional[PhotoSize] = None - """*Optional*. Video thumbnail""" - file_name: Optional[str] = None - """*Optional*. Original filename as defined by the sender""" - mime_type: Optional[str] = None - """*Optional*. MIME type of the file as defined by the sender""" - file_size: Optional[int] = None - """*Optional*. File size in bytes. It can be bigger than 2^31 and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this value.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - file_id: str, - file_unique_id: str, - width: int, - height: int, - duration: int, - thumbnail: Optional[PhotoSize] = None, - file_name: Optional[str] = None, - mime_type: Optional[str] = None, - file_size: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - width=width, - height=height, - duration=duration, - thumbnail=thumbnail, - file_name=file_name, - mime_type=mime_type, - file_size=file_size, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/video_chat_ended.py b/env/Lib/site-packages/aiogram/types/video_chat_ended.py deleted file mode 100644 index 289eb72..0000000 --- a/env/Lib/site-packages/aiogram/types/video_chat_ended.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class VideoChatEnded(TelegramObject): - """ - This object represents a service message about a video chat ended in the chat. - - Source: https://core.telegram.org/bots/api#videochatended - """ - - duration: int - """Video chat duration in seconds""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__(__pydantic__self__, *, duration: int, **__pydantic_kwargs: Any) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(duration=duration, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/video_chat_participants_invited.py b/env/Lib/site-packages/aiogram/types/video_chat_participants_invited.py deleted file mode 100644 index 74e1a35..0000000 --- a/env/Lib/site-packages/aiogram/types/video_chat_participants_invited.py +++ /dev/null @@ -1,30 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List - -from .base import TelegramObject - -if TYPE_CHECKING: - from .user import User - - -class VideoChatParticipantsInvited(TelegramObject): - """ - This object represents a service message about new members invited to a video chat. - - Source: https://core.telegram.org/bots/api#videochatparticipantsinvited - """ - - users: List[User] - """New members that were invited to the video chat""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__(__pydantic__self__, *, users: List[User], **__pydantic_kwargs: Any) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(users=users, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/video_chat_scheduled.py b/env/Lib/site-packages/aiogram/types/video_chat_scheduled.py deleted file mode 100644 index c82e495..0000000 --- a/env/Lib/site-packages/aiogram/types/video_chat_scheduled.py +++ /dev/null @@ -1,30 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject -from .custom import DateTime - - -class VideoChatScheduled(TelegramObject): - """ - This object represents a service message about a video chat scheduled in the chat. - - Source: https://core.telegram.org/bots/api#videochatscheduled - """ - - start_date: DateTime - """Point in time (Unix timestamp) when the video chat is supposed to be started by a chat administrator""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, start_date: DateTime, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(start_date=start_date, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/video_chat_started.py b/env/Lib/site-packages/aiogram/types/video_chat_started.py deleted file mode 100644 index a6f9aed..0000000 --- a/env/Lib/site-packages/aiogram/types/video_chat_started.py +++ /dev/null @@ -1,11 +0,0 @@ -from __future__ import annotations - -from .base import TelegramObject - - -class VideoChatStarted(TelegramObject): - """ - This object represents a service message about a video chat started in the chat. Currently holds no information. - - Source: https://core.telegram.org/bots/api#videochatstarted - """ diff --git a/env/Lib/site-packages/aiogram/types/video_note.py b/env/Lib/site-packages/aiogram/types/video_note.py deleted file mode 100644 index 5be8502..0000000 --- a/env/Lib/site-packages/aiogram/types/video_note.py +++ /dev/null @@ -1,58 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - -if TYPE_CHECKING: - from .photo_size import PhotoSize - - -class VideoNote(TelegramObject): - """ - This object represents a `video message `_ (available in Telegram apps as of `v.4.0 `_). - - Source: https://core.telegram.org/bots/api#videonote - """ - - file_id: str - """Identifier for this file, which can be used to download or reuse the file""" - file_unique_id: str - """Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.""" - length: int - """Video width and height (diameter of the video message) as defined by the sender""" - duration: int - """Duration of the video in seconds as defined by the sender""" - thumbnail: Optional[PhotoSize] = None - """*Optional*. Video thumbnail""" - file_size: Optional[int] = None - """*Optional*. File size in bytes""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - file_id: str, - file_unique_id: str, - length: int, - duration: int, - thumbnail: Optional[PhotoSize] = None, - file_size: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - length=length, - duration=duration, - thumbnail=thumbnail, - file_size=file_size, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/voice.py b/env/Lib/site-packages/aiogram/types/voice.py deleted file mode 100644 index d5e0abc..0000000 --- a/env/Lib/site-packages/aiogram/types/voice.py +++ /dev/null @@ -1,51 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Optional - -from .base import TelegramObject - - -class Voice(TelegramObject): - """ - This object represents a voice note. - - Source: https://core.telegram.org/bots/api#voice - """ - - file_id: str - """Identifier for this file, which can be used to download or reuse the file""" - file_unique_id: str - """Unique identifier for this file, which is supposed to be the same over time and for different bots. Can't be used to download or reuse the file.""" - duration: int - """Duration of the audio in seconds as defined by the sender""" - mime_type: Optional[str] = None - """*Optional*. MIME type of the file as defined by the sender""" - file_size: Optional[int] = None - """*Optional*. File size in bytes. It can be bigger than 2^31 and some programming languages may have difficulty/silent defects in interpreting it. But it has at most 52 significant bits, so a signed 64-bit integer or double-precision float type are safe for storing this value.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - file_id: str, - file_unique_id: str, - duration: int, - mime_type: Optional[str] = None, - file_size: Optional[int] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - file_id=file_id, - file_unique_id=file_unique_id, - duration=duration, - mime_type=mime_type, - file_size=file_size, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/web_app_data.py b/env/Lib/site-packages/aiogram/types/web_app_data.py deleted file mode 100644 index 8fac379..0000000 --- a/env/Lib/site-packages/aiogram/types/web_app_data.py +++ /dev/null @@ -1,31 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class WebAppData(TelegramObject): - """ - Describes data sent from a `Web App `_ to the bot. - - Source: https://core.telegram.org/bots/api#webappdata - """ - - data: str - """The data. Be aware that a bad client can send arbitrary data in this field.""" - button_text: str - """Text of the *web_app* keyboard button from which the Web App was opened. Be aware that a bad client can send arbitrary data in this field.""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, *, data: str, button_text: str, **__pydantic_kwargs: Any - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(data=data, button_text=button_text, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/web_app_info.py b/env/Lib/site-packages/aiogram/types/web_app_info.py deleted file mode 100644 index fbf9846..0000000 --- a/env/Lib/site-packages/aiogram/types/web_app_info.py +++ /dev/null @@ -1,27 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -from .base import TelegramObject - - -class WebAppInfo(TelegramObject): - """ - Describes a `Web App `_. - - Source: https://core.telegram.org/bots/api#webappinfo - """ - - url: str - """An HTTPS URL of a Web App to be opened with additional data as specified in `Initializing Web Apps `_""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__(__pydantic__self__, *, url: str, **__pydantic_kwargs: Any) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__(url=url, **__pydantic_kwargs) diff --git a/env/Lib/site-packages/aiogram/types/webhook_info.py b/env/Lib/site-packages/aiogram/types/webhook_info.py deleted file mode 100644 index 1753df4..0000000 --- a/env/Lib/site-packages/aiogram/types/webhook_info.py +++ /dev/null @@ -1,68 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from .base import TelegramObject -from .custom import DateTime - - -class WebhookInfo(TelegramObject): - """ - Describes the current status of a webhook. - - Source: https://core.telegram.org/bots/api#webhookinfo - """ - - url: str - """Webhook URL, may be empty if webhook is not set up""" - has_custom_certificate: bool - """:code:`True`, if a custom certificate was provided for webhook certificate checks""" - pending_update_count: int - """Number of updates awaiting delivery""" - ip_address: Optional[str] = None - """*Optional*. Currently used webhook IP address""" - last_error_date: Optional[DateTime] = None - """*Optional*. Unix time for the most recent error that happened when trying to deliver an update via webhook""" - last_error_message: Optional[str] = None - """*Optional*. Error message in human-readable format for the most recent error that happened when trying to deliver an update via webhook""" - last_synchronization_error_date: Optional[DateTime] = None - """*Optional*. Unix time of the most recent error that happened when trying to synchronize available updates with Telegram datacenters""" - max_connections: Optional[int] = None - """*Optional*. The maximum allowed number of simultaneous HTTPS connections to the webhook for update delivery""" - allowed_updates: Optional[List[str]] = None - """*Optional*. A list of update types the bot is subscribed to. Defaults to all update types except *chat_member*""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - url: str, - has_custom_certificate: bool, - pending_update_count: int, - ip_address: Optional[str] = None, - last_error_date: Optional[DateTime] = None, - last_error_message: Optional[str] = None, - last_synchronization_error_date: Optional[DateTime] = None, - max_connections: Optional[int] = None, - allowed_updates: Optional[List[str]] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - url=url, - has_custom_certificate=has_custom_certificate, - pending_update_count=pending_update_count, - ip_address=ip_address, - last_error_date=last_error_date, - last_error_message=last_error_message, - last_synchronization_error_date=last_synchronization_error_date, - max_connections=max_connections, - allowed_updates=allowed_updates, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/types/write_access_allowed.py b/env/Lib/site-packages/aiogram/types/write_access_allowed.py deleted file mode 100644 index 6b8e50a..0000000 --- a/env/Lib/site-packages/aiogram/types/write_access_allowed.py +++ /dev/null @@ -1,41 +0,0 @@ -from typing import TYPE_CHECKING, Any, Optional - -from aiogram.types import TelegramObject - - -class WriteAccessAllowed(TelegramObject): - """ - This object represents a service message about a user allowing a bot to write messages after adding it to the attachment menu, launching a Web App from a link, or accepting an explicit request from a Web App sent by the method `requestWriteAccess `_. - - Source: https://core.telegram.org/bots/api#writeaccessallowed - """ - - from_request: Optional[bool] = None - """*Optional*. True, if the access was granted after the user accepted an explicit request from a Web App sent by the method `requestWriteAccess `_""" - web_app_name: Optional[str] = None - """*Optional*. Name of the Web App, if the access was granted when the Web App was launched from a link""" - from_attachment_menu: Optional[bool] = None - """*Optional*. True, if the access was granted when the bot was added to the attachment or side menu""" - - if TYPE_CHECKING: - # DO NOT EDIT MANUALLY!!! - # This section was auto-generated via `butcher` - - def __init__( - __pydantic__self__, - *, - from_request: Optional[bool] = None, - web_app_name: Optional[str] = None, - from_attachment_menu: Optional[bool] = None, - **__pydantic_kwargs: Any, - ) -> None: - # DO NOT EDIT MANUALLY!!! - # This method was auto-generated via `butcher` - # Is needed only for type checking and IDE support without any additional plugins - - super().__init__( - from_request=from_request, - web_app_name=web_app_name, - from_attachment_menu=from_attachment_menu, - **__pydantic_kwargs, - ) diff --git a/env/Lib/site-packages/aiogram/utils/__init__.py b/env/Lib/site-packages/aiogram/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/Lib/site-packages/aiogram/utils/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e5a6621b4d5a5d27cd30473c77d27c4277d1118a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 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 diff --git a/env/Lib/site-packages/aiogram/utils/__pycache__/chat_member.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/__pycache__/chat_member.cpython-311.pyc deleted file mode 100644 index 5af477a6991a1b546e2c91670edb38edd8e62a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1338 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 diff --git a/env/Lib/site-packages/aiogram/utils/__pycache__/keyboard.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/__pycache__/keyboard.cpython-311.pyc deleted file mode 100644 index 4c85129841d8482952197f4ca85f0dcc3cc0c6f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19088 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 diff --git a/env/Lib/site-packages/aiogram/utils/__pycache__/link.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/__pycache__/link.cpython-311.pyc deleted file mode 100644 index 5f949afe8675c3641b4d5e486084425c7b1d0dc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3649 zcmbVOO>7&-6`m!R%i+I7{r}6B6pKSyX@@J zwggIL0UvCjDAb^Vg}OnBB1jdq2OWx{#~gd;VOg-~Vu1h#dg_gUZaVe7U5cVim4^;@ z-n^Oj&CGjm-n`)-B9S10@|PEX-~J~h1-UM-B{~??I%n%t;YB zupN}5PlR-^f$oH)QVftGsS8%?Zp;>>_!B-Ic6PWJ>w&RIfL#5PrldYtq5lJv+LiFw-rMS~O+PFcil&M= z7zh+uPFA-xNw)pK{zOyMy`cw&QPAH?r6g@jPl}3`Wnw-l$q!R|exM6W$;W$qN>)>6 zTxu=B*@0~)X7jRYWNa_2Ve}+;8_3~$8?7A z%R)eO9>^q=v(^u@#R&RzSNF1y1)K0Ghxoj0$@Pd5i+2#}o zo2DImJ|hd41(*`21EI$-K-)U=dK&3DP!Id(Tysb28q2 zS7Fo>r|FYG8VZ}CH;;KB?sp#8=1VU>lpBMM3$76ZcG9dz-di+7n5~^DO-riZ^}%!!;1P4?o0-Ef?h#UFVL|9 z)AE`#-v!6>q6+(D9x9ToWk3%@w*#W8sk?ctsN1227zJC99-0MX9YgT+$8e<2!L$33 z68CdR8l{NDErTFS_M;^aB%WvmdhJDeC2?_Xn)+YpSJD-r`3`IImy;WyeI3xgHnh+I zEwrKi9nk(ZH0^+j<5gUPeR2 zL@{D6Jx|2RDUn7_iLKc|-4L0PWm>Vot^u0iMQ2k;rjcO2W3M5(fn*j*0?8bbc_3%p zyzLXEyrL$&wjdS?vMRA|l;TBB#MlJ#lSux*4Q#==(r{}EGRrHv4*w~19bW`U)UCx$ z+5?TGf|p;FbNJ}Fd1VP^pf36|@L!qK$4RuSyb4c|=^wQwW}gaAOI12*#e2)|TmCq{ zPjeRS`4=7j2OU28c9kY-G-1+&ld_URgGR%dH2V#feKS)m5OhPO`0>(V){ws1H^mjj8S;q(6 z7Vg}?y|(fm>&H1>Na4<7$?ySmUP31*ZGKbJats6FOX4Wtgw7dV&TCRJC%?^Zfe3Gz zJ^*>R?&UbnB9rD-pGD@)tG<_A^W}&Yh?j+zJ(Ffv3ckv=+X5{|>H@jLt#WlDaIp(= zxbE;3IB*z08T{+ipT`{5{K%D~)$Gw{iFu0>GOUM|AU8$MKsdZsYJRBupl!t-&#CcmluC zYu4CxYiJxl;3uZ7{t=MYN9MV2)CmwP+FkcT`!Y6g5!#QW=hnB5F^#SAtNmp-u2)SY0!%<_D Q2!Z+-j-f(V5hrl|3w-TCCjbBd diff --git a/env/Lib/site-packages/aiogram/utils/__pycache__/magic_filter.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/__pycache__/magic_filter.cpython-311.pyc deleted file mode 100644 index d98f05bd97571472415a2593211f9788fe56b9f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1836 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 diff --git a/env/Lib/site-packages/aiogram/utils/__pycache__/media_group.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/__pycache__/media_group.cpython-311.pyc deleted file mode 100644 index dae3bf1c9cfc3bab57e14f50664f11d008594947..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17076 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 diff --git a/env/Lib/site-packages/aiogram/utils/__pycache__/mypy_hacks.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/__pycache__/mypy_hacks.cpython-311.pyc deleted file mode 100644 index fc544c0873a50cc8e86def20114a5fac9f8b3e3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1076 zcmah{O=uHA6rS1LY?A(%N=4AqAc6+8g<7N>9F7lTbnNvGcuo^WMC9?|b{9zrP28 ze0lrb{)`d&sf>=K+nbgJn{C7p!!F7zt+}|O<+X~Q*D=x%*O|TpxA$QEmb}4wn8_0? z$xW8x8aGOq8@6_-6M$@!rPmVqB*TwUw)a?_&t|nKHBDWY7F-@B=fWy~LPdn8bOPNkT3*0PNaw1I7n>1%y2 zv{emiF;?F65D?p09w)A-%@=90%n9{8UsCD#9$`KYylavy`C^eQIkHSBsS3Z!g$(1X zvg`z;OpA*IwC}kg@i=Fk5!)9;Lb6Wu4HEc7HFG9?K&SvaP=TS^$0;Mju6aeFMpEpu z3`PRhAgtCsfGuqsrXkPxpLO?}cvIT}ruMpQt)f3?2EAi7g0y-``o0@P>2Cj7UG%~W zBB>w+5Ga;Oy?&azKW;q*Cah_nIbO+HtO+W8F<Km-jit~^ls|gd-Og1G{#gPev27-hlPN@Ght}D_VPew)o z_>PPCh~mp}Ri~+miqC2;pA;7%Ud=KH0h&6-_y`RgbiN~W_26&c52LsKaAW#qZY@{G lO*4%Ln+V`_5Ubq_vHE&_e`^2MH@ttlG5#n%`6tAs{Q}u(3H<;7 diff --git a/env/Lib/site-packages/aiogram/utils/__pycache__/payload.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/__pycache__/payload.cpython-311.pyc deleted file mode 100644 index ef6de3c68d2ebf232f6b1e4792f4832094f5c485..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4025 zcmb_f&2JmW6`$p|cTLHbWks=@XduNh8Ida_PV7Xeg4U8+6ipl>hGRexLM*vMYNI8W zm|03CLAxpt6h5j&0jo)a>g2j`&-p8QAPoW*76>39$RRfZMlL?(&CD(-Qc_|RU2xyb z?!5Qrz2Ezo<-d|i6~XoOm;Wu^(-8WWKLl68pFH~-CJ&H_R*|WgAzLYjRzv0RYFOdV zVLMWeu13qT)tG`#Av0-4N!*N)7>SZZNg;`1=;c5o>d(wLi5FvL;`8Y0sh-rS7nD*# zN`-wALQBNdK98(wV&6FI7co!6^Jz133#CVlFJcI(H;uaO7$&Y#QZ=YmDXHomg4c~r zf(_FoCT32V;F@dM47(048yf^~IdlVWS?)Tn`qIQ;7NNSTUWZ8mlS;uc2_}Cq%2k^z zs49j_*D-&a&D&04V_^YT>+ZT!k!yUtNS!h^ET=?`vMx5%1NBz9>QL8LoAclHCFOP| zUL4{`O&1+!I^AcS!IZF??JnTy)$+TW(}BGv5%yXx&Kre||GV8%{ZHBLo5Nw?mlWU* z4T`3GPtyWW&Uwfq?yIVqO)twr}&Q=AN2_SDWKQ3?Rc!?6jCAh~> zp!KTj&^~ZK7dvi>h~JWsG$Cj7C9AqlDE4Fb>y=wQqmSdh4H>52gp}jv`Z86+%-~uD zhQ1|SwqP5KfziUqg#opE*(61r%UKo6&E-;z*u@OqAoT^zT$(=0%_TUK4m^qP@oMreDB4wWCix_;6EG2G@R)oz2g8&Ue z0^UP>FO(KP$Yr=71*?)jMK(5kXYa;g$=R=r3 z?me?nmrMCq6FmgE$35A*sEPJ^ya5*PpxA@h(ldN{#1{{uG6^p~hMWBc2t-9ilQRJNOLLu< z=30^QgZRkyANNP6o{r8w8J%s9raGgkRw8wvjorW2IyckSUh8PDJ=Nx(Xmf2X+tISE zNS2O)s={IPdIjvl%Fm#$G?f>@?`{YpbVB)>p}|G~g&1y3t;j+YfF1>0f37Tgz(={Q zbOMMMhfi+XC=efBFDXhTfYsBW&Vq*ljOhqh!ASvbb`{7r`tD-p(Vh0iw>uZ#hFl(- zdO9}yWNfxQmgYfBAy#N+|&%sQGy|7Ixl$Rd` z15jEKeTeZ4!6GZ^dA`QUXK=H3fo!9Lh<2at7+=lomj0gkN9NJl_J!Bm6R)>N=h~6E z?caW*{bKjdKR^BA)AlRb&MVorrgt>G710G~Y2`*b>BVz7(<$U~UQ9MlX#%&&i@EhG ze92M(1yPPFJD7j((MnbVL_j%%%@EKOK$$RuNEO9>=2HFiPiqZ`& zDv>VYi!yIYT_SG83lSx?d%lZc*t;TzVKNd{ S=6BC^5e$342*Zg)AowHCJ^+XS diff --git a/env/Lib/site-packages/aiogram/utils/__pycache__/serialization.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/__pycache__/serialization.cpython-311.pyc deleted file mode 100644 index 7c35e9a8de9f7064d66db5cb594ce44d7e0c8080..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3892 zcmd^B-EZ606~7cIk`nb{J9dn$Sj35voz_5qCF>vzIhhgVjQnKWv z>mRTy>hSR1bI<)czu&o^=JQzs<&VGp%f??p`zL<%N+wYb{{zYnF^Iugq{@{!4)v6k zs`6#NDwKt4x}0Wpyd_qpvcz=3lB=0=hUsZ5TUE*m(?u&+&6o2`m#jjyST2Ho!pP7x zRZjKBCPtQKHUvYtpDvG3E=8^qBX^$|`Mne&`|yv;9=!H@AEZ2*AsJ$f8%4@L=Wm3L zfzQzm*%$?%C%)2>2g@_}q%`qw9HqpC8AJE=iluvAi4XZjyAcY@X2lQXYc=0= zY~4beCEcTMI|juMe#!CSHNH$Y^t$E4*LByaQP(%A2la)U)S|atz4|uw?>GkbUa@O+ z|B7kR)lf3xUZLnxzwX);@a}U+AYW3TKj=xnD*_p zt-7oGj;pOZ{u;IKuKn0tU-L|#&ertGmVTRhYr5&+dN0;})ABBQ)HQX>{7}c;o2xa# zymp)V+6GJkeYj&V3eLd00HQ?#snGhxqp_DeV>8{cnFrD%rLg_(L#eIIca-_AGT#>F z55bUBQ1nV~;fI%?W`|Hx<_uC!y#oPV=BYr_M(Q%OP?1Vh-bftF{gI zv^QO9^v>dnRDvpFThBO-q4`R=#W ze#f6Nt5CpMhiPWFTFQj7rr|_1EzD|K)iLT8>N!pOd0n@X7D>|#r=n>t27Fl5G~Kox zp9PEuwP~#7VKi3(?K9$@fR{UpVxlK7iab2Y*1#_k;5^5)uCReRvllWQUmK z9^Xv4Q-ert62H%Agbbt7%{IwqzqQF594_NnZyX~j$9hjT$u4f&bHzv*{DClR4IF`6 zn3N`Wkluqi?<3GzxhKHv(@kNsKi;m?Ya4twNmFP7bPmKl7<<1z{ylMM-l9Kp)N6Pq z?nG1E?d6{%BhZ@s@SHf}DZ661!dsMB|J>LQPi2e3p7!UR(fw`dGx&vWKUG$OIFt{&X zUs2-#X1oAxtQsf)QdY8zI0GfzGO)^{ZHzY}HV?(vUntht7G8mbA^^Z?D8H|}NJXBD z$B$VQd43Y~P|=VuJ#Eu-Y)CmLp^i0_lrU?0rtSHsS;7MFz!B^;7b7vu;s_S= z!ZJrFdDQcO1;aeBGVBf27-<0yVbT`sHQ*!4c%me^Q#c+b8&^eV68*rZw&8_xKO3=G z%84t(!!eOHp)kS;Um7@m%}+AB7VnGuDp*g$-}@Vg7Ku)i;%Mt?Af1T_m%jM>g@=_t zyxBRo)IGPvDuUBf-P3aqq;0t)pZb?Hx_$1~jgEA-E1kvW%RyoEWBVg}cjohV9@w42 z8{NVi5BO&y8TtC|t#)y?Q=IJlewLeeARQxvVYo)w5ZwmtK^<)eYl2J*Mm2W96NV>P*E>VVsW_I^}9}5@$2NpEn(PCb3 zUxPkZ;qR3|w8*p5B=-%B(UHkOeLa$docM%*c*=xKBqhoSX@$jGiCZnDR&SOjLItlC z>{d=a7iSTQa36tVXLkm6MQ|}`g>tQ70Ee2Dm@lN{GRiKt;mPD{u40*RftyRHm0f+q zVy`jgH7{nNe6JR-KOVb*Fydj95(?{%W5pYW%XH76=wDC1kT1tKo;Tg^Lj#7t_ZyHA z&v9Hp&bEi2fV|xP^5-!*(;j{vlgak*6Oh;2!%sk7X%9aEIoBS3B9Z659T5OuoQ`oyL_jc?@E-7pO|e7Nz+WcH MpoZoz671~$3s)8VsQ>@~ diff --git a/env/Lib/site-packages/aiogram/utils/__pycache__/text_decorations.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/__pycache__/text_decorations.cpython-311.pyc deleted file mode 100644 index a59933e886dede8247c97ed6f3ec1ad39684e211..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15536 zcmeG@ZERcDb?=dn-;_v+67^--)Q25YjwL6t-Pn=k=*yBVi*h8&acMa;rAN!MDN?zl z9Gj(EwRKn7Fc2+EYZZ+LZ3t3%b^!rv2V*F<3}~^e`+D@)g?nAFphbrU7%+KCfkFd{ zopT>ay${N>8yEYtr>Ar8JNN6Hd(S=hoO>_7Q&M7O;Q6y}|J}J4Jq+`6{K!8BDZ;M( z1|qi@p5fUDGtCBA7UQ~zE})~KKA?wCAK|7A0mHO0V5I3>#58RVn5QiP%d|CMowfyR z)AoRUx+G9S(+!c*X-B}pGGQ|@LV07vIb9YggEUj1oUh>R*SLU-ujET0tk5xi3}1SU z;T>VadwPbs3;)s+sHAC5NGl6hs?yvvtsK%^nzSk%6L!A`mE6r&#RRGWSEa($@VXJk z>;43Dd0EjGibi9JP+}?;jr+VhQQz6sEtZDH;|UU)NKA(l=VQFrD3Ctl^@i~)ka>bFbSA^#7{Ncg z_AEqhF)3zAmbek++4rE--9pI`=8n#nw9F>X?S5|m?g(;k3`ZwoeE1GaDxq8)vwGHt zdk&7h8Y36Sx?}uQbaL$CEbZXncq}m%j$Rr&J~ciTpGt&x&x9r}LVw1`LQ}Cx5}IzC zO-x1NZODU+?|AFX72<-LDX50XS_ObPCTnxN`O=M-7QT?SHDzo~0@t(#c;@M_N@}4h zcACFVgD;`@EgF0&#n)@_4vOEZ!8-xJi}z^oWi)?-247C`jT*d*H-SEQmN=pR zQ800mk`nl!vPs++s{$~Q8y1K%(C@jaaGax4fxSS{2okzNl(|rdE3k!{6j-Q9dKB24 z(pJ@LESlF;6l>07&zmkWM3(~fm)eY8;+c)Fl!DXuU^MO)MkJ-Xr&3hP^hfj(PGb68q_vR) z(4VNt=tH)EVnnIYJSm+#-#wkOy=WzrLqXF#T1p>58!9^bv=9xGhKUC&oc5} zOX-1{x_oXWEmt|91vQlBN$Ge)io1Zij6UCHZtLzDm8Bm+9V$Hf;p3udu-E55I^+}WC;Eqcy+PmTU{~+3 zXzK4A>GyZ`iKgyc#Lzp~dGxr*bqyWw5sgRvoyU)Mi(L0mPp@bh_4V`)A3y5r6-!3^ z!$${t{r$s3qka9NY2?Jv(c@5`wd?p$_rNQoL;hZ|viH;pXuq@TcyDk6O;C|hJujLj z!(a-66{J5g+)H*K;r1C44(2;W)Wer(_xGOi2lM2YcZ)su1c2=*S@-cM?GWop|V*xCeJ z+p3YNsD1nJs$N&tvcP@lYoSmstPeeX+xvmx#5%Q*W4XWz$_HMdT^b!w?+;Z(ZP zo2m4!nz)kERV(cSTHT8eY%dD77qj*jLHYi|Rkg@1o_ptF+SQVAwaoWqT~)UZymeq{ zuh80epZ~!m1n@2#NW1zou71JZzd_@^2ey5JZC|0pclqzXaNqa?Yr3^N)7p(iG;HPR za8-TiYJT8qUf%noiXTmUus<^pN_UQDI>!Z9bJ{hLaZL#JiB&V>tavkdBe~d|c5KTy zwh88K)TZ=_W-1O-;rM!e-aR>u-pXl(^Ks@(ant6TASmD^vP%$ZA5du^L)s@%Fjzpn zsTSCjj+7?~MhdDwUU!YTr&p@WC_Bk0F&ZVwC2tlK-DngPU_9)Zmb@%U5dzN|4M|m@ zhlJjc6lh+_%JnA{JLu^oBy`0SJLi%25>{9!q1K|J(s{ss0mp+~Lz@Ntqz&T`d?D6% z2i$|$xpVO_dWRf%G}AHf11aL$>BheU-kwlpH>PbITA?cZ8SR

      aG7KZP- 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 Scc$Gf8F!1oxTKd#;Qs*lwmG!` diff --git a/env/Lib/site-packages/aiogram/utils/__pycache__/token.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/__pycache__/token.cpython-311.pyc deleted file mode 100644 index 3de6fdd495c3d85c3d3772940698dd0ad4058d56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2187 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 bool: - """ - Generate hexadecimal representation - of the HMAC-SHA-256 signature of the data-check-string - with the SHA256 hash of the bot's token used as a secret key - - :param token: - :param hash: - :param kwargs: all params received on auth - :return: - """ - secret = hashlib.sha256(token.encode("utf-8")) - check_string = "\n".join(f"{k}={kwargs[k]}" for k in sorted(kwargs)) - hmac_string = hmac.new( - secret.digest(), check_string.encode("utf-8"), digestmod=hashlib.sha256 - ).hexdigest() - return hmac_string == hash - - -def check_integrity(token: str, data: Dict[str, Any]) -> bool: - """ - Verify the authentication and the integrity - of the data received on user's auth - - :param token: Bot's token - :param data: all data that came on auth - :return: - """ - return check_signature(token, **data) diff --git a/env/Lib/site-packages/aiogram/utils/backoff.py b/env/Lib/site-packages/aiogram/utils/backoff.py deleted file mode 100644 index ebe08e9..0000000 --- a/env/Lib/site-packages/aiogram/utils/backoff.py +++ /dev/null @@ -1,83 +0,0 @@ -import asyncio -import time -from dataclasses import dataclass -from random import normalvariate - - -@dataclass(frozen=True) -class BackoffConfig: - min_delay: float - max_delay: float - factor: float - jitter: float - - def __post_init__(self) -> None: - if self.max_delay <= self.min_delay: - raise ValueError("`max_delay` should be greater than `min_delay`") - if self.factor <= 1: - raise ValueError("`factor` should be greater than 1") - - -class Backoff: - def __init__(self, config: BackoffConfig) -> None: - self.config = config - self._next_delay = config.min_delay - self._current_delay = 0.0 - self._counter = 0 - - def __iter__(self) -> "Backoff": - return self - - @property - def min_delay(self) -> float: - return self.config.min_delay - - @property - def max_delay(self) -> float: - return self.config.max_delay - - @property - def factor(self) -> float: - return self.config.factor - - @property - def jitter(self) -> float: - return self.config.jitter - - @property - def next_delay(self) -> float: - return self._next_delay - - @property - def current_delay(self) -> float: - return self._current_delay - - @property - def counter(self) -> int: - return self._counter - - def sleep(self) -> None: - time.sleep(next(self)) - - async def asleep(self) -> None: - await asyncio.sleep(next(self)) - - def _calculate_next(self, value: float) -> float: - return normalvariate(min(value * self.factor, self.max_delay), self.jitter) - - def __next__(self) -> float: - self._current_delay = self._next_delay - self._next_delay = self._calculate_next(self._next_delay) - self._counter += 1 - return self._current_delay - - def reset(self) -> None: - self._current_delay = 0.0 - self._counter = 0 - self._next_delay = self.min_delay - - def __str__(self) -> str: - return ( - f"Backoff(tryings={self._counter}, current_delay={self._current_delay}, " - f"next_delay={self._next_delay})" - ) diff --git a/env/Lib/site-packages/aiogram/utils/callback_answer.py b/env/Lib/site-packages/aiogram/utils/callback_answer.py deleted file mode 100644 index 1515a7e..0000000 --- a/env/Lib/site-packages/aiogram/utils/callback_answer.py +++ /dev/null @@ -1,211 +0,0 @@ -from typing import Any, Awaitable, Callable, Dict, Optional, Union - -from aiogram import BaseMiddleware, loggers -from aiogram.dispatcher.flags import get_flag -from aiogram.exceptions import CallbackAnswerException -from aiogram.methods import AnswerCallbackQuery -from aiogram.types import CallbackQuery, TelegramObject - - -class CallbackAnswer: - def __init__( - self, - answered: bool, - disabled: bool = False, - text: Optional[str] = None, - show_alert: Optional[bool] = None, - url: Optional[str] = None, - cache_time: Optional[int] = None, - ) -> None: - """ - Callback answer configuration - - :param answered: this request is already answered by middleware - :param disabled: answer will not be performed - :param text: answer with text - :param show_alert: show alert - :param url: game url - :param cache_time: cache answer for some time - """ - self._answered = answered - self._disabled = disabled - self._text = text - self._show_alert = show_alert - self._url = url - self._cache_time = cache_time - - def disable(self) -> None: - """ - Deactivate answering for this handler - """ - self.disabled = True - - @property - def disabled(self) -> bool: - """Indicates that automatic answer is disabled in this handler""" - return self._disabled - - @disabled.setter - def disabled(self, value: bool) -> None: - if self._answered: - raise CallbackAnswerException("Can't change disabled state after answer") - self._disabled = value - - @property - def answered(self) -> bool: - """ - Indicates that request is already answered by middleware - """ - return self._answered - - @property - def text(self) -> Optional[str]: - """ - Response text - :return: - """ - return self._text - - @text.setter - def text(self, value: Optional[str]) -> None: - if self._answered: - raise CallbackAnswerException("Can't change text after answer") - self._text = value - - @property - def show_alert(self) -> Optional[bool]: - """ - Whether to display an alert - """ - return self._show_alert - - @show_alert.setter - def show_alert(self, value: Optional[bool]) -> None: - if self._answered: - raise CallbackAnswerException("Can't change show_alert after answer") - self._show_alert = value - - @property - def url(self) -> Optional[str]: - """ - Game url - """ - return self._url - - @url.setter - def url(self, value: Optional[str]) -> None: - if self._answered: - raise CallbackAnswerException("Can't change url after answer") - self._url = value - - @property - def cache_time(self) -> Optional[int]: - """ - Response cache time - """ - return self._cache_time - - @cache_time.setter - def cache_time(self, value: Optional[int]) -> None: - if self._answered: - raise CallbackAnswerException("Can't change cache_time after answer") - self._cache_time = value - - def __str__(self) -> str: - args = ", ".join( - f"{k}={v!r}" - for k, v in { - "answered": self.answered, - "disabled": self.disabled, - "text": self.text, - "show_alert": self.show_alert, - "url": self.url, - "cache_time": self.cache_time, - }.items() - if v is not None - ) - return f"{type(self).__name__}({args})" - - -class CallbackAnswerMiddleware(BaseMiddleware): - def __init__( - self, - pre: bool = False, - text: Optional[str] = None, - show_alert: Optional[bool] = None, - url: Optional[str] = None, - cache_time: Optional[int] = None, - ) -> None: - """ - Inner middleware for callback query handlers, can be useful in bots with a lot of callback - handlers to automatically take answer to all requests - - :param pre: send answer before execute handler - :param text: answer with text - :param show_alert: show alert - :param url: game url - :param cache_time: cache answer for some time - """ - self.pre = pre - self.text = text - self.show_alert = show_alert - self.url = url - self.cache_time = cache_time - - async def __call__( - self, - handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]], - event: TelegramObject, - data: Dict[str, Any], - ) -> Any: - if not isinstance(event, CallbackQuery): - return await handler(event, data) - - callback_answer = data["callback_answer"] = self.construct_callback_answer( - properties=get_flag(data, "callback_answer") - ) - - if not callback_answer.disabled and callback_answer.answered: - await self.answer(event, callback_answer) - try: - return await handler(event, data) - finally: - if not callback_answer.disabled and not callback_answer.answered: - await self.answer(event, callback_answer) - - def construct_callback_answer( - self, properties: Optional[Union[Dict[str, Any], bool]] - ) -> CallbackAnswer: - pre, disabled, text, show_alert, url, cache_time = ( - self.pre, - False, - self.text, - self.show_alert, - self.url, - self.cache_time, - ) - if isinstance(properties, dict): - pre = properties.get("pre", pre) - disabled = properties.get("disabled", disabled) - text = properties.get("text", text) - show_alert = properties.get("show_alert", show_alert) - url = properties.get("url", url) - cache_time = properties.get("cache_time", cache_time) - - return CallbackAnswer( - answered=pre, - disabled=disabled, - text=text, - show_alert=show_alert, - url=url, - cache_time=cache_time, - ) - - def answer(self, event: CallbackQuery, callback_answer: CallbackAnswer) -> AnswerCallbackQuery: - loggers.middlewares.info("Answer to callback query id=%s", event.id) - return event.answer( - text=callback_answer.text, - show_alert=callback_answer.show_alert, - url=callback_answer.url, - cache_time=callback_answer.cache_time, - ) diff --git a/env/Lib/site-packages/aiogram/utils/chat_action.py b/env/Lib/site-packages/aiogram/utils/chat_action.py deleted file mode 100644 index a2f3b46..0000000 --- a/env/Lib/site-packages/aiogram/utils/chat_action.py +++ /dev/null @@ -1,379 +0,0 @@ -import asyncio -import logging -import time -from asyncio import Event, Lock -from contextlib import suppress -from types import TracebackType -from typing import Any, Awaitable, Callable, Dict, Optional, Type, Union - -from aiogram import BaseMiddleware, Bot -from aiogram.dispatcher.flags import get_flag -from aiogram.types import Message, TelegramObject - -logger = logging.getLogger(__name__) -DEFAULT_INTERVAL = 5.0 -DEFAULT_INITIAL_SLEEP = 0.0 - - -class ChatActionSender: - """ - This utility helps to automatically send chat action until long actions is done - to take acknowledge bot users the bot is doing something and not crashed. - - Provides simply to use context manager. - - Technically sender start background task with infinity loop which works - until action will be finished and sends the - `chat action `_ - every 5 seconds. - """ - - def __init__( - self, - *, - bot: Bot, - chat_id: Union[str, int], - message_thread_id: Optional[int] = None, - action: str = "typing", - interval: float = DEFAULT_INTERVAL, - initial_sleep: float = DEFAULT_INITIAL_SLEEP, - ) -> None: - """ - :param bot: instance of the bot - :param chat_id: target chat id - :param message_thread_id: unique identifier for the target message thread; supergroups only - :param action: chat action type - :param interval: interval between iterations - :param initial_sleep: sleep before first sending of the action - """ - self.chat_id = chat_id - self.message_thread_id = message_thread_id - self.action = action - self.interval = interval - self.initial_sleep = initial_sleep - self.bot = bot - - self._lock = Lock() - self._close_event = Event() - self._closed_event = Event() - self._task: Optional[asyncio.Task[Any]] = None - - @property - def running(self) -> bool: - return bool(self._task) - - async def _wait(self, interval: float) -> None: - with suppress(asyncio.TimeoutError): - await asyncio.wait_for(self._close_event.wait(), interval) - - async def _worker(self) -> None: - logger.debug( - "Started chat action %r sender in chat_id=%s via bot id=%d", - self.action, - self.chat_id, - self.bot.id, - ) - try: - counter = 0 - await self._wait(self.initial_sleep) - while not self._close_event.is_set(): - start = time.monotonic() - logger.debug( - "Sent chat action %r to chat_id=%s via bot %d (already sent actions %d)", - self.action, - self.chat_id, - self.bot.id, - counter, - ) - await self.bot.send_chat_action( - chat_id=self.chat_id, - action=self.action, - message_thread_id=self.message_thread_id, - ) - counter += 1 - - interval = self.interval - (time.monotonic() - start) - await self._wait(interval) - finally: - logger.debug( - "Finished chat action %r sender in chat_id=%s via bot id=%d", - self.action, - self.chat_id, - self.bot.id, - ) - self._closed_event.set() - - async def _run(self) -> None: - async with self._lock: - self._close_event.clear() - self._closed_event.clear() - if self.running: - raise RuntimeError("Already running") - self._task = asyncio.create_task(self._worker()) - - async def _stop(self) -> None: - async with self._lock: - if not self.running: - return - if not self._close_event.is_set(): # pragma: no branches - self._close_event.set() - await self._closed_event.wait() - self._task = None - - async def __aenter__(self) -> "ChatActionSender": - await self._run() - return self - - async def __aexit__( - self, - exc_type: Optional[Type[BaseException]], - exc_value: Optional[BaseException], - traceback: Optional[TracebackType], - ) -> Any: - await self._stop() - - @classmethod - def typing( - cls, - chat_id: Union[int, str], - bot: Bot, - message_thread_id: Optional[int] = None, - interval: float = DEFAULT_INTERVAL, - initial_sleep: float = DEFAULT_INITIAL_SLEEP, - ) -> "ChatActionSender": - """Create instance of the sender with `typing` action""" - return cls( - bot=bot, - chat_id=chat_id, - message_thread_id=message_thread_id, - action="typing", - interval=interval, - initial_sleep=initial_sleep, - ) - - @classmethod - def upload_photo( - cls, - chat_id: Union[int, str], - bot: Bot, - message_thread_id: Optional[int] = None, - interval: float = DEFAULT_INTERVAL, - initial_sleep: float = DEFAULT_INITIAL_SLEEP, - ) -> "ChatActionSender": - """Create instance of the sender with `upload_photo` action""" - return cls( - bot=bot, - chat_id=chat_id, - message_thread_id=message_thread_id, - action="upload_photo", - interval=interval, - initial_sleep=initial_sleep, - ) - - @classmethod - def record_video( - cls, - chat_id: Union[int, str], - bot: Bot, - message_thread_id: Optional[int] = None, - interval: float = DEFAULT_INTERVAL, - initial_sleep: float = DEFAULT_INITIAL_SLEEP, - ) -> "ChatActionSender": - """Create instance of the sender with `record_video` action""" - return cls( - bot=bot, - chat_id=chat_id, - message_thread_id=message_thread_id, - action="record_video", - interval=interval, - initial_sleep=initial_sleep, - ) - - @classmethod - def upload_video( - cls, - chat_id: Union[int, str], - bot: Bot, - message_thread_id: Optional[int] = None, - interval: float = DEFAULT_INTERVAL, - initial_sleep: float = DEFAULT_INITIAL_SLEEP, - ) -> "ChatActionSender": - """Create instance of the sender with `upload_video` action""" - return cls( - bot=bot, - chat_id=chat_id, - message_thread_id=message_thread_id, - action="upload_video", - interval=interval, - initial_sleep=initial_sleep, - ) - - @classmethod - def record_voice( - cls, - chat_id: Union[int, str], - bot: Bot, - message_thread_id: Optional[int] = None, - interval: float = DEFAULT_INTERVAL, - initial_sleep: float = DEFAULT_INITIAL_SLEEP, - ) -> "ChatActionSender": - """Create instance of the sender with `record_voice` action""" - return cls( - bot=bot, - chat_id=chat_id, - message_thread_id=message_thread_id, - action="record_voice", - interval=interval, - initial_sleep=initial_sleep, - ) - - @classmethod - def upload_voice( - cls, - chat_id: Union[int, str], - bot: Bot, - message_thread_id: Optional[int] = None, - interval: float = DEFAULT_INTERVAL, - initial_sleep: float = DEFAULT_INITIAL_SLEEP, - ) -> "ChatActionSender": - """Create instance of the sender with `upload_voice` action""" - return cls( - bot=bot, - chat_id=chat_id, - message_thread_id=message_thread_id, - action="upload_voice", - interval=interval, - initial_sleep=initial_sleep, - ) - - @classmethod - def upload_document( - cls, - chat_id: Union[int, str], - bot: Bot, - message_thread_id: Optional[int] = None, - interval: float = DEFAULT_INTERVAL, - initial_sleep: float = DEFAULT_INITIAL_SLEEP, - ) -> "ChatActionSender": - """Create instance of the sender with `upload_document` action""" - return cls( - bot=bot, - chat_id=chat_id, - message_thread_id=message_thread_id, - action="upload_document", - interval=interval, - initial_sleep=initial_sleep, - ) - - @classmethod - def choose_sticker( - cls, - chat_id: Union[int, str], - bot: Bot, - message_thread_id: Optional[int] = None, - interval: float = DEFAULT_INTERVAL, - initial_sleep: float = DEFAULT_INITIAL_SLEEP, - ) -> "ChatActionSender": - """Create instance of the sender with `choose_sticker` action""" - return cls( - bot=bot, - chat_id=chat_id, - message_thread_id=message_thread_id, - action="choose_sticker", - interval=interval, - initial_sleep=initial_sleep, - ) - - @classmethod - def find_location( - cls, - chat_id: Union[int, str], - bot: Bot, - message_thread_id: Optional[int] = None, - interval: float = DEFAULT_INTERVAL, - initial_sleep: float = DEFAULT_INITIAL_SLEEP, - ) -> "ChatActionSender": - """Create instance of the sender with `find_location` action""" - return cls( - bot=bot, - chat_id=chat_id, - message_thread_id=message_thread_id, - action="find_location", - interval=interval, - initial_sleep=initial_sleep, - ) - - @classmethod - def record_video_note( - cls, - chat_id: Union[int, str], - bot: Bot, - message_thread_id: Optional[int] = None, - interval: float = DEFAULT_INTERVAL, - initial_sleep: float = DEFAULT_INITIAL_SLEEP, - ) -> "ChatActionSender": - """Create instance of the sender with `record_video_note` action""" - return cls( - bot=bot, - chat_id=chat_id, - message_thread_id=message_thread_id, - action="record_video_note", - interval=interval, - initial_sleep=initial_sleep, - ) - - @classmethod - def upload_video_note( - cls, - chat_id: Union[int, str], - bot: Bot, - message_thread_id: Optional[int] = None, - interval: float = DEFAULT_INTERVAL, - initial_sleep: float = DEFAULT_INITIAL_SLEEP, - ) -> "ChatActionSender": - """Create instance of the sender with `upload_video_note` action""" - return cls( - bot=bot, - chat_id=chat_id, - message_thread_id=message_thread_id, - action="upload_video_note", - interval=interval, - initial_sleep=initial_sleep, - ) - - -class ChatActionMiddleware(BaseMiddleware): - """ - Helps to automatically use chat action sender for all message handlers - """ - - async def __call__( - self, - handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]], - event: TelegramObject, - data: Dict[str, Any], - ) -> Any: - if not isinstance(event, Message): - return await handler(event, data) - bot = data["bot"] - - chat_action = get_flag(data, "chat_action") or "typing" - kwargs = {} - if isinstance(chat_action, dict): - if initial_sleep := chat_action.get("initial_sleep"): - kwargs["initial_sleep"] = initial_sleep - if interval := chat_action.get("interval"): - kwargs["interval"] = interval - if action := chat_action.get("action"): - kwargs["action"] = action - elif isinstance(chat_action, bool): - kwargs["action"] = "typing" - else: - kwargs["action"] = chat_action - kwargs["message_thread_id"] = ( - event.message_thread_id - if isinstance(event, Message) and event.is_topic_message - else None - ) - async with ChatActionSender(bot=bot, chat_id=event.chat.id, **kwargs): - return await handler(event, data) diff --git a/env/Lib/site-packages/aiogram/utils/chat_member.py b/env/Lib/site-packages/aiogram/utils/chat_member.py deleted file mode 100644 index 7ac666c..0000000 --- a/env/Lib/site-packages/aiogram/utils/chat_member.py +++ /dev/null @@ -1,37 +0,0 @@ -from typing import Tuple, Type, Union - -from pydantic import Field, TypeAdapter -from typing_extensions import Annotated - -from aiogram.types import ( - ChatMember, - ChatMemberAdministrator, - ChatMemberBanned, - ChatMemberLeft, - ChatMemberMember, - ChatMemberOwner, - ChatMemberRestricted, -) - -ChatMemberUnion = Union[ - ChatMemberOwner, - ChatMemberAdministrator, - ChatMemberMember, - ChatMemberRestricted, - ChatMemberLeft, - ChatMemberBanned, -] - -ChatMemberCollection = Tuple[Type[ChatMember], ...] - -ChatMemberAdapter: TypeAdapter[ChatMemberUnion] = TypeAdapter( - Annotated[ - ChatMemberUnion, - Field(discriminator="status"), - ] -) - -ADMINS: ChatMemberCollection = (ChatMemberOwner, ChatMemberAdministrator) -USERS: ChatMemberCollection = (ChatMemberMember, ChatMemberRestricted) -MEMBERS: ChatMemberCollection = ADMINS + USERS -NOT_MEMBERS: ChatMemberCollection = (ChatMemberLeft, ChatMemberBanned) diff --git a/env/Lib/site-packages/aiogram/utils/deep_linking.py b/env/Lib/site-packages/aiogram/utils/deep_linking.py deleted file mode 100644 index 19cc64c..0000000 --- a/env/Lib/site-packages/aiogram/utils/deep_linking.py +++ /dev/null @@ -1,112 +0,0 @@ -from __future__ import annotations - -__all__ = [ - "create_start_link", - "create_startgroup_link", - "create_deep_link", - "create_telegram_link", - "encode_payload", - "decode_payload", -] - -import re -from typing import TYPE_CHECKING, Callable, Literal, Optional, cast - -from aiogram.utils.link import create_telegram_link -from aiogram.utils.payload import decode_payload, encode_payload - -if TYPE_CHECKING: - from aiogram import Bot - -BAD_PATTERN = re.compile(r"[^A-z0-9-]") - - -async def create_start_link( - bot: Bot, - payload: str, - encode: bool = False, - encoder: Optional[Callable[[bytes], bytes]] = None, -) -> str: - """ - Create 'start' deep link with your payload. - - If you need to encode payload or pass special characters - - set encode as True - - :param bot: bot instance - :param payload: args passed with /start - :param encode: encode payload with base64url or custom encoder - :param encoder: custom encoder callable - :return: link - """ - username = (await bot.me()).username - return create_deep_link( - username=cast(str, username), - link_type="start", - payload=payload, - encode=encode, - encoder=encoder, - ) - - -async def create_startgroup_link( - bot: Bot, - payload: str, - encode: bool = False, - encoder: Optional[Callable[[bytes], bytes]] = None, -) -> str: - """ - Create 'startgroup' deep link with your payload. - - If you need to encode payload or pass special characters - - set encode as True - - :param bot: bot instance - :param payload: args passed with /start - :param encode: encode payload with base64url or custom encoder - :param encoder: custom encoder callable - :return: link - """ - username = (await bot.me()).username - return create_deep_link( - username=cast(str, username), - link_type="startgroup", - payload=payload, - encode=encode, - encoder=encoder, - ) - - -def create_deep_link( - username: str, - link_type: Literal["start", "startgroup"], - payload: str, - encode: bool = False, - encoder: Optional[Callable[[bytes], bytes]] = None, -) -> str: - """ - Create deep link. - - :param username: - :param link_type: `start` or `startgroup` - :param payload: any string-convertible data - :param encode: encode payload with base64url or custom encoder - :param encoder: custom encoder callable - :return: deeplink - """ - if not isinstance(payload, str): - payload = str(payload) - - if encode or encoder: - payload = encode_payload(payload, encoder=encoder) - - if re.search(BAD_PATTERN, payload): - raise ValueError( - "Wrong payload! Only A-Z, a-z, 0-9, _ and - are allowed. " - "Pass `encode=True` or encode payload manually." - ) - - if len(payload) > 64: - raise ValueError("Payload must be up to 64 characters long.") - - return create_telegram_link(username, **{cast(str, link_type): payload}) diff --git a/env/Lib/site-packages/aiogram/utils/formatting.py b/env/Lib/site-packages/aiogram/utils/formatting.py deleted file mode 100644 index 929afc0..0000000 --- a/env/Lib/site-packages/aiogram/utils/formatting.py +++ /dev/null @@ -1,632 +0,0 @@ -import textwrap -from typing import ( - Any, - ClassVar, - Dict, - Generator, - Iterable, - Iterator, - List, - Optional, - Tuple, - Type, -) - -from typing_extensions import Self - -from aiogram.enums import MessageEntityType -from aiogram.types import MessageEntity, User -from aiogram.utils.text_decorations import ( - add_surrogates, - html_decoration, - markdown_decoration, - remove_surrogates, -) - -NodeType = Any - - -def sizeof(value: str) -> int: - return len(value.encode("utf-16-le")) // 2 - - -class Text(Iterable[NodeType]): - """ - Simple text element - """ - - type: ClassVar[Optional[str]] = None - - __slots__ = ("_body", "_params") - - def __init__( - self, - *body: NodeType, - **params: Any, - ) -> None: - self._body: Tuple[NodeType, ...] = body - self._params: Dict[str, Any] = params - - @classmethod - def from_entities(cls, text: str, entities: List[MessageEntity]) -> "Text": - return cls( - *_unparse_entities( - text=add_surrogates(text), - entities=sorted(entities, key=lambda item: item.offset) if entities else [], - ) - ) - - def render( - self, - *, - _offset: int = 0, - _sort: bool = True, - _collect_entities: bool = True, - ) -> Tuple[str, List[MessageEntity]]: - """ - Render elements tree as text with entities list - - :return: - """ - - text = "" - entities = [] - offset = _offset - - for node in self._body: - if not isinstance(node, Text): - node = str(node) - text += node - offset += sizeof(node) - else: - node_text, node_entities = node.render( - _offset=offset, - _sort=False, - _collect_entities=_collect_entities, - ) - text += node_text - offset += sizeof(node_text) - if _collect_entities: - entities.extend(node_entities) - - if _collect_entities and self.type: - entities.append(self._render_entity(offset=_offset, length=offset - _offset)) - - if _collect_entities and _sort: - entities.sort(key=lambda entity: entity.offset) - - return text, entities - - def _render_entity(self, *, offset: int, length: int) -> MessageEntity: - assert self.type is not None, "Node without type can't be rendered as entity" - return MessageEntity(type=self.type, offset=offset, length=length, **self._params) - - def as_kwargs( - self, - *, - text_key: str = "text", - entities_key: str = "entities", - replace_parse_mode: bool = True, - parse_mode_key: str = "parse_mode", - ) -> Dict[str, Any]: - """ - Render elements tree as keyword arguments for usage in the API call, for example: - - .. code-block:: python - - entities = Text(...) - await message.answer(**entities.as_kwargs()) - - :param text_key: - :param entities_key: - :param replace_parse_mode: - :param parse_mode_key: - :return: - """ - text_value, entities_value = self.render() - result: Dict[str, Any] = { - text_key: text_value, - entities_key: entities_value, - } - if replace_parse_mode: - result[parse_mode_key] = None - return result - - def as_html(self) -> str: - """ - Render elements tree as HTML markup - """ - text, entities = self.render() - return html_decoration.unparse(text, entities) - - def as_markdown(self) -> str: - """ - Render elements tree as MarkdownV2 markup - """ - text, entities = self.render() - return markdown_decoration.unparse(text, entities) - - def replace(self: Self, *args: Any, **kwargs: Any) -> Self: - return type(self)(*args, **{**self._params, **kwargs}) - - def as_pretty_string(self, indent: bool = False) -> str: - sep = ",\n" if indent else ", " - body = sep.join( - item.as_pretty_string(indent=indent) if isinstance(item, Text) else repr(item) - for item in self._body - ) - params = sep.join(f"{k}={v!r}" for k, v in self._params.items() if v is not None) - - args = [] - if body: - args.append(body) - if params: - args.append(params) - - args_str = sep.join(args) - if indent: - args_str = textwrap.indent("\n" + args_str + "\n", " ") - return f"{type(self).__name__}({args_str})" - - def __add__(self, other: NodeType) -> "Text": - if isinstance(other, Text) and other.type == self.type and self._params == other._params: - return type(self)(*self, *other, **self._params) - if type(self) is Text and isinstance(other, str): - return type(self)(*self, other, **self._params) - return Text(self, other) - - def __iter__(self) -> Iterator[NodeType]: - yield from self._body - - def __len__(self) -> int: - text, _ = self.render(_collect_entities=False) - return sizeof(text) - - def __getitem__(self, item: slice) -> "Text": - if not isinstance(item, slice): - raise TypeError("Can only be sliced") - if (item.start is None or item.start == 0) and item.stop is None: - return self.replace(*self._body) - start = 0 if item.start is None else item.start - stop = len(self) if item.stop is None else item.stop - if start == stop: - return self.replace() - - nodes = [] - position = 0 - - for node in self._body: - node_size = len(node) - current_position = position - position += node_size - if position < start: - continue - if current_position > stop: - break - a = max((0, start - current_position)) - b = min((node_size, stop - current_position)) - new_node = node[a:b] - if not new_node: - continue - nodes.append(new_node) - - return self.replace(*nodes) - - -class HashTag(Text): - """ - Hashtag element. - - .. warning:: - - The value should always start with '#' symbol - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.HASHTAG` - """ - - type = MessageEntityType.HASHTAG - - def __init__(self, *body: NodeType, **params: Any) -> None: - if len(body) != 1: - raise ValueError("Hashtag can contain only one element") - if not isinstance(body[0], str): - raise ValueError("Hashtag can contain only string") - if not body[0].startswith("#"): - body = ("#" + body[0],) - super().__init__(*body, **params) - - -class CashTag(Text): - """ - Cashtag element. - - .. warning:: - - The value should always start with '$' symbol - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.CASHTAG` - """ - - type = MessageEntityType.CASHTAG - - def __init__(self, *body: NodeType, **params: Any) -> None: - if len(body) != 1: - raise ValueError("Cashtag can contain only one element") - if not isinstance(body[0], str): - raise ValueError("Cashtag can contain only string") - if not body[0].startswith("$"): - body = ("$" + body[0],) - super().__init__(*body, **params) - - -class BotCommand(Text): - """ - Bot command element. - - .. warning:: - - The value should always start with '/' symbol - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.BOT_COMMAND` - """ - - type = MessageEntityType.BOT_COMMAND - - -class Url(Text): - """ - Url element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.URL` - """ - - type = MessageEntityType.URL - - -class Email(Text): - """ - Email element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.EMAIL` - """ - - type = MessageEntityType.EMAIL - - -class PhoneNumber(Text): - """ - Phone number element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.PHONE_NUMBER` - """ - - type = MessageEntityType.PHONE_NUMBER - - -class Bold(Text): - """ - Bold element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.BOLD` - """ - - type = MessageEntityType.BOLD - - -class Italic(Text): - """ - Italic element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.ITALIC` - """ - - type = MessageEntityType.ITALIC - - -class Underline(Text): - """ - Underline element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.UNDERLINE` - """ - - type = MessageEntityType.UNDERLINE - - -class Strikethrough(Text): - """ - Strikethrough element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.STRIKETHROUGH` - """ - - type = MessageEntityType.STRIKETHROUGH - - -class Spoiler(Text): - """ - Spoiler element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.SPOILER` - """ - - type = MessageEntityType.SPOILER - - -class Code(Text): - """ - Code element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.CODE` - """ - - type = MessageEntityType.CODE - - -class Pre(Text): - """ - Pre element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.PRE` - """ - - type = MessageEntityType.PRE - - def __init__(self, *body: NodeType, language: Optional[str] = None, **params: Any) -> None: - super().__init__(*body, language=language, **params) - - -class TextLink(Text): - """ - Text link element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.TEXT_LINK` - """ - - type = MessageEntityType.TEXT_LINK - - def __init__(self, *body: NodeType, url: str, **params: Any) -> None: - super().__init__(*body, url=url, **params) - - -class TextMention(Text): - """ - Text mention element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.TEXT_MENTION` - """ - - type = MessageEntityType.TEXT_MENTION - - def __init__(self, *body: NodeType, user: User, **params: Any) -> None: - super().__init__(*body, user=user, **params) - - -class CustomEmoji(Text): - """ - Custom emoji element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.CUSTOM_EMOJI` - """ - - type = MessageEntityType.CUSTOM_EMOJI - - def __init__(self, *body: NodeType, custom_emoji_id: str, **params: Any) -> None: - super().__init__(*body, custom_emoji_id=custom_emoji_id, **params) - - -class BlockQuote(Text): - """ - Block quote element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.BLOCKQUOTE` - """ - - type = MessageEntityType.BLOCKQUOTE - - -class ExpandableBlockQuote(Text): - """ - Expandable block quote element. - - Will be wrapped into :obj:`aiogram.types.message_entity.MessageEntity` - with type :obj:`aiogram.enums.message_entity_type.MessageEntityType.EXPANDABLE_BLOCKQUOTE` - """ - - type = MessageEntityType.EXPANDABLE_BLOCKQUOTE - - -NODE_TYPES: Dict[Optional[str], Type[Text]] = { - Text.type: Text, - HashTag.type: HashTag, - CashTag.type: CashTag, - BotCommand.type: BotCommand, - Url.type: Url, - Email.type: Email, - PhoneNumber.type: PhoneNumber, - Bold.type: Bold, - Italic.type: Italic, - Underline.type: Underline, - Strikethrough.type: Strikethrough, - Spoiler.type: Spoiler, - Code.type: Code, - Pre.type: Pre, - TextLink.type: TextLink, - TextMention.type: TextMention, - CustomEmoji.type: CustomEmoji, - BlockQuote.type: BlockQuote, - ExpandableBlockQuote.type: ExpandableBlockQuote, -} - - -def _apply_entity(entity: MessageEntity, *nodes: NodeType) -> NodeType: - """ - Apply single entity to text - - :param entity: - :param text: - :return: - """ - node_type = NODE_TYPES.get(entity.type, Text) - return node_type( - *nodes, **entity.model_dump(exclude={"type", "offset", "length"}, warnings=False) - ) - - -def _unparse_entities( - text: bytes, - entities: List[MessageEntity], - offset: Optional[int] = None, - length: Optional[int] = None, -) -> Generator[NodeType, None, None]: - if offset is None: - offset = 0 - length = length or len(text) - - for index, entity in enumerate(entities): - if entity.offset * 2 < offset: - continue - if entity.offset * 2 > offset: - yield remove_surrogates(text[offset : entity.offset * 2]) - start = entity.offset * 2 - offset = entity.offset * 2 + entity.length * 2 - - sub_entities = list(filter(lambda e: e.offset * 2 < (offset or 0), entities[index + 1 :])) - yield _apply_entity( - entity, - *_unparse_entities(text, sub_entities, offset=start, length=offset), - ) - - if offset < length: - yield remove_surrogates(text[offset:length]) - - -def as_line(*items: NodeType, end: str = "\n", sep: str = "") -> Text: - """ - Wrap multiple nodes into line with :code:`\\\\n` at the end of line. - - :param items: Text or Any - :param end: ending of the line, by default is :code:`\\\\n` - :param sep: separator between items, by default is empty string - :return: Text - """ - if sep: - nodes = [] - for item in items[:-1]: - nodes.extend([item, sep]) - nodes.append(items[-1]) - nodes.append(end) - else: - nodes = [*items, end] - return Text(*nodes) - - -def as_list(*items: NodeType, sep: str = "\n") -> Text: - """ - Wrap each element to separated lines - - :param items: - :param sep: - :return: - """ - nodes = [] - for item in items[:-1]: - nodes.extend([item, sep]) - nodes.append(items[-1]) - return Text(*nodes) - - -def as_marked_list(*items: NodeType, marker: str = "- ") -> Text: - """ - Wrap elements as marked list - - :param items: - :param marker: line marker, by default is '- ' - :return: Text - """ - return as_list(*(Text(marker, item) for item in items)) - - -def as_numbered_list(*items: NodeType, start: int = 1, fmt: str = "{}. ") -> Text: - """ - Wrap elements as numbered list - - :param items: - :param start: initial number, by default 1 - :param fmt: number format, by default '{}. ' - :return: Text - """ - return as_list(*(Text(fmt.format(index), item) for index, item in enumerate(items, start))) - - -def as_section(title: NodeType, *body: NodeType) -> Text: - """ - Wrap elements as simple section, section has title and body - - :param title: - :param body: - :return: Text - """ - return Text(title, "\n", *body) - - -def as_marked_section( - title: NodeType, - *body: NodeType, - marker: str = "- ", -) -> Text: - """ - Wrap elements as section with marked list - - :param title: - :param body: - :param marker: - :return: - """ - return as_section(title, as_marked_list(*body, marker=marker)) - - -def as_numbered_section( - title: NodeType, - *body: NodeType, - start: int = 1, - fmt: str = "{}. ", -) -> Text: - """ - Wrap elements as section with numbered list - - :param title: - :param body: - :param start: - :param fmt: - :return: - """ - return as_section(title, as_numbered_list(*body, start=start, fmt=fmt)) - - -def as_key_value(key: NodeType, value: NodeType) -> Text: - """ - Wrap elements pair as key-value line. (:code:`{key}: {value}`) - - :param key: - :param value: - :return: Text - """ - return Text(Bold(key, ":"), " ", value) diff --git a/env/Lib/site-packages/aiogram/utils/i18n/__init__.py b/env/Lib/site-packages/aiogram/utils/i18n/__init__.py deleted file mode 100644 index e48a4c7..0000000 --- a/env/Lib/site-packages/aiogram/utils/i18n/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -from .context import get_i18n, gettext, lazy_gettext, lazy_ngettext, ngettext -from .core import I18n -from .middleware import ( - ConstI18nMiddleware, - FSMI18nMiddleware, - I18nMiddleware, - SimpleI18nMiddleware, -) - -__all__ = ( - "I18n", - "I18nMiddleware", - "SimpleI18nMiddleware", - "ConstI18nMiddleware", - "FSMI18nMiddleware", - "gettext", - "lazy_gettext", - "ngettext", - "lazy_ngettext", - "get_i18n", -) diff --git a/env/Lib/site-packages/aiogram/utils/i18n/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/i18n/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 2c2b941027786f5c1f18db4c4f7e95db40bd3671..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 665 zcmbV}Jxc>I7{`-)>0R&If-m?TZqVW;A})%cSRFbD;UJv7SVEIa$)#$Y9Q_6kegN?c zh#$hiQL;L@72G*&YnGNSld>j~Y3v!S{ z1~^2JJILWKa=C{*?js-CJ%`nJfPzZ9EaY`m=Mjo{jAGtE4HNfJGxxh7slA(8-)&xQsh$U2FtF-c;=dwD`qyFsRU|o-<(T4y|g2WQd!fXdCtg1CW&6y>vn#H zTEF~qm+~PaKch(`L(`g!EgBYe3;RUUv+ykfi<*UNaFn!k&=ZAizY5G{R!KHpdp#jZ zRa{5>yV1Gw-&g7Y38u%po9T&=gLFsawCJaUk<65k_*AHr6zAz7Jxxoh z$m%fb4YEEd(~OF~%y@gGC@b64yiFTpT2O`Y+HgD#x46hhjBLwgQ{VnYd1EkfA%w4> e^YXX#3RYfzu8HGAX9E6*RvbImft_;EH1i1sLb9Cz diff --git a/env/Lib/site-packages/aiogram/utils/i18n/__pycache__/context.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/i18n/__pycache__/context.cpython-311.pyc deleted file mode 100644 index a5d7d57b98c12def1c78f8d7600c96441d08d352..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1287 zcmZuw&1(}u6rb7MB%5xM7Aq}&R01lPiYd|@N)f?+2x19R3qlBlZFU;hB)egDQkxPX zh!;Vn7iqyu5veWpEZ+PFJZzzduuu>@c`NkRlke@OZ6ck_{N9`2eC%)Dd-)oV_Yr8{ zKmA&|DG~AqCnqi3agLV2StkZDXoXa1j#Bicid26c$+u8!B*W7Z(C93S5+_xjq)nX-3~ulG6U-M^n_3A6N}A%A>mz7TD;VzS?-g z?UjZX=1kPNRqUwqjSPt6XdYml2)8=fuT(8aI zNqmwCXC2g#JkHKc=AYTToS(K0(<AW7Zz=iXV!9l&RonpreJq!da&Qsg8lH;ZMUuzi{s;^w4bUP7TK~RwWplyRM)$PQeQmTg(~fAZ z=0W0;dwF~>k=ajVTs70y`dg2W-~{m$otGRhTz-kRC)gOSei%m?fOR7EgnJ9PT^K<- z3x1QBq)ETf4-~>lvnk0}=tV#<#&AdCcqJbIaG(%LGRb2|TsVOQu3Q6Xk+wGSe&X%q zyUBfRWJ9=GdUF{7yOQR(uSYJHahKfg+7S4qPAfsCKhyb+OoJMdc_LTNdNF3{ixpNV z>c!{mA*jb71mXt4>z3@rDp0G1&cpZ+EaM}b+W?q|iyxo4+7#-Z3OcGs_s8rhEM+YiGE9ay_@ zNWlCL2};M-#t#XY&Fj9|4vg=2flBE#-H?%)rkhS+w;O>y2UQXqY^m*mtF1Wx{0II6 DCx|rI diff --git a/env/Lib/site-packages/aiogram/utils/i18n/__pycache__/core.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/i18n/__pycache__/core.cpython-311.pyc deleted file mode 100644 index 63f7bada35938bceaea4100f4c5834a0b5586819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6572 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 diff --git a/env/Lib/site-packages/aiogram/utils/i18n/__pycache__/lazy_proxy.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/i18n/__pycache__/lazy_proxy.cpython-311.pyc deleted file mode 100644 index 249c914409da3a4154b301ecd3ee50c2a113ce0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1058 zcmZ`%y=xRv5TCanm&=(u%>@)Je@ZC0Tt#hB=v#Z>tjvvLg>vC3jltl5!96GP9 zg-&>UZOx#8ptch|5}=e5tD_ z(~rr4s?C%R0ig?8vD8B^7`i;iw>@rIX~D9*fF-Wfr!4DLV!H#6kV6wCgl{0^@I+C9 zyj=$J!qFna*7)lx`efv%xF-;buSly|vv@V-2&ekQZ(KgZS%MF0Q* diff --git a/env/Lib/site-packages/aiogram/utils/i18n/__pycache__/middleware.cpython-311.pyc b/env/Lib/site-packages/aiogram/utils/i18n/__pycache__/middleware.cpython-311.pyc deleted file mode 100644 index d50288524362053f480d70ed167cc3b3580ee819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10034 zcmcIKTWlNIb$2*Ja`+ZSy`K|FHcVNP*Xyjk(fYBrWZ7P?6=b!JYgW57#Ti+&`A}v? zekgR;sojoHo68{6x$*|wVQtABS0yEsEH{I7$^#~U!^M-Fc$sj zId?e2;X|$)pjX2)_i^r>`#A5bU-*1(0_ksl`rG;cY$N1fuwW!dIkPp)5OSA@L}ZdA z#YC8tEn;J^Y)i5!F2bek5qruJaip9PXNr&TDObeB5Eo*wNq5Q<@ua*FFGJGZgGBNT z5jh0CxroO`P7u+4n}`m{e~%^P0sQn7@t!AX?kc&)o+nos7{{3mq?#g4sbC~Xzsx6_ zQ=tfsLqu1yCDj^fO|?bZXxW`?Pjy5(7(&PQ!1!LNNn-AC@CEplztBlrebDNcI%~e( zMcV?<)>PNlP1}Od)+}|^^y?A184?ctJANW;)7YcOCNzI+PEqApTun*pLPiWbpgMhB za~-`JOQ^BAq@?i^v1F3wxXDCZ)%b5Ns)^p)9n6LYglLX}1r zWAV$ei;^-MOJpv}vDBU=HIY>IB=)|U-jhm*Vp6&qlcll6>vR?rxZndy0KiT2ugH6I zoZJj`6a$v-KNeG@Gv)xA9+b5G5jnaHG7=^Ad4|9vSb;fKFDcS(Xh%`d@n%sa&3ZSEed;eolDNJw-7MYL#s+?~qqE)Ti|NJq;AD`2Z&IX&8{ad@a& z0AaM!sPVMovUFYZS8AhJcF2;tB&Vn2CiB5eZ16*N-+B$eU6N(8Bnmk_Wo=M0h?!(r zC?P&gIx#Q*Bb^LRcS4q8swBkHLL#lGv2*fCMk81*3KNa;wp9s@bVS=Msi$%@6OXl zXS_ii)ge!U@o$`wPgx(b;bLRr9b2siw6XHqo}gWNklZZm?PA zl8Luw9;h)azN`CAk`MZ40q+KP!=B}`>=hz2EAFg)%{m*idzRdT(I1#!V91J)B|zuw z@-6d}-jgmS6c8YmBcNvr5?GL~NNH68!VuI2NzesN9r5TJGj0x8rm6BiS?YD7uT)HH zj-^ErC>73?RU}n&W#&LeU6Eu(vx5jtDOwZVbPH339Wow=yaT~b0Ghx2p{PDt%}w7_ zo@=~0paW2mL<}Oa!}pdJms@Hmgw}=uS4jc@@@OI6Q0~Z+w$2|)cck2jV%I>vb9C(- zfSkWLG+Y?^`s1PT&7tv)p@W5?gC)YcMkv_u3b}Vy`C_1R^}~E%H$26rj-t2av3JL& zcgLEz;oV*E?#|Pv7zpJ&l+-lmLM#oMLDuYa6&eTI6RVOEPMFs%_-*|q9P4SqAi0q> zsHjgMGuVgBJs_6{CTZOQ^WeMex5-`hkGVxpmQ={^l8JMJgL;#oBao(+_C+x zFZZ*U{|1Bkam@eP%}w~7zYa10t8^B!Bo!p+?&yM~Y)JgQDat1$6--B=Oiuz(o-F9( zD$IcuDhipjt|P$K5DlwftfC=?hu^2lo!a?AYDrOrIY|H-Po$wUsFnCaA_*OnF-4J- z;o(Y8Ly4dQs%VUIEeb_TWu0D;gRms99;l`;`9eXFW+(s|cX7G1M*LUU@m*+Ed;rQU z&_-OovLOyU+yf1AFM#{Zbht%E-$F*aU2X!PIipcA6OTq^v|welu0g%2vOI*v76h#b zaNlLL^<E4o6XLb2m(JD z3>W+Mlw1M(Xo&!L>TfRDvEU$~?$v#FMoUgC@uagyM{*OlzvMB{X&)U7ku%J9>zP4R)>`{`BjQ*he#u z_=kt{UE`mhT95x~I^Xq9A$YoE2NalLQ(wu6Ii3VUAMaabKYnv1U21w3P+!|e}gmrAX^(YVKP_?gLcmM%fn zpEPopyf1f`a%7$Xm&q4#8txLfKkh0Q$04DU;sIC2lOxxdh!=E+PivV;q!yD>HOVf= zDYNQL_3jC6oLILd!X6qgcLbl#*E2pyn8 z?-g5I7GV9=4h+&Q^4J!t^B*&J$@VtznrRRKs+n}<4JHeWQi*&pL`4=Tr<+46vP(Is z#&JNo*4n*fni@ZaxXjON)#kzf)d~hKQ@en&8N@aoJf$3@9_mAR3{^tZhiEuuDi6!2y++m%=O!-`; zo$%~#!Eb93C`H#!Dinl*!CPa$ z=ghJdy1MBFGu1RsFPU^X15pzz?O#H%PLs8_$Ufw1zQCn>28r5iU=sq7!2mUe8+;{h zI}a3WL zUKt0LParsn0Lf8fL4#^OL(oJ~(CEVB0Jhp8+5n?q)J@|JBrO=b5=+o%pJA{XRBe)m zd>XqrbkoBmY2Dw~HF=T2JMs za#Js!1ipp_AGnJKu=Ld(L$qE;(8hESZ}Z9#w1f)-hw>hLEXc(`>&i!YzE45I`J$`) z=zj9W{4bhxkZu^%(L*@`VheHq|d<>&vNzpoQ5{da0BY$`!-zRd78G_RZ99KY$*}9ssD{{Qrx7E4KAOSkRM$zn7^im_Sa5*hUUFiN zH{1;umfYxWP;@W48$PVVjtxNzWA8=|hnJPZp@Y&3~1 z@Uk6v987b`ZsBn!)bXOL%;Rp#;~wB~FYq|rfmE6GykwtuP+8!+?Stb#iJRneGlKch?1J=eqcmX|3!%O2)B4PwcrbICXb<_mZJo;q5}~X~XoRSzo}MZa`4`Yd*#z*SERsiF`|RW|Pd+-g zF>Uwhm(y4g1RX!5U5em5)L^0`5=9*57E~v0G)Mk2g1D?8=H&E zNX;~it2rQY1OGK*3Gt%X(ZjxU*U^X9>~k1((j9E-EPGC+Fm9wre_Y3}#U=XxFq*R* zI;upKwNSZg45ZtbA@A_WG@sFe(IZ87^YA8IYd0F`f2fRM7z%pIlI|VSDDwo)lG=jw zcrm`NFEa$WulR%d|I8egzXL_&dgY%0g8RxaMKYLg^c2b4`TxsP;v9^x$i0@|=6O+c zHiL`F_$r|23*MY6af}`6>cQ%HxR I18n: - i18n = I18n.get_current(no_error=True) - if i18n is None: - raise LookupError("I18n context is not set") - return i18n - - -def gettext(*args: Any, **kwargs: Any) -> str: - return get_i18n().gettext(*args, **kwargs) - - -def lazy_gettext(*args: Any, **kwargs: Any) -> LazyProxy: - return LazyProxy(gettext, *args, **kwargs, enable_cache=False) - - -ngettext = gettext -lazy_ngettext = lazy_gettext diff --git a/env/Lib/site-packages/aiogram/utils/i18n/core.py b/env/Lib/site-packages/aiogram/utils/i18n/core.py deleted file mode 100644 index db7c797..0000000 --- a/env/Lib/site-packages/aiogram/utils/i18n/core.py +++ /dev/null @@ -1,123 +0,0 @@ -import gettext -import os -from contextlib import contextmanager -from contextvars import ContextVar -from pathlib import Path -from typing import Dict, Generator, Optional, Tuple, Union - -from aiogram.utils.i18n.lazy_proxy import LazyProxy -from aiogram.utils.mixins import ContextInstanceMixin - - -class I18n(ContextInstanceMixin["I18n"]): - def __init__( - self, - *, - path: Union[str, Path], - default_locale: str = "en", - domain: str = "messages", - ) -> None: - self.path = path - self.default_locale = default_locale - self.domain = domain - self.ctx_locale = ContextVar("aiogram_ctx_locale", default=default_locale) - self.locales = self.find_locales() - - @property - def current_locale(self) -> str: - return self.ctx_locale.get() - - @current_locale.setter - def current_locale(self, value: str) -> None: - self.ctx_locale.set(value) - - @contextmanager - def use_locale(self, locale: str) -> Generator[None, None, None]: - """ - Create context with specified locale - """ - ctx_token = self.ctx_locale.set(locale) - try: - yield - finally: - self.ctx_locale.reset(ctx_token) - - @contextmanager - def context(self) -> Generator["I18n", None, None]: - """ - Use I18n context - """ - token = self.set_current(self) - try: - yield self - finally: - self.reset_current(token) - - def find_locales(self) -> Dict[str, gettext.GNUTranslations]: - """ - Load all compiled locales from path - - :return: dict with locales - """ - translations: Dict[str, gettext.GNUTranslations] = {} - - for name in os.listdir(self.path): - if not os.path.isdir(os.path.join(self.path, name)): - continue - mo_path = os.path.join(self.path, name, "LC_MESSAGES", self.domain + ".mo") - - if os.path.exists(mo_path): - with open(mo_path, "rb") as fp: - translations[name] = gettext.GNUTranslations(fp) - elif os.path.exists(mo_path[:-2] + "po"): # pragma: no cover - raise RuntimeError(f"Found locale '{name}' but this language is not compiled!") - - return translations - - def reload(self) -> None: - """ - Hot reload locales - """ - self.locales = self.find_locales() - - @property - def available_locales(self) -> Tuple[str, ...]: - """ - list of loaded locales - - :return: - """ - return tuple(self.locales.keys()) - - def gettext( - self, singular: str, plural: Optional[str] = None, n: int = 1, locale: Optional[str] = None - ) -> str: - """ - Get text - - :param singular: - :param plural: - :param n: - :param locale: - :return: - """ - if locale is None: - locale = self.current_locale - - if locale not in self.locales: - if n == 1: - return singular - return plural if plural else singular - - translator = self.locales[locale] - - if plural is None: - return translator.gettext(singular) - return translator.ngettext(singular, plural, n) - - def lazy_gettext( - self, singular: str, plural: Optional[str] = None, n: int = 1, locale: Optional[str] = None - ) -> LazyProxy: - return LazyProxy( - self.gettext, singular=singular, plural=plural, n=n, locale=locale, enable_cache=False - ) diff --git a/env/Lib/site-packages/aiogram/utils/i18n/lazy_proxy.py b/env/Lib/site-packages/aiogram/utils/i18n/lazy_proxy.py deleted file mode 100644 index 6852540..0000000 --- a/env/Lib/site-packages/aiogram/utils/i18n/lazy_proxy.py +++ /dev/null @@ -1,13 +0,0 @@ -from typing import Any - -try: - from babel.support import LazyProxy -except ImportError: # pragma: no cover - - class LazyProxy: # type: ignore - def __init__(self, func: Any, *args: Any, **kwargs: Any) -> None: - raise RuntimeError( - "LazyProxy can be used only when Babel installed\n" - "Just install Babel (`pip install Babel`) " - "or aiogram with i18n support (`pip install aiogram[i18n]`)" - ) diff --git a/env/Lib/site-packages/aiogram/utils/i18n/middleware.py b/env/Lib/site-packages/aiogram/utils/i18n/middleware.py deleted file mode 100644 index 68be22b..0000000 --- a/env/Lib/site-packages/aiogram/utils/i18n/middleware.py +++ /dev/null @@ -1,187 +0,0 @@ -from abc import ABC, abstractmethod -from typing import Any, Awaitable, Callable, Dict, Optional, Set - -try: - from babel import Locale, UnknownLocaleError -except ImportError: # pragma: no cover - Locale = None # type: ignore - - class UnknownLocaleError(Exception): # type: ignore - pass - - -from aiogram import BaseMiddleware, Router -from aiogram.fsm.context import FSMContext -from aiogram.types import TelegramObject, User -from aiogram.utils.i18n.core import I18n - - -class I18nMiddleware(BaseMiddleware, ABC): - """ - Abstract I18n middleware. - """ - - def __init__( - self, - i18n: I18n, - i18n_key: Optional[str] = "i18n", - middleware_key: str = "i18n_middleware", - ) -> None: - """ - Create an instance of middleware - - :param i18n: instance of I18n - :param i18n_key: context key for I18n instance - :param middleware_key: context key for this middleware - """ - self.i18n = i18n - self.i18n_key = i18n_key - self.middleware_key = middleware_key - - def setup( - self: BaseMiddleware, router: Router, exclude: Optional[Set[str]] = None - ) -> BaseMiddleware: - """ - Register middleware for all events in the Router - - :param router: - :param exclude: - :return: - """ - if exclude is None: - exclude = set() - exclude_events = {"update", *exclude} - for event_name, observer in router.observers.items(): - if event_name in exclude_events: - continue - observer.outer_middleware(self) - return self - - async def __call__( - self, - handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]], - event: TelegramObject, - data: Dict[str, Any], - ) -> Any: - current_locale = await self.get_locale(event=event, data=data) or self.i18n.default_locale - - if self.i18n_key: - data[self.i18n_key] = self.i18n - if self.middleware_key: - data[self.middleware_key] = self - - with self.i18n.context(), self.i18n.use_locale(current_locale): - return await handler(event, data) - - @abstractmethod - async def get_locale(self, event: TelegramObject, data: Dict[str, Any]) -> str: - """ - Detect current user locale based on event and context. - - **This method must be defined in child classes** - - :param event: - :param data: - :return: - """ - pass - - -class SimpleI18nMiddleware(I18nMiddleware): - """ - Simple I18n middleware. - - Chooses language code from the User object received in event - """ - - def __init__( - self, - i18n: I18n, - i18n_key: Optional[str] = "i18n", - middleware_key: str = "i18n_middleware", - ) -> None: - super().__init__(i18n=i18n, i18n_key=i18n_key, middleware_key=middleware_key) - - if Locale is None: # pragma: no cover - raise RuntimeError( - f"{type(self).__name__} can be used only when Babel installed\n" - "Just install Babel (`pip install Babel`) " - "or aiogram with i18n support (`pip install aiogram[i18n]`)" - ) - - async def get_locale(self, event: TelegramObject, data: Dict[str, Any]) -> str: - if Locale is None: # pragma: no cover - raise RuntimeError( - f"{type(self).__name__} can be used only when Babel installed\n" - "Just install Babel (`pip install Babel`) " - "or aiogram with i18n support (`pip install aiogram[i18n]`)" - ) - - event_from_user: Optional[User] = data.get("event_from_user", None) - if event_from_user is None or event_from_user.language_code is None: - return self.i18n.default_locale - try: - locale = Locale.parse(event_from_user.language_code, sep="-") - except UnknownLocaleError: - return self.i18n.default_locale - - if locale.language not in self.i18n.available_locales: - return self.i18n.default_locale - return locale.language - - -class ConstI18nMiddleware(I18nMiddleware): - """ - Const middleware chooses statically defined locale - """ - - def __init__( - self, - locale: str, - i18n: I18n, - i18n_key: Optional[str] = "i18n", - middleware_key: str = "i18n_middleware", - ) -> None: - super().__init__(i18n=i18n, i18n_key=i18n_key, middleware_key=middleware_key) - self.locale = locale - - async def get_locale(self, event: TelegramObject, data: Dict[str, Any]) -> str: - return self.locale - - -class FSMI18nMiddleware(SimpleI18nMiddleware): - """ - This middleware stores locale in the FSM storage - """ - - def __init__( - self, - i18n: I18n, - key: str = "locale", - i18n_key: Optional[str] = "i18n", - middleware_key: str = "i18n_middleware", - ) -> None: - super().__init__(i18n=i18n, i18n_key=i18n_key, middleware_key=middleware_key) - self.key = key - - async def get_locale(self, event: TelegramObject, data: Dict[str, Any]) -> str: - fsm_context: Optional[FSMContext] = data.get("state") - locale = None - if fsm_context: - fsm_data = await fsm_context.get_data() - locale = fsm_data.get(self.key, None) - if not locale: - locale = await super().get_locale(event=event, data=data) - if fsm_context: - await fsm_context.update_data(data={self.key: locale}) - return locale - - async def set_locale(self, state: FSMContext, locale: str) -> None: - """ - Write new locale to the storage - - :param state: instance of FSMContext - :param locale: new locale - """ - await state.update_data(data={self.key: locale}) - self.i18n.current_locale = locale diff --git a/env/Lib/site-packages/aiogram/utils/keyboard.py b/env/Lib/site-packages/aiogram/utils/keyboard.py deleted file mode 100644 index 921c28c..0000000 --- a/env/Lib/site-packages/aiogram/utils/keyboard.py +++ /dev/null @@ -1,421 +0,0 @@ -from __future__ import annotations - -from abc import ABC -from copy import deepcopy -from itertools import chain -from itertools import cycle as repeat_all -from typing import ( - TYPE_CHECKING, - Any, - Generator, - Generic, - Iterable, - List, - Optional, - Type, - TypeVar, - Union, - cast, -) - -from aiogram.filters.callback_data import CallbackData -from aiogram.types import ( - CallbackGame, - InlineKeyboardButton, - InlineKeyboardMarkup, - KeyboardButton, - KeyboardButtonPollType, - KeyboardButtonRequestChat, - KeyboardButtonRequestUsers, - LoginUrl, - ReplyKeyboardMarkup, - SwitchInlineQueryChosenChat, - WebAppInfo, -) - -ButtonType = TypeVar("ButtonType", InlineKeyboardButton, KeyboardButton) -T = TypeVar("T") - - -class KeyboardBuilder(Generic[ButtonType], ABC): - """ - Generic keyboard builder that helps to adjust your markup with defined shape of lines. - - Works both of InlineKeyboardMarkup and ReplyKeyboardMarkup. - """ - - max_width: int = 0 - min_width: int = 0 - max_buttons: int = 0 - - def __init__( - self, button_type: Type[ButtonType], markup: Optional[List[List[ButtonType]]] = None - ) -> None: - if not issubclass(button_type, (InlineKeyboardButton, KeyboardButton)): - raise ValueError(f"Button type {button_type} are not allowed here") - self._button_type: Type[ButtonType] = button_type - if markup: - self._validate_markup(markup) - else: - markup = [] - self._markup: List[List[ButtonType]] = markup - - @property - def buttons(self) -> Generator[ButtonType, None, None]: - """ - Get flatten set of all buttons - - :return: - """ - yield from chain.from_iterable(self.export()) - - def _validate_button(self, button: ButtonType) -> bool: - """ - Check that button item has correct type - - :param button: - :return: - """ - allowed = self._button_type - if not isinstance(button, allowed): - raise ValueError( - f"{button!r} should be type {allowed.__name__!r} not {type(button).__name__!r}" - ) - return True - - def _validate_buttons(self, *buttons: ButtonType) -> bool: - """ - Check that all passed button has correct type - - :param buttons: - :return: - """ - return all(map(self._validate_button, buttons)) - - def _validate_row(self, row: List[ButtonType]) -> bool: - """ - Check that row of buttons are correct - Row can be only list of allowed button types and has length 0 <= n <= 8 - - :param row: - :return: - """ - if not isinstance(row, list): - raise ValueError( - f"Row {row!r} should be type 'List[{self._button_type.__name__}]' " - f"not type {type(row).__name__}" - ) - if len(row) > self.max_width: - raise ValueError(f"Row {row!r} is too long (max width: {self.max_width})") - self._validate_buttons(*row) - return True - - def _validate_markup(self, markup: List[List[ButtonType]]) -> bool: - """ - Check that passed markup has correct data structure - Markup is list of lists of buttons - - :param markup: - :return: - """ - count = 0 - if not isinstance(markup, list): - raise ValueError( - f"Markup should be type 'List[List[{self._button_type.__name__}]]' " - f"not type {type(markup).__name__!r}" - ) - for row in markup: - self._validate_row(row) - count += len(row) - if count > self.max_buttons: - raise ValueError(f"Too much buttons detected Max allowed count - {self.max_buttons}") - return True - - def _validate_size(self, size: Any) -> int: - """ - Validate that passed size is legit - - :param size: - :return: - """ - if not isinstance(size, int): - raise ValueError("Only int sizes are allowed") - if size not in range(self.min_width, self.max_width + 1): - raise ValueError( - f"Row size {size} is not allowed, range: [{self.min_width}, {self.max_width}]" - ) - return size - - def export(self) -> List[List[ButtonType]]: - """ - Export configured markup as list of lists of buttons - - .. code-block:: python - - >>> builder = KeyboardBuilder(button_type=InlineKeyboardButton) - >>> ... # Add buttons to builder - >>> markup = InlineKeyboardMarkup(inline_keyboard=builder.export()) - - :return: - """ - return deepcopy(self._markup) - - def add(self, *buttons: ButtonType) -> "KeyboardBuilder[ButtonType]": - """ - Add one or many buttons to markup. - - :param buttons: - :return: - """ - self._validate_buttons(*buttons) - markup = self.export() - - # Try to add new buttons to the end of last row if it possible - if markup and len(markup[-1]) < self.max_width: - last_row = markup[-1] - pos = self.max_width - len(last_row) - head, buttons = buttons[:pos], buttons[pos:] - last_row.extend(head) - - # Separate buttons to exclusive rows with max possible row width - while buttons: - row, buttons = buttons[: self.max_width], buttons[self.max_width :] - markup.append(list(row)) - - self._markup = markup - return self - - def row( - self, *buttons: ButtonType, width: Optional[int] = None - ) -> "KeyboardBuilder[ButtonType]": - """ - Add row to markup - - When too much buttons is passed it will be separated to many rows - - :param buttons: - :param width: - :return: - """ - if width is None: - width = self.max_width - - self._validate_size(width) - self._validate_buttons(*buttons) - self._markup.extend( - list(buttons[pos : pos + width]) for pos in range(0, len(buttons), width) - ) - return self - - def adjust(self, *sizes: int, repeat: bool = False) -> "KeyboardBuilder[ButtonType]": - """ - Adjust previously added buttons to specific row sizes. - - By default, when the sum of passed sizes is lower than buttons count the last - one size will be used for tail of the markup. - If repeat=True is passed - all sizes will be cycled when available more buttons - count than all sizes - - :param sizes: - :param repeat: - :return: - """ - if not sizes: - sizes = (self.max_width,) - - validated_sizes = map(self._validate_size, sizes) - sizes_iter = repeat_all(validated_sizes) if repeat else repeat_last(validated_sizes) - size = next(sizes_iter) - - markup = [] - row: List[ButtonType] = [] - for button in self.buttons: - if len(row) >= size: - markup.append(row) - size = next(sizes_iter) - row = [] - row.append(button) - if row: - markup.append(row) - self._markup = markup - return self - - def _button(self, **kwargs: Any) -> "KeyboardBuilder[ButtonType]": - """ - Add button to markup - - :param kwargs: - :return: - """ - if isinstance(callback_data := kwargs.get("callback_data", None), CallbackData): - kwargs["callback_data"] = callback_data.pack() - button = self._button_type(**kwargs) - return self.add(button) - - def as_markup(self, **kwargs: Any) -> Union[InlineKeyboardMarkup, ReplyKeyboardMarkup]: - if self._button_type is KeyboardButton: - keyboard = cast(List[List[KeyboardButton]], self.export()) # type: ignore - return ReplyKeyboardMarkup(keyboard=keyboard, **kwargs) - inline_keyboard = cast(List[List[InlineKeyboardButton]], self.export()) # type: ignore - return InlineKeyboardMarkup(inline_keyboard=inline_keyboard) - - def attach(self, builder: "KeyboardBuilder[ButtonType]") -> "KeyboardBuilder[ButtonType]": - if not isinstance(builder, KeyboardBuilder): - raise ValueError(f"Only KeyboardBuilder can be attached, not {type(builder).__name__}") - if builder._button_type is not self._button_type: - raise ValueError( - f"Only builders with same button type can be attached, " - f"not {self._button_type.__name__} and {builder._button_type.__name__}" - ) - self._markup.extend(builder.export()) - return self - - -def repeat_last(items: Iterable[T]) -> Generator[T, None, None]: - items_iter = iter(items) - try: - value = next(items_iter) - except StopIteration: # pragma: no cover - # Possible case but not in place where this function is used - return - yield value - finished = False - while True: - if not finished: - try: - value = next(items_iter) - except StopIteration: - finished = True - yield value - - -class InlineKeyboardBuilder(KeyboardBuilder[InlineKeyboardButton]): - """ - Inline keyboard builder inherits all methods from generic builder - """ - - max_width: int = 8 - min_width: int = 1 - max_buttons: int = 100 - - def button( - self, - *, - text: str, - url: Optional[str] = None, - callback_data: Optional[Union[str, CallbackData]] = None, - web_app: Optional[WebAppInfo] = None, - login_url: Optional[LoginUrl] = None, - switch_inline_query: Optional[str] = None, - switch_inline_query_current_chat: Optional[str] = None, - switch_inline_query_chosen_chat: Optional[SwitchInlineQueryChosenChat] = None, - callback_game: Optional[CallbackGame] = None, - pay: Optional[bool] = None, - **kwargs: Any, - ) -> "InlineKeyboardBuilder": - return cast( - InlineKeyboardBuilder, - self._button( - text=text, - url=url, - callback_data=callback_data, - web_app=web_app, - login_url=login_url, - switch_inline_query=switch_inline_query, - switch_inline_query_current_chat=switch_inline_query_current_chat, - switch_inline_query_chosen_chat=switch_inline_query_chosen_chat, - callback_game=callback_game, - pay=pay, - **kwargs, - ), - ) - - if TYPE_CHECKING: - - def as_markup(self, **kwargs: Any) -> InlineKeyboardMarkup: - """Construct an InlineKeyboardMarkup""" - ... - - def __init__(self, markup: Optional[List[List[InlineKeyboardButton]]] = None) -> None: - super().__init__(button_type=InlineKeyboardButton, markup=markup) - - def copy(self: "InlineKeyboardBuilder") -> "InlineKeyboardBuilder": - """ - Make full copy of current builder with markup - - :return: - """ - return InlineKeyboardBuilder(markup=self.export()) - - @classmethod - def from_markup( - cls: Type["InlineKeyboardBuilder"], markup: InlineKeyboardMarkup - ) -> "InlineKeyboardBuilder": - """ - Create builder from existing markup - - :param markup: - :return: - """ - return cls(markup=markup.inline_keyboard) - - -class ReplyKeyboardBuilder(KeyboardBuilder[KeyboardButton]): - """ - Reply keyboard builder inherits all methods from generic builder - """ - - max_width: int = 10 - min_width: int = 1 - max_buttons: int = 300 - - def button( - self, - *, - text: str, - request_users: Optional[KeyboardButtonRequestUsers] = None, - request_chat: Optional[KeyboardButtonRequestChat] = None, - request_contact: Optional[bool] = None, - request_location: Optional[bool] = None, - request_poll: Optional[KeyboardButtonPollType] = None, - web_app: Optional[WebAppInfo] = None, - **kwargs: Any, - ) -> "ReplyKeyboardBuilder": - return cast( - ReplyKeyboardBuilder, - self._button( - text=text, - request_users=request_users, - request_chat=request_chat, - request_contact=request_contact, - request_location=request_location, - request_poll=request_poll, - web_app=web_app, - **kwargs, - ), - ) - - if TYPE_CHECKING: - - def as_markup(self, **kwargs: Any) -> ReplyKeyboardMarkup: ... - - def __init__(self, markup: Optional[List[List[KeyboardButton]]] = None) -> None: - super().__init__(button_type=KeyboardButton, markup=markup) - - def copy(self: "ReplyKeyboardBuilder") -> "ReplyKeyboardBuilder": - """ - Make full copy of current builder with markup - - :return: - """ - return ReplyKeyboardBuilder(markup=self.export()) - - @classmethod - def from_markup(cls, markup: ReplyKeyboardMarkup) -> "ReplyKeyboardBuilder": - """ - Create builder from existing markup - - :param markup: - :return: - """ - return cls(markup=markup.keyboard) diff --git a/env/Lib/site-packages/aiogram/utils/link.py b/env/Lib/site-packages/aiogram/utils/link.py deleted file mode 100644 index 051247f..0000000 --- a/env/Lib/site-packages/aiogram/utils/link.py +++ /dev/null @@ -1,74 +0,0 @@ -from typing import Any, Optional -from urllib.parse import urlencode, urljoin - -BASE_DOCS_URL = "https://docs.aiogram.dev/" -BRANCH = "dev-3.x" - -BASE_PAGE_URL = f"{BASE_DOCS_URL}/en/{BRANCH}/" - - -def _format_url(url: str, *path: str, fragment_: Optional[str] = None, **query: Any) -> str: - url = urljoin(url, "/".join(path), allow_fragments=True) - if query: - url += "?" + urlencode(query) - if fragment_: - url += "#" + fragment_ - return url - - -def docs_url(*path: str, fragment_: Optional[str] = None, **query: Any) -> str: - return _format_url(BASE_PAGE_URL, *path, fragment_=fragment_, **query) - - -def create_tg_link(link: str, **kwargs: Any) -> str: - return _format_url(f"tg://{link}", **kwargs) - - -def create_telegram_link(*path: str, **kwargs: Any) -> str: - return _format_url("https://t.me", *path, **kwargs) - - -def create_channel_bot_link( - username: str, - parameter: Optional[str] = None, - change_info: bool = False, - post_messages: bool = False, - edit_messages: bool = False, - delete_messages: bool = False, - restrict_members: bool = False, - invite_users: bool = False, - pin_messages: bool = False, - promote_members: bool = False, - manage_video_chats: bool = False, - anonymous: bool = False, - manage_chat: bool = False, -) -> str: - params = {} - if parameter is not None: - params["startgroup"] = parameter - permissions = [] - if change_info: - permissions.append("change_info") - if post_messages: - permissions.append("post_messages") - if edit_messages: - permissions.append("edit_messages") - if delete_messages: - permissions.append("delete_messages") - if restrict_members: - permissions.append("restrict_members") - if invite_users: - permissions.append("invite_users") - if pin_messages: - permissions.append("pin_messages") - if promote_members: - permissions.append("promote_members") - if manage_video_chats: - permissions.append("manage_video_chats") - if anonymous: - permissions.append("anonymous") - if manage_chat: - permissions.append("manage_chat") - if permissions: - params["admin"] = "+".join(permissions) - return create_telegram_link(username, **params) diff --git a/env/Lib/site-packages/aiogram/utils/magic_filter.py b/env/Lib/site-packages/aiogram/utils/magic_filter.py deleted file mode 100644 index 94c9207..0000000 --- a/env/Lib/site-packages/aiogram/utils/magic_filter.py +++ /dev/null @@ -1,22 +0,0 @@ -from typing import Any, Iterable - -from magic_filter import MagicFilter as _MagicFilter -from magic_filter import MagicT as _MagicT -from magic_filter.operations import BaseOperation - - -class AsFilterResultOperation(BaseOperation): - __slots__ = ("name",) - - def __init__(self, name: str) -> None: - self.name = name - - def resolve(self, value: Any, initial_value: Any) -> Any: - if value is None or (isinstance(value, Iterable) and not value): - return None - return {self.name: value} - - -class MagicFilter(_MagicFilter): - def as_(self: _MagicT, name: str) -> _MagicT: - return self._extend(AsFilterResultOperation(name=name)) diff --git a/env/Lib/site-packages/aiogram/utils/markdown.py b/env/Lib/site-packages/aiogram/utils/markdown.py deleted file mode 100644 index 52c6e1d..0000000 --- a/env/Lib/site-packages/aiogram/utils/markdown.py +++ /dev/null @@ -1,209 +0,0 @@ -from typing import Any - -from .text_decorations import html_decoration, markdown_decoration - - -def _join(*content: Any, sep: str = " ") -> str: - return sep.join(map(str, content)) - - -def text(*content: Any, sep: str = " ") -> str: - """ - Join all elements with a separator - - :param content: - :param sep: - :return: - """ - return _join(*content, sep=sep) - - -def bold(*content: Any, sep: str = " ") -> str: - """ - Make bold text (Markdown) - - :param content: - :param sep: - :return: - """ - return markdown_decoration.bold(value=markdown_decoration.quote(_join(*content, sep=sep))) - - -def hbold(*content: Any, sep: str = " ") -> str: - """ - Make bold text (HTML) - - :param content: - :param sep: - :return: - """ - return html_decoration.bold(value=html_decoration.quote(_join(*content, sep=sep))) - - -def italic(*content: Any, sep: str = " ") -> str: - """ - Make italic text (Markdown) - - :param content: - :param sep: - :return: - """ - return markdown_decoration.italic(value=markdown_decoration.quote(_join(*content, sep=sep))) - - -def hitalic(*content: Any, sep: str = " ") -> str: - """ - Make italic text (HTML) - - :param content: - :param sep: - :return: - """ - return html_decoration.italic(value=html_decoration.quote(_join(*content, sep=sep))) - - -def code(*content: Any, sep: str = " ") -> str: - """ - Make mono-width text (Markdown) - - :param content: - :param sep: - :return: - """ - return markdown_decoration.code(value=markdown_decoration.quote(_join(*content, sep=sep))) - - -def hcode(*content: Any, sep: str = " ") -> str: - """ - Make mono-width text (HTML) - - :param content: - :param sep: - :return: - """ - return html_decoration.code(value=html_decoration.quote(_join(*content, sep=sep))) - - -def pre(*content: Any, sep: str = "\n") -> str: - """ - Make mono-width text block (Markdown) - - :param content: - :param sep: - :return: - """ - return markdown_decoration.pre(value=markdown_decoration.quote(_join(*content, sep=sep))) - - -def hpre(*content: Any, sep: str = "\n") -> str: - """ - Make mono-width text block (HTML) - - :param content: - :param sep: - :return: - """ - return html_decoration.pre(value=html_decoration.quote(_join(*content, sep=sep))) - - -def underline(*content: Any, sep: str = " ") -> str: - """ - Make underlined text (Markdown) - - :param content: - :param sep: - :return: - """ - return markdown_decoration.underline(value=markdown_decoration.quote(_join(*content, sep=sep))) - - -def hunderline(*content: Any, sep: str = " ") -> str: - """ - Make underlined text (HTML) - - :param content: - :param sep: - :return: - """ - return html_decoration.underline(value=html_decoration.quote(_join(*content, sep=sep))) - - -def strikethrough(*content: Any, sep: str = " ") -> str: - """ - Make strikethrough text (Markdown) - - :param content: - :param sep: - :return: - """ - return markdown_decoration.strikethrough( - value=markdown_decoration.quote(_join(*content, sep=sep)) - ) - - -def hstrikethrough(*content: Any, sep: str = " ") -> str: - """ - Make strikethrough text (HTML) - - :param content: - :param sep: - :return: - """ - return html_decoration.strikethrough(value=html_decoration.quote(_join(*content, sep=sep))) - - -def link(title: str, url: str) -> str: - """ - Format URL (Markdown) - - :param title: - :param url: - :return: - """ - return markdown_decoration.link(value=markdown_decoration.quote(title), link=url) - - -def hlink(title: str, url: str) -> str: - """ - Format URL (HTML) - - :param title: - :param url: - :return: - """ - return html_decoration.link(value=html_decoration.quote(title), link=url) - - -def blockquote(*content: Any, sep: str = "\n") -> str: - """ - Make blockquote (Markdown) - - :param content: - :param sep: - :return: - """ - return markdown_decoration.blockquote( - value=markdown_decoration.quote(_join(*content, sep=sep)) - ) - - -def hblockquote(*content: Any, sep: str = "\n") -> str: - """ - Make blockquote (HTML) - - :param content: - :param sep: - :return: - """ - return html_decoration.blockquote(value=html_decoration.quote(_join(*content, sep=sep))) - - -def hide_link(url: str) -> str: - """ - Hide URL (HTML only) - Can be used for adding an image to a text message - - :param url: - :return: - """ - return f'' diff --git a/env/Lib/site-packages/aiogram/utils/media_group.py b/env/Lib/site-packages/aiogram/utils/media_group.py deleted file mode 100644 index ff98525..0000000 --- a/env/Lib/site-packages/aiogram/utils/media_group.py +++ /dev/null @@ -1,368 +0,0 @@ -from typing import Any, Dict, List, Literal, Optional, Union, overload - -from aiogram.enums import InputMediaType -from aiogram.types import ( - UNSET_PARSE_MODE, - InputFile, - InputMedia, - InputMediaAudio, - InputMediaDocument, - InputMediaPhoto, - InputMediaVideo, - MessageEntity, -) - -MediaType = Union[ - InputMediaAudio, - InputMediaPhoto, - InputMediaVideo, - InputMediaDocument, -] - -MAX_MEDIA_GROUP_SIZE = 10 - - -class MediaGroupBuilder: - # Animated media is not supported yet in Bot API to send as a media group - - def __init__( - self, - media: Optional[List[MediaType]] = None, - caption: Optional[str] = None, - caption_entities: Optional[List[MessageEntity]] = None, - ) -> None: - """ - Helper class for building media groups. - - :param media: A list of media elements to add to the media group. (optional) - :param caption: Caption for the media group. (optional) - :param caption_entities: List of special entities in the caption, - like usernames, URLs, etc. (optional) - """ - self._media: List[MediaType] = [] - self.caption = caption - self.caption_entities = caption_entities - - self._extend(media or []) - - def _add(self, media: MediaType) -> None: - if not isinstance(media, InputMedia): - raise ValueError("Media must be instance of InputMedia") - - if len(self._media) >= MAX_MEDIA_GROUP_SIZE: - raise ValueError("Media group can't contain more than 10 elements") - - self._media.append(media) - - def _extend(self, media: List[MediaType]) -> None: - for m in media: - self._add(m) - - @overload - def add( - self, - *, - type: Literal[InputMediaType.AUDIO], - media: Union[str, InputFile], - caption: Optional[str] = None, - parse_mode: Optional[str] = UNSET_PARSE_MODE, - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - **kwargs: Any, - ) -> None: - pass - - @overload - def add( - self, - *, - type: Literal[InputMediaType.PHOTO], - media: Union[str, InputFile], - caption: Optional[str] = None, - parse_mode: Optional[str] = UNSET_PARSE_MODE, - caption_entities: Optional[List[MessageEntity]] = None, - has_spoiler: Optional[bool] = None, - **kwargs: Any, - ) -> None: - pass - - @overload - def add( - self, - *, - type: Literal[InputMediaType.VIDEO], - media: Union[str, InputFile], - thumbnail: Optional[Union[InputFile, str]] = None, - caption: Optional[str] = None, - parse_mode: Optional[str] = UNSET_PARSE_MODE, - caption_entities: Optional[List[MessageEntity]] = None, - width: Optional[int] = None, - height: Optional[int] = None, - duration: Optional[int] = None, - supports_streaming: Optional[bool] = None, - has_spoiler: Optional[bool] = None, - **kwargs: Any, - ) -> None: - pass - - @overload - def add( - self, - *, - type: Literal[InputMediaType.DOCUMENT], - media: Union[str, InputFile], - thumbnail: Optional[Union[InputFile, str]] = None, - caption: Optional[str] = None, - parse_mode: Optional[str] = UNSET_PARSE_MODE, - caption_entities: Optional[List[MessageEntity]] = None, - disable_content_type_detection: Optional[bool] = None, - **kwargs: Any, - ) -> None: - pass - - def add(self, **kwargs: Any) -> None: - """ - Add a media object to the media group. - - :param kwargs: Keyword arguments for the media object. - The available keyword arguments depend on the media type. - :return: None - """ - type_ = kwargs.pop("type", None) - if type_ == InputMediaType.AUDIO: - self.add_audio(**kwargs) - elif type_ == InputMediaType.PHOTO: - self.add_photo(**kwargs) - elif type_ == InputMediaType.VIDEO: - self.add_video(**kwargs) - elif type_ == InputMediaType.DOCUMENT: - self.add_document(**kwargs) - else: - raise ValueError(f"Unknown media type: {type_!r}") - - def add_audio( - self, - media: Union[str, InputFile], - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[str] = UNSET_PARSE_MODE, - caption_entities: Optional[List[MessageEntity]] = None, - duration: Optional[int] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - **kwargs: Any, - ) -> None: - """ - Add an audio file to the media group. - - :param media: File to send. Pass a file_id to send a file that exists on the - Telegram servers (recommended), pass an HTTP URL for Telegram to get a file from - the Internet, or pass 'attach://' to upload a new one using - multipart/form-data under name. - :ref:`More information on Sending Files » ` - :param thumbnail: *Optional*. Thumbnail of the file sent; can be ignored if - thumbnail generation for the file is supported server-side. The thumbnail should - be in JPEG format and less than 200 kB in size. A thumbnail's width and height - should not exceed 320. - :param caption: *Optional*. Caption of the audio to be sent, 0-1024 characters - after entities parsing - :param parse_mode: *Optional*. Mode for parsing entities in the audio caption. - See `formatting options `_ - for more details. - :param caption_entities: *Optional*. List of special entities that appear in the caption, - which can be specified instead of *parse_mode* - :param duration: *Optional*. Duration of the audio in seconds - :param performer: *Optional*. Performer of the audio - :param title: *Optional*. Title of the audio - :return: None - """ - self._add( - InputMediaAudio( - media=media, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - duration=duration, - performer=performer, - title=title, - **kwargs, - ) - ) - - def add_photo( - self, - media: Union[str, InputFile], - caption: Optional[str] = None, - parse_mode: Optional[str] = UNSET_PARSE_MODE, - caption_entities: Optional[List[MessageEntity]] = None, - has_spoiler: Optional[bool] = None, - **kwargs: Any, - ) -> None: - """ - Add a photo to the media group. - - :param media: File to send. Pass a file_id to send a file that exists on the - Telegram servers (recommended), pass an HTTP URL for Telegram to get a file - from the Internet, or pass 'attach://' to upload a new - one using multipart/form-data under name. - :ref:`More information on Sending Files » ` - :param caption: *Optional*. Caption of the photo to be sent, 0-1024 characters - after entities parsing - :param parse_mode: *Optional*. Mode for parsing entities in the photo caption. - See `formatting options `_ - for more details. - :param caption_entities: *Optional*. List of special entities that appear in the caption, - which can be specified instead of *parse_mode* - :param has_spoiler: *Optional*. Pass :code:`True` if the photo needs to be covered - with a spoiler animation - :return: None - """ - self._add( - InputMediaPhoto( - media=media, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - has_spoiler=has_spoiler, - **kwargs, - ) - ) - - def add_video( - self, - media: Union[str, InputFile], - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[str] = UNSET_PARSE_MODE, - caption_entities: Optional[List[MessageEntity]] = None, - width: Optional[int] = None, - height: Optional[int] = None, - duration: Optional[int] = None, - supports_streaming: Optional[bool] = None, - has_spoiler: Optional[bool] = None, - **kwargs: Any, - ) -> None: - """ - Add a video to the media group. - - :param media: File to send. Pass a file_id to send a file that exists on the - Telegram servers (recommended), pass an HTTP URL for Telegram to get a file - from the Internet, or pass 'attach://' to upload a new one - using multipart/form-data under name. - :ref:`More information on Sending Files » ` - :param thumbnail: *Optional*. Thumbnail of the file sent; can be ignored if thumbnail - generation for the file is supported server-side. The thumbnail should be in JPEG - format and less than 200 kB in size. A thumbnail's width and height should - not exceed 320. Ignored if the file is not uploaded using multipart/form-data. - Thumbnails can't be reused and can be only uploaded as a new file, so you - can pass 'attach://' if the thumbnail was uploaded using - multipart/form-data under . - :ref:`More information on Sending Files » ` - :param caption: *Optional*. Caption of the video to be sent, - 0-1024 characters after entities parsing - :param parse_mode: *Optional*. Mode for parsing entities in the video caption. - See `formatting options `_ - for more details. - :param caption_entities: *Optional*. List of special entities that appear in the caption, - which can be specified instead of *parse_mode* - :param width: *Optional*. Video width - :param height: *Optional*. Video height - :param duration: *Optional*. Video duration in seconds - :param supports_streaming: *Optional*. Pass :code:`True` if the uploaded video is - suitable for streaming - :param has_spoiler: *Optional*. Pass :code:`True` if the video needs to be covered - with a spoiler animation - :return: None - """ - self._add( - InputMediaVideo( - media=media, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - width=width, - height=height, - duration=duration, - supports_streaming=supports_streaming, - has_spoiler=has_spoiler, - **kwargs, - ) - ) - - def add_document( - self, - media: Union[str, InputFile], - thumbnail: Optional[InputFile] = None, - caption: Optional[str] = None, - parse_mode: Optional[str] = UNSET_PARSE_MODE, - caption_entities: Optional[List[MessageEntity]] = None, - disable_content_type_detection: Optional[bool] = None, - **kwargs: Any, - ) -> None: - """ - Add a document to the media group. - - :param media: File to send. Pass a file_id to send a file that exists on the - Telegram servers (recommended), pass an HTTP URL for Telegram to get a file - from the Internet, or pass 'attach://' to upload a new one using - multipart/form-data under name. - :ref:`More information on Sending Files » ` - :param thumbnail: *Optional*. Thumbnail of the file sent; can be ignored - if thumbnail generation for the file is supported server-side. - The thumbnail should be in JPEG format and less than 200 kB in size. - A thumbnail's width and height should not exceed 320. - Ignored if the file is not uploaded using multipart/form-data. - Thumbnails can't be reused and can be only uploaded as a new file, - so you can pass 'attach://' if the thumbnail was uploaded - using multipart/form-data under . - :ref:`More information on Sending Files » ` - :param caption: *Optional*. Caption of the document to be sent, - 0-1024 characters after entities parsing - :param parse_mode: *Optional*. Mode for parsing entities in the document caption. - See `formatting options `_ - for more details. - :param caption_entities: *Optional*. List of special entities that appear - in the caption, which can be specified instead of *parse_mode* - :param disable_content_type_detection: *Optional*. Disables automatic server-side - content type detection for files uploaded using multipart/form-data. - Always :code:`True`, if the document is sent as part of an album. - :return: None - - """ - self._add( - InputMediaDocument( - media=media, - thumbnail=thumbnail, - caption=caption, - parse_mode=parse_mode, - caption_entities=caption_entities, - disable_content_type_detection=disable_content_type_detection, - **kwargs, - ) - ) - - def build(self) -> List[MediaType]: - """ - Builds a list of media objects for a media group. - - Adds the caption to the first media object if it is present. - - :return: List of media objects. - """ - update_first_media: Dict[str, Any] = {"caption": self.caption} - if self.caption_entities is not None: - update_first_media["caption_entities"] = self.caption_entities - update_first_media["parse_mode"] = None - - return [ - ( - media.model_copy(update=update_first_media) - if index == 0 and self.caption is not None - else media - ) - for index, media in enumerate(self._media) - ] diff --git a/env/Lib/site-packages/aiogram/utils/mixins.py b/env/Lib/site-packages/aiogram/utils/mixins.py deleted file mode 100644 index 86b3ed8..0000000 --- a/env/Lib/site-packages/aiogram/utils/mixins.py +++ /dev/null @@ -1,95 +0,0 @@ -from __future__ import annotations - -import contextvars -from typing import TYPE_CHECKING, Any, Dict, Generic, Optional, TypeVar, cast, overload - -if TYPE_CHECKING: - from typing_extensions import Literal - -__all__ = ("ContextInstanceMixin", "DataMixin") - - -class DataMixin: - @property - def data(self) -> Dict[str, Any]: - data: Optional[Dict[str, Any]] = getattr(self, "_data", None) - if data is None: - data = {} - setattr(self, "_data", data) - return data - - def __getitem__(self, key: str) -> Any: - return self.data[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.data[key] = value - - def __delitem__(self, key: str) -> None: - del self.data[key] - - def __contains__(self, key: str) -> bool: - return key in self.data - - def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]: - return self.data.get(key, default) - - -ContextInstance = TypeVar("ContextInstance") - - -class ContextInstanceMixin(Generic[ContextInstance]): - __context_instance: contextvars.ContextVar[ContextInstance] - - def __init_subclass__(cls, **kwargs: Any) -> None: - super().__init_subclass__() - cls.__context_instance = contextvars.ContextVar(f"instance_{cls.__name__}") - - @overload # noqa: F811 - @classmethod - def get_current(cls) -> Optional[ContextInstance]: # pragma: no cover # noqa: F811 - ... - - @overload # noqa: F811 - @classmethod - def get_current( # noqa: F811 - cls, no_error: Literal[True] - ) -> Optional[ContextInstance]: # pragma: no cover # noqa: F811 - ... - - @overload # noqa: F811 - @classmethod - def get_current( # noqa: F811 - cls, no_error: Literal[False] - ) -> ContextInstance: # pragma: no cover # noqa: F811 - ... - - @classmethod # noqa: F811 - def get_current( # noqa: F811 - cls, no_error: bool = True - ) -> Optional[ContextInstance]: # pragma: no cover # noqa: F811 - # on mypy 0.770 I catch that contextvars.ContextVar always contextvars.ContextVar[Any] - cls.__context_instance = cast( - contextvars.ContextVar[ContextInstance], cls.__context_instance - ) - - try: - current: Optional[ContextInstance] = cls.__context_instance.get() - except LookupError: - if no_error: - current = None - else: - raise - - return current - - @classmethod - def set_current(cls, value: ContextInstance) -> contextvars.Token[ContextInstance]: - if not isinstance(value, cls): - raise TypeError( - f"Value should be instance of {cls.__name__!r} not {type(value).__name__!r}" - ) - return cls.__context_instance.set(value) - - @classmethod - def reset_current(cls, token: contextvars.Token[ContextInstance]) -> None: - cls.__context_instance.reset(token) diff --git a/env/Lib/site-packages/aiogram/utils/mypy_hacks.py b/env/Lib/site-packages/aiogram/utils/mypy_hacks.py deleted file mode 100644 index ea47a9d..0000000 --- a/env/Lib/site-packages/aiogram/utils/mypy_hacks.py +++ /dev/null @@ -1,16 +0,0 @@ -import functools -from typing import Callable, TypeVar - -T = TypeVar("T") - - -def lru_cache(maxsize: int = 128, typed: bool = False) -> Callable[[T], T]: - """ - fix: lru_cache annotation doesn't work with a property - this hack is only needed for the property, so type annotations are as they are - """ - - def wrapper(func: T) -> T: - return functools.lru_cache(maxsize, typed)(func) # type: ignore - - return wrapper diff --git a/env/Lib/site-packages/aiogram/utils/payload.py b/env/Lib/site-packages/aiogram/utils/payload.py deleted file mode 100644 index dbdba65..0000000 --- a/env/Lib/site-packages/aiogram/utils/payload.py +++ /dev/null @@ -1,109 +0,0 @@ -""" -Payload preparing - -We have added some utils to make work with payload easier. - -Basic encode example: - - .. code-block:: python - - from aiogram.utils.payload import encode_payload - - encoded = encode_payload("foo") - - # result: "Zm9v" - -Basic decode it back example: - - .. code-block:: python - - from aiogram.utils.payload import decode_payload - - encoded = "Zm9v" - decoded = decode_payload(encoded) - # result: "foo" - -Encoding and decoding with your own methods: - - 1. Create your own cryptor - - .. code-block:: python - - from Cryptodome.Cipher import AES - from Cryptodome.Util.Padding import pad, unpad - - class Cryptor: - def __init__(self, key: str): - self.key = key.encode("utf-8") - self.mode = AES.MODE_ECB # never use ECB in strong systems obviously - self.size = 32 - - @property - def cipher(self): - return AES.new(self.key, self.mode) - - def encrypt(self, data: bytes) -> bytes: - return self.cipher.encrypt(pad(data, self.size)) - - def decrypt(self, data: bytes) -> bytes: - decrypted_data = self.cipher.decrypt(data) - return unpad(decrypted_data, self.size) - - 2. Pass cryptor callable methods to aiogram payload tools - - .. code-block:: python - - cryptor = Cryptor("abcdefghijklmnop") - encoded = encode_payload("foo", encoder=cryptor.encrypt) - decoded = decode_payload(encoded_payload, decoder=cryptor.decrypt) - - # result: decoded == "foo" - -""" - -from base64 import urlsafe_b64decode, urlsafe_b64encode -from typing import Callable, Optional - - -def encode_payload( - payload: str, - encoder: Optional[Callable[[bytes], bytes]] = None, -) -> str: - """Encode payload with encoder. - - Result also will be encoded with URL-safe base64url. - """ - if not isinstance(payload, str): - payload = str(payload) - - payload_bytes = payload.encode("utf-8") - if encoder is not None: - payload_bytes = encoder(payload_bytes) - - return _encode_b64(payload_bytes) - - -def decode_payload( - payload: str, - decoder: Optional[Callable[[bytes], bytes]] = None, -) -> str: - """Decode URL-safe base64url payload with decoder.""" - original_payload = _decode_b64(payload) - - if decoder is None: - return original_payload.decode() - - return decoder(original_payload).decode() - - -def _encode_b64(payload: bytes) -> str: - """Encode with URL-safe base64url.""" - bytes_payload: bytes = urlsafe_b64encode(payload) - str_payload = bytes_payload.decode() - return str_payload.replace("=", "") - - -def _decode_b64(payload: str) -> bytes: - """Decode with URL-safe base64url.""" - payload += "=" * (4 - len(payload) % 4) - return urlsafe_b64decode(payload.encode()) diff --git a/env/Lib/site-packages/aiogram/utils/serialization.py b/env/Lib/site-packages/aiogram/utils/serialization.py deleted file mode 100644 index cc6ef8a..0000000 --- a/env/Lib/site-packages/aiogram/utils/serialization.py +++ /dev/null @@ -1,89 +0,0 @@ -from dataclasses import dataclass -from typing import Any, Dict, Optional - -from pydantic import BaseModel - -from aiogram import Bot -from aiogram.client.default import DefaultBotProperties -from aiogram.methods import TelegramMethod -from aiogram.types import InputFile - - -def _get_fake_bot(default: Optional[DefaultBotProperties] = None) -> Bot: - if default is None: - default = DefaultBotProperties() - return Bot(token="42:Fake", default=default) - - -@dataclass -class DeserializedTelegramObject: - """ - Represents a dumped Telegram object. - - :param data: The dumped data of the Telegram object. - :type data: Any - :param files: The dictionary containing the file names as keys - and the corresponding `InputFile` objects as values. - :type files: Dict[str, InputFile] - """ - - data: Any - files: Dict[str, InputFile] - - -def deserialize_telegram_object( - obj: Any, - default: Optional[DefaultBotProperties] = None, - include_api_method_name: bool = True, -) -> DeserializedTelegramObject: - """ - Deserialize Telegram Object to JSON compatible Python object. - - :param obj: The object to be deserialized. - :param default: Default bot properties - should be passed only if you want to use custom defaults. - :param include_api_method_name: Whether to include the API method name in the result. - :return: The deserialized Telegram object. - """ - extends = {} - if include_api_method_name and isinstance(obj, TelegramMethod): - extends["method"] = obj.__api_method__ - - if isinstance(obj, BaseModel): - obj = obj.model_dump(mode="python", warnings=False) - - # Fake bot is needed to exclude global defaults from the object. - fake_bot = _get_fake_bot(default=default) - - files: Dict[str, InputFile] = {} - prepared = fake_bot.session.prepare_value( - obj, - bot=fake_bot, - files=files, - _dumps_json=False, - ) - - if isinstance(prepared, dict): - prepared.update(extends) - return DeserializedTelegramObject(data=prepared, files=files) - - -def deserialize_telegram_object_to_python( - obj: Any, - default: Optional[DefaultBotProperties] = None, - include_api_method_name: bool = True, -) -> Any: - """ - Deserialize telegram object to JSON compatible Python object excluding files. - - :param obj: The telegram object to be deserialized. - :param default: Default bot properties - should be passed only if you want to use custom defaults. - :param include_api_method_name: Whether to include the API method name in the result. - :return: The deserialized telegram object. - """ - return deserialize_telegram_object( - obj, - default=default, - include_api_method_name=include_api_method_name, - ).data diff --git a/env/Lib/site-packages/aiogram/utils/text_decorations.py b/env/Lib/site-packages/aiogram/utils/text_decorations.py deleted file mode 100644 index 440fffa..0000000 --- a/env/Lib/site-packages/aiogram/utils/text_decorations.py +++ /dev/null @@ -1,274 +0,0 @@ -from __future__ import annotations - -import html -import re -from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Generator, List, Optional, Pattern, cast - -from aiogram.enums import MessageEntityType - -if TYPE_CHECKING: - from aiogram.types import MessageEntity - -__all__ = ( - "HtmlDecoration", - "MarkdownDecoration", - "TextDecoration", - "html_decoration", - "markdown_decoration", - "add_surrogates", - "remove_surrogates", -) - - -def add_surrogates(text: str) -> bytes: - return text.encode("utf-16-le") - - -def remove_surrogates(text: bytes) -> str: - return text.decode("utf-16-le") - - -class TextDecoration(ABC): - def apply_entity(self, entity: MessageEntity, text: str) -> str: - """ - Apply single entity to text - - :param entity: - :param text: - :return: - """ - if entity.type in { - MessageEntityType.BOT_COMMAND, - MessageEntityType.URL, - MessageEntityType.MENTION, - MessageEntityType.PHONE_NUMBER, - MessageEntityType.HASHTAG, - MessageEntityType.CASHTAG, - MessageEntityType.EMAIL, - }: - # These entities should not be changed - return text - if entity.type in { - MessageEntityType.BOLD, - MessageEntityType.ITALIC, - MessageEntityType.CODE, - MessageEntityType.UNDERLINE, - MessageEntityType.STRIKETHROUGH, - MessageEntityType.SPOILER, - MessageEntityType.BLOCKQUOTE, - MessageEntityType.EXPANDABLE_BLOCKQUOTE, - }: - return cast(str, getattr(self, entity.type)(value=text)) - if entity.type == MessageEntityType.PRE: - return ( - self.pre_language(value=text, language=entity.language) - if entity.language - else self.pre(value=text) - ) - if entity.type == MessageEntityType.TEXT_MENTION: - from aiogram.types import User - - user = cast(User, entity.user) - return self.link(value=text, link=f"tg://user?id={user.id}") - if entity.type == MessageEntityType.TEXT_LINK: - return self.link(value=text, link=cast(str, entity.url)) - if entity.type == MessageEntityType.CUSTOM_EMOJI: - return self.custom_emoji(value=text, custom_emoji_id=cast(str, entity.custom_emoji_id)) - - # This case is not possible because of `if` above, but if any new entity is added to - # API it will be here too - return self.quote(text) - - def unparse(self, text: str, entities: Optional[List[MessageEntity]] = None) -> str: - """ - Unparse message entities - - :param text: raw text - :param entities: Array of MessageEntities - :return: - """ - return "".join( - self._unparse_entities( - add_surrogates(text), - sorted(entities, key=lambda item: item.offset) if entities else [], - ) - ) - - def _unparse_entities( - self, - text: bytes, - entities: List[MessageEntity], - offset: Optional[int] = None, - length: Optional[int] = None, - ) -> Generator[str, None, None]: - if offset is None: - offset = 0 - length = length or len(text) - - for index, entity in enumerate(entities): - if entity.offset * 2 < offset: - continue - if entity.offset * 2 > offset: - yield self.quote(remove_surrogates(text[offset : entity.offset * 2])) - start = entity.offset * 2 - offset = entity.offset * 2 + entity.length * 2 - - sub_entities = list( - filter(lambda e: e.offset * 2 < (offset or 0), entities[index + 1 :]) - ) - yield self.apply_entity( - entity, - "".join(self._unparse_entities(text, sub_entities, offset=start, length=offset)), - ) - - if offset < length: - yield self.quote(remove_surrogates(text[offset:length])) - - @abstractmethod - def link(self, value: str, link: str) -> str: - pass - - @abstractmethod - def bold(self, value: str) -> str: - pass - - @abstractmethod - def italic(self, value: str) -> str: - pass - - @abstractmethod - def code(self, value: str) -> str: - pass - - @abstractmethod - def pre(self, value: str) -> str: - pass - - @abstractmethod - def pre_language(self, value: str, language: str) -> str: - pass - - @abstractmethod - def underline(self, value: str) -> str: - pass - - @abstractmethod - def strikethrough(self, value: str) -> str: - pass - - @abstractmethod - def spoiler(self, value: str) -> str: - pass - - @abstractmethod - def quote(self, value: str) -> str: - pass - - @abstractmethod - def custom_emoji(self, value: str, custom_emoji_id: str) -> str: - pass - - @abstractmethod - def blockquote(self, value: str) -> str: - pass - - @abstractmethod - def expandable_blockquote(self, value: str) -> str: - pass - - -class HtmlDecoration(TextDecoration): - BOLD_TAG = "b" - ITALIC_TAG = "i" - UNDERLINE_TAG = "u" - STRIKETHROUGH_TAG = "s" - SPOILER_TAG = "tg-spoiler" - EMOJI_TAG = "tg-emoji" - BLOCKQUOTE_TAG = "blockquote" - - def link(self, value: str, link: str) -> str: - return f'{value}' - - def bold(self, value: str) -> str: - return f"<{self.BOLD_TAG}>{value}" - - def italic(self, value: str) -> str: - return f"<{self.ITALIC_TAG}>{value}" - - def code(self, value: str) -> str: - return f"{value}" - - def pre(self, value: str) -> str: - return f"
      {value}
      " - - def pre_language(self, value: str, language: str) -> str: - return f'
      {value}
      ' - - def underline(self, value: str) -> str: - return f"<{self.UNDERLINE_TAG}>{value}" - - def strikethrough(self, value: str) -> str: - return f"<{self.STRIKETHROUGH_TAG}>{value}" - - def spoiler(self, value: str) -> str: - return f"<{self.SPOILER_TAG}>{value}" - - def quote(self, value: str) -> str: - return html.escape(value, quote=False) - - def custom_emoji(self, value: str, custom_emoji_id: str) -> str: - return f'<{self.EMOJI_TAG} emoji-id="{custom_emoji_id}">{value}' - - def blockquote(self, value: str) -> str: - return f"<{self.BLOCKQUOTE_TAG}>{value}" - - def expandable_blockquote(self, value: str) -> str: - return f"<{self.BLOCKQUOTE_TAG} expandable>{value}" - - -class MarkdownDecoration(TextDecoration): - MARKDOWN_QUOTE_PATTERN: Pattern[str] = re.compile(r"([_*\[\]()~`>#+\-=|{}.!\\])") - - def link(self, value: str, link: str) -> str: - return f"[{value}]({link})" - - def bold(self, value: str) -> str: - return f"*{value}*" - - def italic(self, value: str) -> str: - return f"_\r{value}_\r" - - def code(self, value: str) -> str: - return f"`{value}`" - - def pre(self, value: str) -> str: - return f"```\n{value}\n```" - - def pre_language(self, value: str, language: str) -> str: - return f"```{language}\n{value}\n```" - - def underline(self, value: str) -> str: - return f"__\r{value}__\r" - - def strikethrough(self, value: str) -> str: - return f"~{value}~" - - def spoiler(self, value: str) -> str: - return f"||{value}||" - - def quote(self, value: str) -> str: - return re.sub(pattern=self.MARKDOWN_QUOTE_PATTERN, repl=r"\\\1", string=value) - - def custom_emoji(self, value: str, custom_emoji_id: str) -> str: - return f'!{self.link(value=value, link=f"tg://emoji?id={custom_emoji_id}")}' - - def blockquote(self, value: str) -> str: - return "\n".join(f">{line}" for line in value.splitlines()) - - def expandable_blockquote(self, value: str) -> str: - return "\n".join(f">{line}" for line in value.splitlines()) + "||" - - -html_decoration = HtmlDecoration() -markdown_decoration = MarkdownDecoration() diff --git a/env/Lib/site-packages/aiogram/utils/token.py b/env/Lib/site-packages/aiogram/utils/token.py deleted file mode 100644 index c073846..0000000 --- a/env/Lib/site-packages/aiogram/utils/token.py +++ /dev/null @@ -1,42 +0,0 @@ -from functools import lru_cache - - -class TokenValidationError(Exception): - pass - - -@lru_cache() -def validate_token(token: str) -> bool: - """ - Validate Telegram token - - :param token: - :return: - """ - if not isinstance(token, str): - raise TokenValidationError( - f"Token is invalid! It must be 'str' type instead of {type(token)} type." - ) - - if any(x.isspace() for x in token): - message = "Token is invalid! It can't contains spaces." - raise TokenValidationError(message) - - left, sep, right = token.partition(":") - if (not sep) or (not left.isdigit()) or (not right): - raise TokenValidationError("Token is invalid!") - - return True - - -@lru_cache() -def extract_bot_id(token: str) -> int: - """ - Extract bot ID from Telegram token - - :param token: - :return: - """ - validate_token(token) - raw_bot_id, *_ = token.split(":") - return int(raw_bot_id) diff --git a/env/Lib/site-packages/aiogram/utils/warnings.py b/env/Lib/site-packages/aiogram/utils/warnings.py deleted file mode 100644 index 3099fc3..0000000 --- a/env/Lib/site-packages/aiogram/utils/warnings.py +++ /dev/null @@ -1,6 +0,0 @@ -class AiogramWarning(Warning): - pass - - -class Recommendation(AiogramWarning): - pass diff --git a/env/Lib/site-packages/aiogram/utils/web_app.py b/env/Lib/site-packages/aiogram/utils/web_app.py deleted file mode 100644 index 192776f..0000000 --- a/env/Lib/site-packages/aiogram/utils/web_app.py +++ /dev/null @@ -1,183 +0,0 @@ -import hashlib -import hmac -import json -from datetime import datetime -from operator import itemgetter -from typing import Any, Callable, Optional -from urllib.parse import parse_qsl - -from aiogram.types import TelegramObject - - -class WebAppChat(TelegramObject): - """ - This object represents a chat. - - Source: https://core.telegram.org/bots/webapps#webappchat - """ - - id: int - """Unique identifier for this chat. This number may have more than 32 significant bits - and some programming languages may have difficulty/silent defects in interpreting it. - But it has at most 52 significant bits, so a signed 64-bit integer or double-precision - float type are safe for storing this identifier.""" - type: str - """Type of chat, can be either “group”, “supergroup” or “channel”""" - title: str - """Title of the chat""" - username: Optional[str] = None - """Username of the chat""" - photo_url: Optional[str] = None - """URL of the chat’s photo. The photo can be in .jpeg or .svg formats. - Only returned for Web Apps launched from the attachment menu.""" - - -class WebAppUser(TelegramObject): - """ - This object contains the data of the Web App user. - - Source: https://core.telegram.org/bots/webapps#webappuser - """ - - id: int - """A unique identifier for the user or bot. This number may have more than 32 significant bits - and some programming languages may have difficulty/silent defects in interpreting it. - It has at most 52 significant bits, so a 64-bit integer or a double-precision float type - is safe for storing this identifier.""" - is_bot: Optional[bool] = None - """True, if this user is a bot. Returns in the receiver field only.""" - first_name: str - """First name of the user or bot.""" - last_name: Optional[str] = None - """Last name of the user or bot.""" - username: Optional[str] = None - """Username of the user or bot.""" - language_code: Optional[str] = None - """IETF language tag of the user's language. Returns in user field only.""" - is_premium: Optional[bool] = None - """True, if this user is a Telegram Premium user.""" - added_to_attachment_menu: Optional[bool] = None - """True, if this user added the bot to the attachment menu.""" - allows_write_to_pm: Optional[bool] = None - """True, if this user allowed the bot to message them.""" - photo_url: Optional[str] = None - """URL of the user’s profile photo. The photo can be in .jpeg or .svg formats. - Only returned for Web Apps launched from the attachment menu.""" - - -class WebAppInitData(TelegramObject): - """ - This object contains data that is transferred to the Web App when it is opened. - It is empty if the Web App was launched from a keyboard button. - - Source: https://core.telegram.org/bots/webapps#webappinitdata - """ - - query_id: Optional[str] = None - """A unique identifier for the Web App session, required for sending messages - via the answerWebAppQuery method.""" - user: Optional[WebAppUser] = None - """An object containing data about the current user.""" - receiver: Optional[WebAppUser] = None - """An object containing data about the chat partner of the current user in the chat where - the bot was launched via the attachment menu. - Returned only for Web Apps launched via the attachment menu.""" - chat: Optional[WebAppChat] = None - """An object containing data about the chat where the bot was launched via the attachment menu. - Returned for supergroups, channels, and group chats – only for Web Apps launched via the - attachment menu.""" - chat_type: Optional[str] = None - """Type of the chat from which the Web App was opened. - Can be either “sender” for a private chat with the user opening the link, - “private”, “group”, “supergroup”, or “channel”. - Returned only for Web Apps launched from direct links.""" - chat_instance: Optional[str] = None - """Global identifier, uniquely corresponding to the chat from which the Web App was opened. - Returned only for Web Apps launched from a direct link.""" - start_param: Optional[str] = None - """The value of the startattach parameter, passed via link. - Only returned for Web Apps when launched from the attachment menu via link. - The value of the start_param parameter will also be passed in the GET-parameter - tgWebAppStartParam, so the Web App can load the correct interface right away.""" - can_send_after: Optional[int] = None - """Time in seconds, after which a message can be sent via the answerWebAppQuery method.""" - auth_date: datetime - """Unix time when the form was opened.""" - hash: str - """A hash of all passed parameters, which the bot server can use to check their validity.""" - - -def check_webapp_signature(token: str, init_data: str) -> bool: - """ - Check incoming WebApp init data signature - - Source: https://core.telegram.org/bots/webapps#validating-data-received-via-the-web-app - - :param token: bot Token - :param init_data: data from frontend to be validated - :return: - """ - try: - parsed_data = dict(parse_qsl(init_data, strict_parsing=True)) - except ValueError: # pragma: no cover - # Init data is not a valid query string - return False - if "hash" not in parsed_data: - # Hash is not present in init data - return False - hash_ = parsed_data.pop("hash") - - data_check_string = "\n".join( - f"{k}={v}" for k, v in sorted(parsed_data.items(), key=itemgetter(0)) - ) - secret_key = hmac.new(key=b"WebAppData", msg=token.encode(), digestmod=hashlib.sha256) - calculated_hash = hmac.new( - key=secret_key.digest(), msg=data_check_string.encode(), digestmod=hashlib.sha256 - ).hexdigest() - return calculated_hash == hash_ - - -def parse_webapp_init_data( - init_data: str, - *, - loads: Callable[..., Any] = json.loads, -) -> WebAppInitData: - """ - Parse WebApp init data and return it as WebAppInitData object - - This method doesn't make any security check, so you shall not trust to this data, - use :code:`safe_parse_webapp_init_data` instead. - - :param init_data: data from frontend to be parsed - :param loads: - :return: - """ - result = {} - for key, value in parse_qsl(init_data): - if (value.startswith("[") and value.endswith("]")) or ( - value.startswith("{") and value.endswith("}") - ): - value = loads(value) - result[key] = value - return WebAppInitData(**result) - - -def safe_parse_webapp_init_data( - token: str, - init_data: str, - *, - loads: Callable[..., Any] = json.loads, -) -> WebAppInitData: - """ - Validate raw WebApp init data and return it as WebAppInitData object - - Raise :obj:`ValueError` when data is invalid - - :param token: bot token - :param init_data: data from frontend to be parsed and validated - :param loads: - :return: - """ - if check_webapp_signature(token, init_data): - return parse_webapp_init_data(init_data, loads=loads) - raise ValueError("Invalid init data signature") diff --git a/env/Lib/site-packages/aiogram/webhook/__init__.py b/env/Lib/site-packages/aiogram/webhook/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/env/Lib/site-packages/aiogram/webhook/__pycache__/__init__.cpython-311.pyc b/env/Lib/site-packages/aiogram/webhook/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index dccb9cef95cbe09071583172d9e618d2de87d24a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185 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 diff --git a/env/Lib/site-packages/aiogram/webhook/aiohttp_server.py b/env/Lib/site-packages/aiogram/webhook/aiohttp_server.py deleted file mode 100644 index 7caa0e1..0000000 --- a/env/Lib/site-packages/aiogram/webhook/aiohttp_server.py +++ /dev/null @@ -1,295 +0,0 @@ -import asyncio -import secrets -from abc import ABC, abstractmethod -from asyncio import Transport -from typing import Any, Awaitable, Callable, Dict, Optional, Set, Tuple, cast - -from aiohttp import MultipartWriter, web -from aiohttp.abc import Application -from aiohttp.typedefs import Handler -from aiohttp.web_middlewares import middleware - -from aiogram import Bot, Dispatcher, loggers -from aiogram.methods import TelegramMethod -from aiogram.methods.base import TelegramType -from aiogram.types import InputFile -from aiogram.webhook.security import IPFilter - - -def setup_application(app: Application, dispatcher: Dispatcher, /, **kwargs: Any) -> None: - """ - This function helps to configure a startup-shutdown process - - :param app: aiohttp application - :param dispatcher: aiogram dispatcher - :param kwargs: additional data - :return: - """ - workflow_data = { - "app": app, - "dispatcher": dispatcher, - **dispatcher.workflow_data, - **kwargs, - } - - async def on_startup(*a: Any, **kw: Any) -> None: # pragma: no cover - await dispatcher.emit_startup(**workflow_data) - - async def on_shutdown(*a: Any, **kw: Any) -> None: # pragma: no cover - await dispatcher.emit_shutdown(**workflow_data) - - app.on_startup.append(on_startup) - app.on_shutdown.append(on_shutdown) - - -def check_ip(ip_filter: IPFilter, request: web.Request) -> Tuple[str, bool]: - # Try to resolve client IP over reverse proxy - if forwarded_for := request.headers.get("X-Forwarded-For", ""): - # Get the left-most ip when there is multiple ips - # (request got through multiple proxy/load balancers) - # https://github.com/aiogram/aiogram/issues/672 - forwarded_for, *_ = forwarded_for.split(",", maxsplit=1) - return forwarded_for, forwarded_for in ip_filter - - # When reverse proxy is not configured IP address can be resolved from incoming connection - if peer_name := cast(Transport, request.transport).get_extra_info("peername"): - host, _ = peer_name - return host, host in ip_filter - - # Potentially impossible case - return "", False # pragma: no cover - - -def ip_filter_middleware( - ip_filter: IPFilter, -) -> Callable[[web.Request, Handler], Awaitable[Any]]: - """ - - :param ip_filter: - :return: - """ - - @middleware - async def _ip_filter_middleware(request: web.Request, handler: Handler) -> Any: - ip_address, accept = check_ip(ip_filter=ip_filter, request=request) - if not accept: - loggers.webhook.warning("Blocking request from an unauthorized IP: %s", ip_address) - raise web.HTTPUnauthorized() - return await handler(request) - - return _ip_filter_middleware - - -class BaseRequestHandler(ABC): - def __init__( - self, - dispatcher: Dispatcher, - handle_in_background: bool = False, - **data: Any, - ) -> None: - """ - Base handler that helps to handle incoming request from aiohttp - and propagate it to the Dispatcher - - :param dispatcher: instance of :class:`aiogram.dispatcher.dispatcher.Dispatcher` - :param handle_in_background: immediately responds to the Telegram instead of - a waiting end of a handler process - """ - self.dispatcher = dispatcher - self.handle_in_background = handle_in_background - self.data = data - self._background_feed_update_tasks: Set[asyncio.Task[Any]] = set() - - def register(self, app: Application, /, path: str, **kwargs: Any) -> None: - """ - Register route and shutdown callback - - :param app: instance of aiohttp Application - :param path: route path - :param kwargs: - """ - app.on_shutdown.append(self._handle_close) - app.router.add_route("POST", path, self.handle, **kwargs) - - async def _handle_close(self, app: Application) -> None: - await self.close() - - @abstractmethod - async def close(self) -> None: - pass - - @abstractmethod - async def resolve_bot(self, request: web.Request) -> Bot: - """ - This method should be implemented in subclasses of this class. - - Resolve Bot instance from request. - - :param request: - :return: Bot instance - """ - pass - - @abstractmethod - def verify_secret(self, telegram_secret_token: str, bot: Bot) -> bool: - pass - - async def _background_feed_update(self, bot: Bot, update: Dict[str, Any]) -> None: - result = await self.dispatcher.feed_raw_update(bot=bot, update=update, **self.data) - if isinstance(result, TelegramMethod): - await self.dispatcher.silent_call_request(bot=bot, result=result) - - async def _handle_request_background(self, bot: Bot, request: web.Request) -> web.Response: - feed_update_task = asyncio.create_task( - self._background_feed_update( - bot=bot, update=await request.json(loads=bot.session.json_loads) - ) - ) - self._background_feed_update_tasks.add(feed_update_task) - feed_update_task.add_done_callback(self._background_feed_update_tasks.discard) - return web.json_response({}, dumps=bot.session.json_dumps) - - def _build_response_writer( - self, bot: Bot, result: Optional[TelegramMethod[TelegramType]] - ) -> MultipartWriter: - writer = MultipartWriter( - "form-data", - boundary=f"webhookBoundary{secrets.token_urlsafe(16)}", - ) - if not result: - return writer - - payload = writer.append(result.__api_method__) - payload.set_content_disposition("form-data", name="method") - - files: Dict[str, InputFile] = {} - for key, value in result.model_dump(warnings=False).items(): - value = bot.session.prepare_value(value, bot=bot, files=files) - if not value: - continue - payload = writer.append(value) - payload.set_content_disposition("form-data", name=key) - - for key, value in files.items(): - payload = writer.append(value.read(bot)) - payload.set_content_disposition( - "form-data", - name=key, - filename=value.filename or key, - ) - - return writer - - async def _handle_request(self, bot: Bot, request: web.Request) -> web.Response: - result: Optional[TelegramMethod[Any]] = await self.dispatcher.feed_webhook_update( - bot, - await request.json(loads=bot.session.json_loads), - **self.data, - ) - return web.Response(body=self._build_response_writer(bot=bot, result=result)) - - async def handle(self, request: web.Request) -> web.Response: - bot = await self.resolve_bot(request) - if not self.verify_secret(request.headers.get("X-Telegram-Bot-Api-Secret-Token", ""), bot): - return web.Response(body="Unauthorized", status=401) - if self.handle_in_background: - return await self._handle_request_background(bot=bot, request=request) - return await self._handle_request(bot=bot, request=request) - - __call__ = handle - - -class SimpleRequestHandler(BaseRequestHandler): - def __init__( - self, - dispatcher: Dispatcher, - bot: Bot, - handle_in_background: bool = True, - secret_token: Optional[str] = None, - **data: Any, - ) -> None: - """ - Handler for single Bot instance - - :param dispatcher: instance of :class:`aiogram.dispatcher.dispatcher.Dispatcher` - :param handle_in_background: immediately responds to the Telegram instead of - a waiting end of handler process - :param bot: instance of :class:`aiogram.client.bot.Bot` - """ - super().__init__(dispatcher=dispatcher, handle_in_background=handle_in_background, **data) - self.bot = bot - self.secret_token = secret_token - - def verify_secret(self, telegram_secret_token: str, bot: Bot) -> bool: - if self.secret_token: - return secrets.compare_digest(telegram_secret_token, self.secret_token) - return True - - async def close(self) -> None: - """ - Close bot session - """ - await self.bot.session.close() - - async def resolve_bot(self, request: web.Request) -> Bot: - return self.bot - - -class TokenBasedRequestHandler(BaseRequestHandler): - def __init__( - self, - dispatcher: Dispatcher, - handle_in_background: bool = True, - bot_settings: Optional[Dict[str, Any]] = None, - **data: Any, - ) -> None: - """ - Handler that supports multiple bots the context will be resolved - from path variable 'bot_token' - - .. note:: - - This handler is not recommended in due to token is available in URL - and can be logged by reverse proxy server or other middleware. - - :param dispatcher: instance of :class:`aiogram.dispatcher.dispatcher.Dispatcher` - :param handle_in_background: immediately responds to the Telegram instead of - a waiting end of handler process - :param bot_settings: kwargs that will be passed to new Bot instance - """ - super().__init__(dispatcher=dispatcher, handle_in_background=handle_in_background, **data) - if bot_settings is None: - bot_settings = {} - self.bot_settings = bot_settings - self.bots: Dict[str, Bot] = {} - - def verify_secret(self, telegram_secret_token: str, bot: Bot) -> bool: - return True - - async def close(self) -> None: - for bot in self.bots.values(): - await bot.session.close() - - def register(self, app: Application, /, path: str, **kwargs: Any) -> None: - """ - Validate path, register route and shutdown callback - - :param app: instance of aiohttp Application - :param path: route path - :param kwargs: - """ - if "{bot_token}" not in path: - raise ValueError("Path should contains '{bot_token}' substring") - super().register(app, path=path, **kwargs) - - async def resolve_bot(self, request: web.Request) -> Bot: - """ - Get bot token from a path and create or get from cache Bot instance - - :param request: - :return: - """ - token = request.match_info["bot_token"] - if token not in self.bots: - self.bots[token] = Bot(token=token, **self.bot_settings) - return self.bots[token] diff --git a/env/Lib/site-packages/aiogram/webhook/security.py b/env/Lib/site-packages/aiogram/webhook/security.py deleted file mode 100644 index 91d3820..0000000 --- a/env/Lib/site-packages/aiogram/webhook/security.py +++ /dev/null @@ -1,41 +0,0 @@ -from ipaddress import IPv4Address, IPv4Network -from typing import Optional, Sequence, Set, Union - -DEFAULT_TELEGRAM_NETWORKS = [ - IPv4Network("149.154.160.0/20"), - IPv4Network("91.108.4.0/22"), -] - - -class IPFilter: - def __init__(self, ips: Optional[Sequence[Union[str, IPv4Network, IPv4Address]]] = None): - self._allowed_ips: Set[IPv4Address] = set() - - if ips: - self.allow(*ips) - - def allow(self, *ips: Union[str, IPv4Network, IPv4Address]) -> None: - for ip in ips: - self.allow_ip(ip) - - def allow_ip(self, ip: Union[str, IPv4Network, IPv4Address]) -> None: - if isinstance(ip, str): - ip = IPv4Network(ip) if "/" in ip else IPv4Address(ip) - if isinstance(ip, IPv4Address): - self._allowed_ips.add(ip) - elif isinstance(ip, IPv4Network): - self._allowed_ips.update(ip.hosts()) - else: - raise ValueError(f"Invalid type of ipaddress: {type(ip)} ('{ip}')") - - @classmethod - def default(cls) -> "IPFilter": - return cls(DEFAULT_TELEGRAM_NETWORKS) - - def check(self, ip: Union[str, IPv4Address]) -> bool: - if not isinstance(ip, IPv4Address): - ip = IPv4Address(ip) - return ip in self._allowed_ips - - def __contains__(self, item: Union[str, IPv4Address]) -> bool: - return self.check(item) diff --git a/project/bot.py b/project/bot.py index 357653e..a247a55 100644 --- a/project/bot.py +++ b/project/bot.py @@ -29,11 +29,65 @@ def start_command(message): if user: bot.send_message(message.chat.id, f"Ваши данные:\nФИО: {user[0]}\nРоль: {user[1]}") - show_options(message, user[1]) + if user[1] == "Модератор": + show_moderator_options(message) + else: + show_options(message, user[1]) else: msg = bot.send_message(message.chat.id, "Добро пожаловать! Пожалуйста, укажите ваше полное имя.") bot.register_next_step_handler(msg, process_full_name) +# Функция для отображения опций модератора +def show_moderator_options(message): + markup = types.ReplyKeyboardMarkup(one_time_keyboard=True, resize_keyboard=True) + markup.add('Просмотр сообщений', 'Тех. поддержка', 'Старший куратор') + bot.send_message(message.chat.id, "Выберите одну из опций, Модератор:", reply_markup=markup) + + +# Команда для просмотра всех сообщений, на которые можно ответить +@bot.message_handler(func=lambda message: message.text == "Просмотр сообщений") +def view_messages(message): + cursor.execute("SELECT message_id, user_id, message_text FROM messages WHERE moderator_id IS NULL ORDER BY timestamp DESC") + messages = cursor.fetchall() + + if messages: + response = "Сообщения, на которые можно ответить:\n\n" + for msg in messages: + response += f"ID: {msg[0]}\nОт пользователя: {msg[1]}\nСообщение: {msg[2]}\n\n" + else: + response = "Нет сообщений, на которые можно ответить." + + bot.send_message(message.chat.id, response) + +# Команда для ответа на сообщение +@bot.message_handler(commands=['reply']) +def reply_to_user(message): + try: + args = message.text.split(' ', 2) # /reply + message_id = int(args[1]) + response_text = args[2] + + # Получаем информацию о пользователе по ID сообщения + cursor.execute("SELECT user_id FROM messages WHERE message_id = %s", (message_id,)) + user_id = cursor.fetchone() + + if user_id: + user_id = user_id[0] + bot.send_message(user_id, f"Ответ от модератора:\n{response_text}") + + # Обновляем информацию о модераторе, который ответил + cursor.execute( + "UPDATE messages SET moderator_id = %s WHERE message_id = %s", + (message.from_user.id, message_id) + ) + conn.commit() + + bot.send_message(message.chat.id, "Ваш ответ был отправлен пользователю.") + else: + bot.send_message(message.chat.id, "Сообщение с таким ID не найдено.") + except (IndexError, ValueError): + bot.send_message(message.chat.id, "Неверный формат команды. Используйте /reply <текст ответа>.") + # Получаем ФИО пользователя def process_full_name(message): full_name = message.text diff --git a/test.py b/test.py new file mode 100644 index 0000000..c2e5145 --- /dev/null +++ b/test.py @@ -0,0 +1,2 @@ +p = [0, 1] +print(p[2]) \ No newline at end of file