.. towncrier-draft-entries:: |release| [UNRELEASED DRAFT]
Warning
Note that this version has incompatibility with Python 3.8-3.9 in case when you create an instance of Dispatcher outside of the any coroutine.
Sorry for the inconvenience, it will be fixed in the next version.
This code will not work:
dp = Dispatcher()
def main():
...
dp.run_polling(...)
main()
But if you change it like this it should works as well:
router = Router()
async def main():
dp = Dispatcher()
dp.include_router(router)
...
dp.start_polling(...)
asyncio.run(main())
Added missing shortcuts, new enums, reworked old stuff
Breaking All previously added enums is re-generated in new place - aiogram.enums instead of aiogram.types
- Added enums: :class:`aiogram.enums.bot_command_scope_type.BotCommandScopeType`,
:class:`aiogram.enums.chat_action.ChatAction`, :class:`aiogram.enums.chat_member_status.ChatMemberStatus`, :class:`aiogram.enums.chat_type.ChatType`, :class:`aiogram.enums.content_type.ContentType`, :class:`aiogram.enums.dice_emoji.DiceEmoji`, :class:`aiogram.enums.inline_query_result_type.InlineQueryResultType`, :class:`aiogram.enums.input_media_type.InputMediaType`, :class:`aiogram.enums.mask_position_point.MaskPositionPoint`, :class:`aiogram.enums.menu_button_type.MenuButtonType`, :class:`aiogram.enums.message_entity_type.MessageEntityType`, :class:`aiogram.enums.parse_mode.ParseMode`, :class:`aiogram.enums.poll_type.PollType`, :class:`aiogram.enums.sticker_type.StickerType`, :class:`aiogram.enums.topic_icon_color.TopicIconColor`, :class:`aiogram.enums.update_type.UpdateType`,
Added shortcuts:
- Chat :meth:`aiogram.types.chat.Chat.get_administrators`,
- :meth:`aiogram.types.chat.Chat.delete_message`, :meth:`aiogram.types.chat.Chat.revoke_invite_link`, :meth:`aiogram.types.chat.Chat.edit_invite_link`, :meth:`aiogram.types.chat.Chat.create_invite_link`, :meth:`aiogram.types.chat.Chat.export_invite_link`, :meth:`aiogram.types.chat.Chat.do`, :meth:`aiogram.types.chat.Chat.delete_sticker_set`, :meth:`aiogram.types.chat.Chat.set_sticker_set`, :meth:`aiogram.types.chat.Chat.get_member`, :meth:`aiogram.types.chat.Chat.get_member_count`, :meth:`aiogram.types.chat.Chat.leave`, :meth:`aiogram.types.chat.Chat.unpin_all_messages`, :meth:`aiogram.types.chat.Chat.unpin_message`, :meth:`aiogram.types.chat.Chat.pin_message`, :meth:`aiogram.types.chat.Chat.set_administrator_custom_title`, :meth:`aiogram.types.chat.Chat.set_permissions`, :meth:`aiogram.types.chat.Chat.promote`, :meth:`aiogram.types.chat.Chat.restrict`, :meth:`aiogram.types.chat.Chat.unban`, :meth:`aiogram.types.chat.Chat.ban`, :meth:`aiogram.types.chat.Chat.set_description`, :meth:`aiogram.types.chat.Chat.set_title`, :meth:`aiogram.types.chat.Chat.delete_photo`, :meth:`aiogram.types.chat.Chat.set_photo`,
- User: :meth:`aiogram.types.user.User.get_profile_photos`
Added :ref:`callback answer <callback-answer-util>` feature #1091
Added a method that allows you to compactly register routers #1117
- Check status code when downloading file #816
- Fixed ignore_case parameter in :obj:`aiogram.filters.command.Command` filter #1106
Added integration with new code-generator named Butcher #1069
Added full support of Bot API 6.4 #1088
Updated package metadata, moved build internals from Poetry to Hatch, added contributing guides. #1095
Added full support of Bot API 6.5
!DANGER!
Note that :obj:`aiogram.types.chat_permissions.ChatPermissions` is updated without backward compatibility, so now this object has no
can_send_media_messages
attributeReplaced error
TypeError: TelegramEventObserver.__call__() got an unexpected keyword argument '<name>'
with a more understandable one for developers and with a link to the documentation. #1114Added possibility to reply into webhook with files #1120
Reworked graceful shutdown. Added method to stop polling. Now polling started from dispatcher can be stopped by signals gracefully without errors (on Linux and Mac). #1124
(again) Added possibility to combine filters with an and/or operations.
Read more in ":ref:`Combining filters <combining-filters>`" documentation section #1018
Added following methods to
Message
class:Message.forward(...)
Message.edit_media(...)
Message.edit_live_location(...)
Message.stop_live_location(...)
Message.pin(...)
Message.unpin()
Added following methods to
User
class:User.mention_markdown(...)
User.mention_html(...)
Added full support of Bot API 6.3 #1057
Fixed
Message.send_invoice
andMessage.reply_invoice
, added missing arguments #1047Fixed copy and forward in:
Message.answer(...)
Message.copy_to(...)
- Fixed UA translations in index.po #1017
- Fix typehints for
Message
,reply_media_group
andanswer_media_group
methods #1029 - Removed an old now non-working feature #1060
- Enabled testing on Python 3.11 #1044
- Added a mandatory dependency
certifi
in due to in some cases on systems that doesn't have updated ca-certificates the requests to Bot API fails with reason[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain
#1066
- Add PyPy support and run tests under PyPy #985
- Added message text to aiogram exceptions representation #988
- Added warning about using magic filter from magic_filter instead of aiogram's ones. Is recommended to use from aiogram import F instead of from magic_filter import F #990
- Added more detailed error when server response can't be deserialized. This feature will help to debug unexpected responses from the Server #1014
- Reworked error event, introduced :class:`aiogram.types.error_event.ErrorEvent` object. #898
- Fixed escaping markdown in aiogram.utils.markdown module #903
- Fixed polling crash when Telegram Bot API raises HTTP 429 status-code. #995
- Fixed empty mention in command parsing, now it will be None instead of an empty string #1013
- Initialized Docs translation (added Ukrainian language) #925
- Removed filters factory as described in corresponding issue. #942
- Now Router/Dispatcher accepts only keyword arguments. #982
Add class helper ChatAction for constants that Telegram BotAPI uses in sendChatAction request. In my opinion, this will help users and will also improve compatibility with 2.x version where similar class was called "ChatActions". #803
Added possibility to combine filters or invert result
Example:
Text(text="demo") | Command(commands=["demo"]) MyFilter() & AnotherFilter() ~StateFilter(state='my-state')
Fixed type hints for redis TTL params. #922
Added full_name shortcut for Chat object #929
Fixed false-positive coercing of Union types in API methods #901
Added 3 missing content types:
- proximity_alert_triggered
- supergroup_chat_created
- channel_chat_created
Fixed the ability to compare the state, now comparison to copy of the state will return True. #927
Fixed default lock kwargs in RedisEventIsolation. #972
Restrict including routers with strings #896
Changed CommandPatterType to CommandPatternType in aiogram/dispatcher/filters/command.py #907
Added full support of Bot API 6.1 #936
Breaking! More flat project structure
These packages was moved, imports in your code should be fixed:
aiogram.dispatcher.filters
->aiogram.filters
aiogram.dispatcher.fsm
->aiogram.fsm
aiogram.dispatcher.handler
->aiogram.handler
aiogram.dispatcher.webhook
->aiogram.webhook
aiogram.dispatcher.flags/*
->aiogram.dispatcher.flags
(single module instead of package)
Removed deprecated
router.<event>_handler
androuter.register_<event>_handler
methods. #941Deprecated filters factory. It will be removed in next Beta (3.0b5) #942
MessageEntity method get_text was removed and extract was renamed to extract_from #944
Added full support of Bot API 6.2 #975
- Added possibility to get command magic result as handler argument #889
- Added full support of Telegram Bot API 6.0 #890
- Fixed I18n lazy-proxy. Disabled caching. #839
- Added parsing of spoiler message entity #865
- Fixed default parse_mode for Message.copy_to() method. #876
- Fixed CallbackData factory parsing IntEnum's #885
- Added automated check that pull-request adds a changes description to CHANGES directory #873
- Changed
Message.html_text
andMessage.md_text
attributes behaviour when message has no text. The empty string will be used instead of raising error. #874 - Used redis-py instead of aioredis package in due to this packages was merged into single one #882
- Solved common naming problem with middlewares that confusing too much developers - now you can't see the middleware and middlewares attributes at the same point because this functionality encapsulated to special interface. #883
Added possibility to pass additional arguments into the aiohttp webhook handler to use this arguments inside handlers as the same as it possible in polling mode. #785
Added possibility to add handler flags via decorator (like pytest.mark decorator but aiogram.flags) #836
Added
ChatActionSender
utility to automatically sends chat action while long process is running.It also can be used as message middleware and can be customized via
chat_action
flag. #837
- Logger name for processing events is changed to
aiogram.events
. #830 - Added full support of Telegram Bot API 5.6 and 5.7 #835
- BREAKING Events isolation mechanism is moved from FSM storages to standalone managers #838
Added new custom operation for MagicFilter named
as_
Now you can use it to get magic filter result as handler argument
from aiogram import F ... @router.message(F.text.regexp(r"^(\d+)$").as_("digits")) async def any_digits_handler(message: Message, digits: Match[str]): await message.answer(html.quote(str(digits))) @router.message(F.photo[-1].as_("photo")) async def download_photos_handler(message: Message, photo: PhotoSize, bot: Bot): content = await bot.download(photo)
- Fixed: Missing
ChatMemberHandler
import inaiogram/dispatcher/handler
#751
- Check
destiny
in case of nowith_destiny
enabled in RedisStorage key builder #776 - Added full support of Bot API 5.5 #777
- Stop using feature from #336. From now settings of client-session should be placed as initializer arguments instead of changing instance attributes. #778
- Make TelegramAPIServer files wrapper in local mode bi-directional (server-client, client-server) Now you can convert local path to server path and server path to local path. #779
Breaking: Changed the signature of the session middlewares Breaking: Renamed AiohttpSession.make_request method parameter from call to method to match the naming in the base class Added middleware for logging outgoing requests #716
Improved description of filters resolving error. For example when you try to pass wrong type of argument to the filter but don't know why filter is not resolved now you can get error like this:
aiogram.exceptions.FiltersResolveError: Unknown keyword filters: {'content_types'} Possible cases: - 1 validation error for ContentTypesFilter content_types Invalid content types {'42'} is not allowed here (type=value_error)
Breaking internal API change Reworked FSM Storage record keys propagation #723
Implemented new filter named
MagicData(magic_data)
that helps to filter event by data from middlewares or other filtersFor example your bot is running with argument named
config
that contains the application config then you can filter event by value from this config:@router.message(magic_data=F.event.from_user.id == F.config.admin_id) ...
- Fixed I18n context inside error handlers #726
- Fixed bot session closing before emit shutdown #734
- Fixed: bound filter resolving does not require children routers #736
Enabled testing on Python 3.10 Removed async_lru dependency (is incompatible with Python 3.10) and replaced usage with protected property #719
Converted README.md to README.rst and use it as base file for docs #725
Rework filters resolving:
- Automatically apply Bound Filters with default values to handlers
- Fix data transfer from parent to included routers filters
Added full support of Bot API 5.4 https://core.telegram.org/bots/api-changelog#november-5-2021 #744
- Added
html_text
andmd_text
to Message object #708 - Refactored I18n, added context managers for I18n engine and current locale #709
Added support of local Bot API server files downloading
When Local API is enabled files can be downloaded via bot.download/bot.download_file methods. #698
Implemented I18n & L10n support #701
Covered by tests and docs KeyboardBuilder util #699
Breaking!!!. Refactored and renamed exceptions.
- Exceptions module was moved from
aiogram.utils.exceptions
toaiogram.exceptions
- Added prefix Telegram for all error classes
- Exceptions module was moved from
Replaced all
pragma: no cover
marks via global.coveragerc
config #702Updated dependencies.
Breaking for framework developers Now all optional dependencies should be installed as extra: poetry install -E fast -E redis -E proxy -E i18n -E docs #703
- Ability to iterate over all states in StatesGroup. Aiogram already had in check for states group so this is relative feature. #666
- Fixed incorrect type checking in the :class:`aiogram.utils.keyboard.KeyboardBuilder` #674
- Disable ContentType filter by default #668
- Moved update type detection from Dispatcher to Update object #669
- Updated pre-commit config #681
- Reworked handlers_in_use util. Function moved to Router as method .resolve_used_update_types() #682
- add aliases for edit/delete reply markup to Message #662
- Reworked outer middleware chain. Prevent to call many times the outer middleware for each nested router #664
- Prepare parse mode for InputMessageContent in AnswerInlineQuery method #660
- Added integration with
towncrier
#602