Compare commits

...

15 commits

Author SHA1 Message Date
JRoot Junior
e4d3692ac2
Bump changelog
Some checks failed
Tests / tests (macos-latest, 3.10) (push) Has been cancelled
Tests / tests (macos-latest, 3.11) (push) Has been cancelled
Tests / tests (macos-latest, 3.12) (push) Has been cancelled
Tests / tests (macos-latest, 3.13) (push) Has been cancelled
Tests / tests (macos-latest, 3.14) (push) Has been cancelled
Tests / tests (ubuntu-latest, 3.10) (push) Has been cancelled
Tests / tests (ubuntu-latest, 3.11) (push) Has been cancelled
Tests / tests (ubuntu-latest, 3.12) (push) Has been cancelled
Tests / tests (ubuntu-latest, 3.13) (push) Has been cancelled
Tests / tests (ubuntu-latest, 3.14) (push) Has been cancelled
Tests / tests (windows-latest, 3.10) (push) Has been cancelled
Tests / tests (windows-latest, 3.11) (push) Has been cancelled
Tests / tests (windows-latest, 3.12) (push) Has been cancelled
Tests / tests (windows-latest, 3.13) (push) Has been cancelled
Tests / tests (windows-latest, 3.14) (push) Has been cancelled
Tests / pypy-tests (macos-latest, pypy3.10) (push) Has been cancelled
Tests / pypy-tests (macos-latest, pypy3.11) (push) Has been cancelled
Tests / pypy-tests (ubuntu-latest, pypy3.10) (push) Has been cancelled
Tests / pypy-tests (ubuntu-latest, pypy3.11) (push) Has been cancelled
2026-04-04 01:54:58 +03:00
m-xim
19a6131618
Remove redundant list() around sorted() and fix router type name in validation error message (#1788)
* Remove redundant list() around sorted()

* Fix type name in error message for router type validation

* Add changelog
2026-04-04 01:42:04 +03:00
Temrjan
0611d0d953
fix: CommandStart(deep_link=False) now rejects deep-link arguments (#1790)
Previously the deep_link parameter only had two effective states:
False (default) accepted any /start command regardless of arguments,
and True required arguments to be present.

Change the default to None (accept both, backward compatible) so that
False can mean "reject if deep-link arguments are present", which is
the intuitive expectation when explicitly passing deep_link=False.

Closes #1713

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 01:27:29 +03:00
Sergey Maranchuk
d5bd0b98a3
Fix HtmlDecoration attribute name for custom emoji method (#1782) (#1783) 2026-04-04 01:27:16 +03:00
Aleksandr Zainulgabidinov
875f37f780
Feature/eq method for default (#1789)
* Add changelog for #1707

* Add __eq__ and __hash__ methods to the Default class

* Add tests for the eq and hash methods to the TestDefault
2026-04-04 01:24:34 +03:00
Alex Root Junior
9f49c0413f
Added full support for the Bot API 9.6 (#1792)
* Added full support for the Bot API 9.6

* Add support for `managed_bot` updates

* Set `description_parse_mode` default to `"parse_mode"` and use `DateTime` for `addition_date` in `PollOption`

* Update changelog with features and changes from Bot API 9.6

* Add changelog fragment generator and update poll parameter descriptions
2026-04-04 01:22:08 +03:00
NasrollahYusefi
00c1130938
Correct release version number in CHANGES.rst (#1784)
Co-authored-by: unknown <nasrollahjusefi@gmail.com>
2026-03-07 13:34:21 +02:00
JRoot Junior
3e2ca5b6b0
Bump changelog 2026-03-03 01:26:18 +02:00
JRoot Junior
49eac319a3
Optimize imports in aiogram/types/base.py 2026-03-03 01:24:55 +02:00
Bogdan I
bd75ae361e
Fix protected namespace warning for model_custom_emoji_id (#1775)
* fix UserWarning, model_custom_emoji_id

* Add changelog for #1772
2026-03-03 01:24:05 +02:00
Alex Root Junior
f68c24d620
Added support for Telegram Bot API 9.5 (#1780)
* Update API methods and types for Telegram Bot API 9.5

* Draft: follow-up for Bot API 9.5 (#1780) (#1781)

* Add set_chat_member_tag shortcut coverage

* Add set_member_tag shortcut tests and align decoration expectations

* Fix follow-up test coverage for sender_tag and can_edit_tag

* Add changelog fragment for PR 1781

* Align changelog with base PR #1780

* Expand 1780 changelog to cover base and follow-up scope

* Treat sender_tag as metadata, not message content type

---------

Co-authored-by: Latand <latand@users.noreply.github.com>
Co-authored-by: Codex Agent <codex@openclaw.local>

* Add tests for date_time formatting with Unix time and datetime objects

* Update changelog with Telegram Bot API 9.5 changes

---------

Co-authored-by: Kostiantyn Kriuchkov <36363097+Latand@users.noreply.github.com>
Co-authored-by: Latand <latand@users.noreply.github.com>
Co-authored-by: Codex Agent <codex@openclaw.local>
2026-03-03 01:19:11 +02:00
Kostiantyn Kriuchkov
73710acb4c
Preserve middleware data across scene transitions (#1687) (#1766)
* Preserve middleware context across scene goto transitions (#1687)

* Add After.goto coverage for scene middleware context (#1687)
2026-02-15 20:24:34 +02:00
Kostiantyn Kriuchkov
e37eddbe8c
Document webhook proxy trust model (#47) (#1765) 2026-02-15 20:24:15 +02:00
Kostiantyn Kriuchkov
fa844fce59
Add icon and style args to keyboard builders (#1769) 2026-02-15 20:22:56 +02:00
Kostiantyn Kriuchkov
c73db32e86
Add AGENTS/CLAUDE contributor instructions for dev-3.x (#1767)
* Add AGENTS and CLAUDE contributor guidance

* Update AGENTS.md to include code style enforcement via Ruff

* Remove unnecessary AGENTS.md guidance
2026-02-15 20:22:15 +02:00
160 changed files with 4426 additions and 410 deletions

View file

@ -1 +1 @@
9.4
9.6

View file

@ -39,6 +39,7 @@ extract:
- reply_to_story
- business_connection_id
- sender_business_bot
- sender_tag
- is_from_offline
- has_media_spoiler
- effect_id
@ -48,3 +49,4 @@ extract:
- reply_to_checklist_task_id
- suggested_post_info
- is_paid_post
- reply_to_poll_option_id

View file

@ -1,8 +1,8 @@
{
"meta": {},
"group": {
"title": "Inline mode",
"anchor": "inline-mode"
"title": "Available methods",
"anchor": "available-methods"
},
"object": {
"anchor": "answerwebappquery",

View file

@ -47,8 +47,8 @@
"type": "InlineKeyboardMarkup",
"required": false,
"description": "A JSON-serialized object for the new inline keyboard for the message",
"html_description": "<td>A JSON-serialized object for the new inline keyboard for the message</td>",
"rst_description": "A JSON-serialized object for the new inline keyboard for the message\n",
"html_description": "<td>A JSON-serialized object for the new <a href=\"/bots/features#inline-keyboards\">inline keyboard</a> for the message</td>",
"rst_description": "A JSON-serialized object for the new `inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_ for the message\n",
"name": "reply_markup"
}
],

View file

@ -0,0 +1,25 @@
{
"meta": {},
"group": {
"title": "Available methods",
"anchor": "available-methods"
},
"object": {
"anchor": "getmanagedbottoken",
"name": "getManagedBotToken",
"description": "Use this method to get the token of a managed bot. Returns the token as String on success.",
"html_description": "<p>Use this method to get the token of a managed bot. Returns the token as <em>String</em> on success.</p>",
"rst_description": "Use this method to get the token of a managed bot. Returns the token as *String* on success.",
"annotations": [
{
"type": "Integer",
"required": true,
"description": "User identifier of the managed bot whose token will be returned",
"html_description": "<td>User identifier of the managed bot whose token will be returned</td>",
"rst_description": "User identifier of the managed bot whose token will be returned\n",
"name": "user_id"
}
],
"category": "methods"
}
}

View file

@ -46,17 +46,17 @@
{
"type": "String",
"required": false,
"description": "Mode for parsing entities in the text. See formatting options for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.",
"html_description": "<td>Mode for parsing entities in the text. See <a href=\"#formatting-options\">formatting options</a> for more details. Entities other than &#8220;bold&#8221;, &#8220;italic&#8221;, &#8220;underline&#8221;, &#8220;strikethrough&#8221;, &#8220;spoiler&#8221;, and &#8220;custom_emoji&#8221; are ignored.</td>",
"rst_description": "Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.\n",
"description": "Mode for parsing entities in the text. See formatting options for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored.",
"html_description": "<td>Mode for parsing entities in the text. See <a href=\"#formatting-options\">formatting options</a> for more details. Entities other than &#8220;bold&#8221;, &#8220;italic&#8221;, &#8220;underline&#8221;, &#8220;strikethrough&#8221;, &#8220;spoiler&#8221;, &#8220;custom_emoji&#8221;, and &#8220;date_time&#8221; are ignored.</td>",
"rst_description": "Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored.\n",
"name": "text_parse_mode"
},
{
"type": "Array of MessageEntity",
"required": false,
"description": "A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of text_parse_mode. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.",
"html_description": "<td>A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than &#8220;bold&#8221;, &#8220;italic&#8221;, &#8220;underline&#8221;, &#8220;strikethrough&#8221;, &#8220;spoiler&#8221;, and &#8220;custom_emoji&#8221; are ignored.</td>",
"rst_description": "A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of *text_parse_mode*. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.\n",
"description": "A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of text_parse_mode. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored.",
"html_description": "<td>A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than &#8220;bold&#8221;, &#8220;italic&#8221;, &#8220;underline&#8221;, &#8220;strikethrough&#8221;, &#8220;spoiler&#8221;, &#8220;custom_emoji&#8221;, and &#8220;date_time&#8221; are ignored.</td>",
"rst_description": "A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of *text_parse_mode*. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored.\n",
"name": "text_entities"
}
],

View file

@ -154,6 +154,14 @@
"html_description": "<td>Pass <em>True</em> if the administrator can manage direct messages within the channel and decline suggested posts; for channels only</td>",
"rst_description": "Pass :code:`True` if the administrator can manage direct messages within the channel and decline suggested posts; for channels only\n",
"name": "can_manage_direct_messages"
},
{
"type": "Boolean",
"required": false,
"description": "Pass True if the administrator can edit the tags of regular members; for groups and supergroups only",
"html_description": "<td>Pass <em>True</em> if the administrator can edit the tags of regular members; for groups and supergroups only</td>",
"rst_description": "Pass :code:`True` if the administrator can edit the tags of regular members; for groups and supergroups only\n",
"name": "can_manage_tags"
}
],
"category": "methods"

View file

@ -0,0 +1,25 @@
{
"meta": {},
"group": {
"title": "Available methods",
"anchor": "available-methods"
},
"object": {
"anchor": "replacemanagedbottoken",
"name": "replaceManagedBotToken",
"description": "Use this method to revoke the current token of a managed bot and generate a new one. Returns the new token as String on success.",
"html_description": "<p>Use this method to revoke the current token of a managed bot and generate a new one. Returns the new token as <em>String</em> on success.</p>",
"rst_description": "Use this method to revoke the current token of a managed bot and generate a new one. Returns the new token as *String* on success.",
"annotations": [
{
"type": "Integer",
"required": true,
"description": "User identifier of the managed bot whose token will be replaced",
"html_description": "<td>User identifier of the managed bot whose token will be replaced</td>",
"rst_description": "User identifier of the managed bot whose token will be replaced\n",
"name": "user_id"
}
],
"category": "methods"
}
}

View file

@ -1,8 +1,8 @@
{
"meta": {},
"group": {
"title": "Inline mode",
"anchor": "inline-mode"
"title": "Available methods",
"anchor": "available-methods"
},
"object": {
"anchor": "savepreparedinlinemessage",

View file

@ -0,0 +1,33 @@
{
"meta": {},
"group": {
"title": "Available methods",
"anchor": "available-methods"
},
"object": {
"anchor": "savepreparedkeyboardbutton",
"name": "savePreparedKeyboardButton",
"description": "Stores a keyboard button that can be used by a user within a Mini App. Returns a PreparedKeyboardButton object.",
"html_description": "<p>Stores a keyboard button that can be used by a user within a Mini App. Returns a <a href=\"#preparedkeyboardbutton\">PreparedKeyboardButton</a> object.</p>",
"rst_description": "Stores a keyboard button that can be used by a user within a Mini App. Returns a :class:`aiogram.types.prepared_keyboard_button.PreparedKeyboardButton` object.",
"annotations": [
{
"type": "Integer",
"required": true,
"description": "Unique identifier of the target user that can use the button",
"html_description": "<td>Unique identifier of the target user that can use the button</td>",
"rst_description": "Unique identifier of the target user that can use the button\n",
"name": "user_id"
},
{
"type": "KeyboardButton",
"required": true,
"description": "A JSON-serialized object describing the button to be saved. The button must be of the type request_users, request_chat, or request_managed_bot",
"html_description": "<td>A JSON-serialized object describing the button to be saved. The button must be of the type <em>request_users</em>, <em>request_chat</em>, or <em>request_managed_bot</em></td>",
"rst_description": "A JSON-serialized object describing the button to be saved. The button must be of the type *request_users*, *request_chat*, or *request_managed_bot*\n",
"name": "button"
}
],
"category": "methods"
}
}

View file

@ -71,8 +71,8 @@
"type": "InlineKeyboardMarkup",
"required": false,
"description": "A JSON-serialized object for an inline keyboard",
"html_description": "<td>A JSON-serialized object for an inline keyboard</td>",
"rst_description": "A JSON-serialized object for an inline keyboard\n",
"html_description": "<td>A JSON-serialized object for an <a href=\"/bots/features#inline-keyboards\">inline keyboard</a></td>",
"rst_description": "A JSON-serialized object for an `inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_\n",
"name": "reply_markup"
}
],

View file

@ -54,17 +54,17 @@
{
"type": "String",
"required": false,
"description": "Mode for parsing entities in the text. See formatting options for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.",
"html_description": "<td>Mode for parsing entities in the text. See <a href=\"#formatting-options\">formatting options</a> for more details. Entities other than &#8220;bold&#8221;, &#8220;italic&#8221;, &#8220;underline&#8221;, &#8220;strikethrough&#8221;, &#8220;spoiler&#8221;, and &#8220;custom_emoji&#8221; are ignored.</td>",
"rst_description": "Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.\n",
"description": "Mode for parsing entities in the text. See formatting options for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored.",
"html_description": "<td>Mode for parsing entities in the text. See <a href=\"#formatting-options\">formatting options</a> for more details. Entities other than &#8220;bold&#8221;, &#8220;italic&#8221;, &#8220;underline&#8221;, &#8220;strikethrough&#8221;, &#8220;spoiler&#8221;, &#8220;custom_emoji&#8221;, and &#8220;date_time&#8221; are ignored.</td>",
"rst_description": "Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored.\n",
"name": "text_parse_mode"
},
{
"type": "Array of MessageEntity",
"required": false,
"description": "A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of text_parse_mode. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.",
"html_description": "<td>A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than &#8220;bold&#8221;, &#8220;italic&#8221;, &#8220;underline&#8221;, &#8220;strikethrough&#8221;, &#8220;spoiler&#8221;, and &#8220;custom_emoji&#8221; are ignored.</td>",
"rst_description": "A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of *text_parse_mode*. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.\n",
"description": "A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of text_parse_mode. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored.",
"html_description": "<td>A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of <em>text_parse_mode</em>. Entities other than &#8220;bold&#8221;, &#8220;italic&#8221;, &#8220;underline&#8221;, &#8220;strikethrough&#8221;, &#8220;spoiler&#8221;, &#8220;custom_emoji&#8221;, and &#8220;date_time&#8221; are ignored.</td>",
"rst_description": "A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of *text_parse_mode*. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored.\n",
"name": "text_entities"
}
],

View file

@ -7,9 +7,9 @@
"object": {
"anchor": "sendmessagedraft",
"name": "sendMessageDraft",
"description": "Use this method to stream a partial message to a user while the message is being generated; supported only for bots with forum topic mode enabled. Returns True on success.",
"html_description": "<p>Use this method to stream a partial message to a user while the message is being generated; supported only for bots with forum topic mode enabled. Returns <em>True</em> on success.</p>",
"rst_description": "Use this method to stream a partial message to a user while the message is being generated; supported only for bots with forum topic mode enabled. Returns :code:`True` on success.",
"description": "Use this method to stream a partial message to a user while the message is being generated. Returns True on success.",
"html_description": "<p>Use this method to stream a partial message to a user while the message is being generated. Returns <em>True</em> on success.</p>",
"rst_description": "Use this method to stream a partial message to a user while the message is being generated. Returns :code:`True` on success.",
"annotations": [
{
"type": "Integer",

View file

@ -1,3 +1,4 @@
explanation_parse_mode: parse_mode
question_parse_mode: parse_mode
description_parse_mode: parse_mode
protect_content: protect_content

View file

@ -86,18 +86,50 @@
{
"type": "Boolean",
"required": false,
"description": "True, if the poll allows multiple answers, ignored for polls in quiz mode, defaults to False",
"html_description": "<td><em>True</em>, if the poll allows multiple answers, ignored for polls in quiz mode, defaults to <em>False</em></td>",
"rst_description": ":code:`True`, if the poll allows multiple answers, ignored for polls in quiz mode, defaults to :code:`False`\n",
"description": "Pass True, if the poll allows multiple answers, defaults to False",
"html_description": "<td>Pass <em>True</em>, if the poll allows multiple answers, defaults to <em>False</em></td>",
"rst_description": "Pass :code:`True`, if the poll allows multiple answers, defaults to :code:`False`\n",
"name": "allows_multiple_answers"
},
{
"type": "Integer",
"type": "Boolean",
"required": false,
"description": "0-based identifier of the correct answer option, required for polls in quiz mode",
"html_description": "<td>0-based identifier of the correct answer option, required for polls in quiz mode</td>",
"rst_description": "0-based identifier of the correct answer option, required for polls in quiz mode\n",
"name": "correct_option_id"
"description": "Pass True, if the poll allows to change chosen answer options, defaults to False for quizzes and to True for regular polls",
"html_description": "<td>Pass <em>True</em>, if the poll allows to change chosen answer options, defaults to <em>False</em> for quizzes and to <em>True</em> for regular polls</td>",
"rst_description": "Pass :code:`True`, if the poll allows to change chosen answer options, defaults to :code:`False` for quizzes and to :code:`True` for regular polls\n",
"name": "allows_revoting"
},
{
"type": "Boolean",
"required": false,
"description": "Pass True, if the poll options must be shown in random order",
"html_description": "<td>Pass <em>True</em>, if the poll options must be shown in random order</td>",
"rst_description": "Pass :code:`True`, if the poll options must be shown in random order\n",
"name": "shuffle_options"
},
{
"type": "Boolean",
"required": false,
"description": "Pass True, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes",
"html_description": "<td>Pass <em>True</em>, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes</td>",
"rst_description": "Pass :code:`True`, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes\n",
"name": "allow_adding_options"
},
{
"type": "Boolean",
"required": false,
"description": "Pass True, if poll results must be shown only after the poll closes",
"html_description": "<td>Pass <em>True</em>, if poll results must be shown only after the poll closes</td>",
"rst_description": "Pass :code:`True`, if poll results must be shown only after the poll closes\n",
"name": "hide_results_until_closes"
},
{
"type": "Array of Integer",
"required": false,
"description": "A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, required for polls in quiz mode",
"html_description": "<td>A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, required for polls in quiz mode</td>",
"rst_description": "A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, required for polls in quiz mode\n",
"name": "correct_option_ids"
},
{
"type": "String",
@ -126,17 +158,17 @@
{
"type": "Integer",
"required": false,
"description": "Amount of time in seconds the poll will be active after creation, 5-600. Can't be used together with close_date.",
"html_description": "<td>Amount of time in seconds the poll will be active after creation, 5-600. Can't be used together with <em>close_date</em>.</td>",
"rst_description": "Amount of time in seconds the poll will be active after creation, 5-600. Can't be used together with *close_date*.\n",
"description": "Amount of time in seconds the poll will be active after creation, 5-2628000. Can't be used together with close_date.",
"html_description": "<td>Amount of time in seconds the poll will be active after creation, 5-2628000. Can't be used together with <em>close_date</em>.</td>",
"rst_description": "Amount of time in seconds the poll will be active after creation, 5-2628000. Can't be used together with *close_date*.\n",
"name": "open_period"
},
{
"type": "Integer",
"required": false,
"description": "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.",
"html_description": "<td>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 <em>open_period</em>.</td>",
"rst_description": "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*.\n",
"description": "Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 2628000 seconds in the future. Can't be used together with open_period.",
"html_description": "<td>Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 2628000 seconds in the future. Can't be used together with <em>open_period</em>.</td>",
"rst_description": "Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 2628000 seconds in the future. Can't be used together with *open_period*.\n",
"name": "close_date"
},
{
@ -147,6 +179,30 @@
"rst_description": "Pass :code:`True` if the poll needs to be immediately closed. This can be useful for poll preview.\n",
"name": "is_closed"
},
{
"type": "String",
"required": false,
"description": "Description of the poll to be sent, 0-1024 characters after entities parsing",
"html_description": "<td>Description of the poll to be sent, 0-1024 characters after entities parsing</td>",
"rst_description": "Description of the poll to be sent, 0-1024 characters after entities parsing\n",
"name": "description"
},
{
"type": "String",
"required": false,
"description": "Mode for parsing entities in the poll description. See formatting options for more details.",
"html_description": "<td>Mode for parsing entities in the poll description. See <a href=\"#formatting-options\">formatting options</a> for more details.</td>",
"rst_description": "Mode for parsing entities in the poll description. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details.\n",
"name": "description_parse_mode"
},
{
"type": "Array of MessageEntity",
"required": false,
"description": "A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of description_parse_mode",
"html_description": "<td>A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of <em>description_parse_mode</em></td>",
"rst_description": "A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of *description_parse_mode*\n",
"name": "description_entities"
},
{
"type": "Boolean",
"required": false,
@ -207,6 +263,18 @@
"release_date": "2023-12-29"
}
},
{
"type": "Integer",
"required": false,
"description": "0-based identifier of the correct answer option, required for polls in quiz mode",
"html_description": "<td>0-based identifier of the correct answer option, required for polls in quiz mode</td>",
"rst_description": "0-based identifier of the correct answer option, required for polls in quiz mode\n",
"name": "correct_option_id",
"deprecated": {
"version": "9.6",
"release_date": "2026-04-03"
}
},
{
"type": "Integer",
"required": false,

View file

@ -0,0 +1,41 @@
{
"meta": {},
"group": {
"title": "Available methods",
"anchor": "available-methods"
},
"object": {
"anchor": "setchatmembertag",
"name": "setChatMemberTag",
"description": "Use this method to set a tag for a regular member in a group or a supergroup. The bot must be an administrator in the chat for this to work and must have the can_manage_tags administrator right. Returns True on success.",
"html_description": "<p>Use this method to set a tag for a regular member in a group or a supergroup. The bot must be an administrator in the chat for this to work and must have the <em>can_manage_tags</em> administrator right. Returns <em>True</em> on success.</p>",
"rst_description": "Use this method to set a tag for a regular member in a group or a supergroup. The bot must be an administrator in the chat for this to work and must have the *can_manage_tags* administrator right. Returns :code:`True` on success.",
"annotations": [
{
"type": "Integer or String",
"required": true,
"description": "Unique identifier for the target chat or username of the target supergroup (in the format @supergroupusername)",
"html_description": "<td>Unique identifier for the target chat or username of the target supergroup (in the format <code>@supergroupusername</code>)</td>",
"rst_description": "Unique identifier for the target chat or username of the target supergroup (in the format :code:`@supergroupusername`)\n",
"name": "chat_id"
},
{
"type": "Integer",
"required": true,
"description": "Unique identifier of the target user",
"html_description": "<td>Unique identifier of the target user</td>",
"rst_description": "Unique identifier of the target user\n",
"name": "user_id"
},
{
"type": "String",
"required": false,
"description": "New tag for the member; 0-16 characters, emoji are not allowed",
"html_description": "<td>New tag for the member; 0-16 characters, emoji are not allowed</td>",
"rst_description": "New tag for the member; 0-16 characters, emoji are not allowed\n",
"name": "tag"
}
],
"category": "methods"
}
}

File diff suppressed because it is too large Load diff

View file

@ -71,6 +71,10 @@ set_administrator_custom_title:
method: setChatAdministratorCustomTitle
fill: *self
set_member_tag:
method: setChatMemberTag
fill: *self
set_permissions:
method: setChatPermissions
fill: *self

View file

@ -138,6 +138,14 @@
"rst_description": "*Optional*. :code:`True`, if the administrator can manage direct messages of the channel and decline suggested posts; for channels only\n",
"name": "can_manage_direct_messages",
"required": false
},
{
"type": "Boolean",
"description": "True, if the administrator can edit the tags of regular members; for groups and supergroups only. If omitted defaults to the value of can_pin_messages.",
"html_description": "<td><em>Optional</em>. <em>True</em>, if the administrator can edit the tags of regular members; for groups and supergroups only. If omitted defaults to the value of can_pin_messages.</td>",
"rst_description": "*Optional*. :code:`True`, if the administrator can edit the tags of regular members; for groups and supergroups only. If omitted defaults to the value of can_pin_messages.\n",
"name": "can_manage_tags",
"required": false
}
],
"category": "types"

View file

@ -163,6 +163,14 @@
"name": "can_manage_direct_messages",
"required": false
},
{
"type": "Boolean",
"description": "True, if the administrator can edit the tags of regular members; for groups and supergroups only. If omitted defaults to the value of can_pin_messages.",
"html_description": "<td><em>Optional</em>. <em>True</em>, if the administrator can edit the tags of regular members; for groups and supergroups only. If omitted defaults to the value of can_pin_messages.</td>",
"rst_description": "*Optional*. :code:`True`, if the administrator can edit the tags of regular members; for groups and supergroups only. If omitted defaults to the value of can_pin_messages.\n",
"name": "can_manage_tags",
"required": false
},
{
"type": "String",
"description": "Custom title for this user",

View file

@ -19,6 +19,14 @@
"name": "status",
"required": true
},
{
"type": "String",
"description": "Tag of the member",
"html_description": "<td><em>Optional</em>. Tag of the member</td>",
"rst_description": "*Optional*. Tag of the member\n",
"name": "tag",
"required": false
},
{
"type": "User",
"description": "Information about the user",

View file

@ -19,6 +19,14 @@
"name": "status",
"required": true
},
{
"type": "String",
"description": "Tag of the member",
"html_description": "<td><em>Optional</em>. Tag of the member</td>",
"rst_description": "*Optional*. Tag of the member\n",
"name": "tag",
"required": false
},
{
"type": "User",
"description": "Information about the user",
@ -115,6 +123,14 @@
"name": "can_add_web_page_previews",
"required": true
},
{
"type": "Boolean",
"description": "True, if the user is allowed to edit their own tag",
"html_description": "<td><em>True</em>, if the user is allowed to edit their own tag</td>",
"rst_description": ":code:`True`, if the user is allowed to edit their own tag\n",
"name": "can_edit_tag",
"required": true
},
{
"type": "Boolean",
"description": "True, if the user is allowed to change the chat title, photo and other settings",

View file

@ -91,6 +91,14 @@
"name": "can_add_web_page_previews",
"required": false
},
{
"type": "Boolean",
"description": "True, if the user is allowed to edit their own tag",
"html_description": "<td><em>Optional</em>. <em>True</em>, if the user is allowed to edit their own tag</td>",
"rst_description": "*Optional*. :code:`True`, if the user is allowed to edit their own tag\n",
"name": "can_edit_tag",
"required": false
},
{
"type": "Boolean",
"description": "True, if the user is allowed to change the chat title, photo and other settings. Ignored in public supergroups",

View file

@ -7,9 +7,9 @@
"object": {
"anchor": "gamehighscore",
"name": "GameHighScore",
"description": "This object represents one row of the high scores table for a game.\nAnd that's about all we've got for now.\nIf you've got any questions, please check out our Bot FAQ\n-",
"html_description": "<p>This object represents one row of the high scores table for a game.</p><p>And that's about all we've got for now.<br/>\nIf you've got any questions, please check out our <a href=\"/bots/faq\"><strong>Bot FAQ &#187;</strong></a><br/>\n-</p>",
"rst_description": "This object represents one row of the high scores table for a game.\nAnd that's about all we've got for now.\n\nIf you've got any questions, please check out our `https://core.telegram.org/bots/faq <https://core.telegram.org/bots/faq>`_ **Bot FAQ »**\n\n-",
"description": "This object represents one row of the high scores table for a game.\nAnd that's about all we've got for now.\nIf you've got any questions, please check out our Bot FAQ",
"html_description": "<p>This object represents one row of the high scores table for a game.</p><p>And that's about all we've got for now.<br/>\nIf you've got any questions, please check out our <a href=\"/bots/faq\"><strong>Bot FAQ &#187;</strong></a></p>",
"rst_description": "This object represents one row of the high scores table for a game.\nAnd that's about all we've got for now.\n\nIf you've got any questions, please check out our `https://core.telegram.org/bots/faq <https://core.telegram.org/bots/faq>`_ **Bot FAQ »**",
"annotations": [
{
"type": "Integer",

View file

@ -86,8 +86,8 @@
{
"type": "InlineKeyboardMarkup",
"description": "Inline keyboard attached to the message",
"html_description": "<td><em>Optional</em>. Inline keyboard attached to the message</td>",
"rst_description": "*Optional*. Inline keyboard attached to the message\n",
"html_description": "<td><em>Optional</em>. <a href=\"/bots/features#inline-keyboards\">Inline keyboard</a> attached to the message</td>",
"rst_description": "*Optional*. `Inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_ attached to the message\n",
"name": "reply_markup",
"required": false
},

View file

@ -29,9 +29,9 @@
},
{
"type": "Array of MessageEntity",
"description": "List of special entities that appear in the title, which can be specified instead of parse_mode. Currently, only bold, italic, underline, strikethrough, spoiler, and custom_emoji entities are allowed.",
"html_description": "<td><em>Optional</em>. List of special entities that appear in the title, which can be specified instead of parse_mode. Currently, only <em>bold</em>, <em>italic</em>, <em>underline</em>, <em>strikethrough</em>, <em>spoiler</em>, and <em>custom_emoji</em> entities are allowed.</td>",
"rst_description": "*Optional*. List of special entities that appear in the title, which can be specified instead of parse_mode. Currently, only *bold*, *italic*, *underline*, *strikethrough*, *spoiler*, and *custom_emoji* entities are allowed.\n",
"description": "List of special entities that appear in the title, which can be specified instead of parse_mode. Currently, only bold, italic, underline, strikethrough, spoiler, custom_emoji, and date_time entities are allowed.",
"html_description": "<td><em>Optional</em>. List of special entities that appear in the title, which can be specified instead of parse_mode. Currently, only <em>bold</em>, <em>italic</em>, <em>underline</em>, <em>strikethrough</em>, <em>spoiler</em>, <em>custom_emoji</em>, and <em>date_time</em> entities are allowed.</td>",
"rst_description": "*Optional*. List of special entities that appear in the title, which can be specified instead of parse_mode. Currently, only *bold*, *italic*, *underline*, *strikethrough*, *spoiler*, *custom_emoji*, and *date_time* entities are allowed.\n",
"name": "title_entities",
"required": false
},

View file

@ -37,9 +37,9 @@
},
{
"type": "Array of MessageEntity",
"description": "List of special entities that appear in the text, which can be specified instead of parse_mode. Currently, only bold, italic, underline, strikethrough, spoiler, and custom_emoji entities are allowed.",
"html_description": "<td><em>Optional</em>. List of special entities that appear in the text, which can be specified instead of parse_mode. Currently, only <em>bold</em>, <em>italic</em>, <em>underline</em>, <em>strikethrough</em>, <em>spoiler</em>, and <em>custom_emoji</em> entities are allowed.</td>",
"rst_description": "*Optional*. List of special entities that appear in the text, which can be specified instead of parse_mode. Currently, only *bold*, *italic*, *underline*, *strikethrough*, *spoiler*, and *custom_emoji* entities are allowed.\n",
"description": "List of special entities that appear in the text, which can be specified instead of parse_mode. Currently, only bold, italic, underline, strikethrough, spoiler, custom_emoji, and date_time entities are allowed.",
"html_description": "<td><em>Optional</em>. List of special entities that appear in the text, which can be specified instead of parse_mode. Currently, only <em>bold</em>, <em>italic</em>, <em>underline</em>, <em>strikethrough</em>, <em>spoiler</em>, <em>custom_emoji</em>, and <em>date_time</em> entities are allowed.</td>",
"rst_description": "*Optional*. List of special entities that appear in the text, which can be specified instead of parse_mode. Currently, only *bold*, *italic*, *underline*, *strikethrough*, *spoiler*, *custom_emoji*, and *date_time* entities are allowed.\n",
"name": "text_entities",
"required": false
}

View file

@ -51,6 +51,14 @@
"name": "request_chat",
"required": false
},
{
"type": "KeyboardButtonRequestManagedBot",
"description": "If specified, pressing the button will ask the user to create and share a bot that will be managed by the current bot. Available for bots that enabled management of other bots in the @BotFather Mini App. Available in private chats only.",
"html_description": "<td><em>Optional</em>. If specified, pressing the button will ask the user to create and share a bot that will be managed by the current bot. Available for bots that enabled management of other bots in the <a href=\"https://t.me/BotFather\">@BotFather</a> Mini App. Available in private chats only.</td>",
"rst_description": "*Optional*. If specified, pressing the button will ask the user to create and share a bot that will be managed by the current bot. Available for bots that enabled management of other bots in the `@BotFather <https://t.me/BotFather>`_ Mini App. Available in private chats only.\n",
"name": "request_managed_bot",
"required": false
},
{
"type": "Boolean",
"description": "If True, the user's phone number will be sent as a contact when the button is pressed. Available in private chats only.",

View file

@ -0,0 +1,41 @@
{
"meta": {},
"group": {
"title": "Available types",
"anchor": "available-types"
},
"object": {
"anchor": "keyboardbuttonrequestmanagedbot",
"name": "KeyboardButtonRequestManagedBot",
"description": "This object defines the parameters for the creation of a managed bot. Information about the created bot will be shared with the bot using the update managed_bot and a Message with the field managed_bot_created.",
"html_description": "<p>This object defines the parameters for the creation of a managed bot. Information about the created bot will be shared with the bot using the update <em>managed_bot</em> and a <a href=\"#message\">Message</a> with the field <em>managed_bot_created</em>.</p>",
"rst_description": "This object defines the parameters for the creation of a managed bot. Information about the created bot will be shared with the bot using the update *managed_bot* and a :class:`aiogram.types.message.Message` with the field *managed_bot_created*.",
"annotations": [
{
"type": "Integer",
"description": "Signed 32-bit identifier of the request. Must be unique within the message",
"html_description": "<td>Signed 32-bit identifier of the request. Must be unique within the message</td>",
"rst_description": "Signed 32-bit identifier of the request. Must be unique within the message\n",
"name": "request_id",
"required": true
},
{
"type": "String",
"description": "Suggested name for the bot",
"html_description": "<td><em>Optional</em>. Suggested name for the bot</td>",
"rst_description": "*Optional*. Suggested name for the bot\n",
"name": "suggested_name",
"required": false
},
{
"type": "String",
"description": "Suggested username for the bot",
"html_description": "<td><em>Optional</em>. Suggested username for the bot</td>",
"rst_description": "*Optional*. Suggested username for the bot\n",
"name": "suggested_username",
"required": false
}
],
"category": "types"
}
}

View file

@ -0,0 +1,25 @@
{
"meta": {},
"group": {
"title": "Available types",
"anchor": "available-types"
},
"object": {
"anchor": "managedbotcreated",
"name": "ManagedBotCreated",
"description": "This object contains information about the bot that was created to be managed by the current bot.",
"html_description": "<p>This object contains information about the bot that was created to be managed by the current bot.</p>",
"rst_description": "This object contains information about the bot that was created to be managed by the current bot.",
"annotations": [
{
"type": "User",
"description": "Information about the bot. The bot's token can be fetched using the method getManagedBotToken.",
"html_description": "<td>Information about the bot. The bot's token can be fetched using the method <a href=\"#getmanagedbottoken\">getManagedBotToken</a>.</td>",
"rst_description": "Information about the bot. The bot's token can be fetched using the method :class:`aiogram.methods.get_managed_bot_token.GetManagedBotToken`.\n",
"name": "bot",
"required": true
}
],
"category": "types"
}
}

View file

@ -0,0 +1,33 @@
{
"meta": {},
"group": {
"title": "Available types",
"anchor": "available-types"
},
"object": {
"anchor": "managedbotupdated",
"name": "ManagedBotUpdated",
"description": "This object contains information about the creation or token update of a bot that is managed by the current bot.",
"html_description": "<p>This object contains information about the creation or token update of a bot that is managed by the current bot.</p>",
"rst_description": "This object contains information about the creation or token update of a bot that is managed by the current bot.",
"annotations": [
{
"type": "User",
"description": "User that created the bot",
"html_description": "<td>User that created the bot</td>",
"rst_description": "User that created the bot\n",
"name": "user",
"required": true
},
{
"type": "User",
"description": "Information about the bot. Token of the bot can be fetched using the method getManagedBotToken.",
"html_description": "<td>Information about the bot. Token of the bot can be fetched using the method <a href=\"#getmanagedbottoken\">getManagedBotToken</a>.</td>",
"rst_description": "Information about the bot. Token of the bot can be fetched using the method :class:`aiogram.methods.get_managed_bot_token.GetManagedBotToken`.\n",
"name": "bot",
"required": true
}
],
"category": "types"
}
}

View file

@ -67,6 +67,14 @@
"name": "sender_business_bot",
"required": false
},
{
"type": "String",
"description": "Tag or custom title of the sender of the message; for supergroups only",
"html_description": "<td><em>Optional</em>. Tag or custom title of the sender of the message; for supergroups only</td>",
"rst_description": "*Optional*. Tag or custom title of the sender of the message; for supergroups only\n",
"name": "sender_tag",
"required": false
},
{
"type": "Integer",
"description": "Date the message was sent in Unix time. It is always a positive number, representing a valid date.",
@ -155,6 +163,14 @@
"name": "reply_to_checklist_task_id",
"required": false
},
{
"type": "String",
"description": "Persistent identifier of the specific poll option that is being replied to",
"html_description": "<td><em>Optional</em>. Persistent identifier of the specific poll option that is being replied to</td>",
"rst_description": "*Optional*. Persistent identifier of the specific poll option that is being replied to\n",
"name": "reply_to_poll_option_id",
"required": false
},
{
"type": "User",
"description": "Bot through which the message was sent",
@ -197,9 +213,9 @@
},
{
"type": "String",
"description": "The unique identifier of a media message group this message belongs to",
"html_description": "<td><em>Optional</em>. The unique identifier of a media message group this message belongs to</td>",
"rst_description": "*Optional*. The unique identifier of a media message group this message belongs to\n",
"description": "The unique identifier inside this chat of a media message group this message belongs to",
"html_description": "<td><em>Optional</em>. The unique identifier inside this chat of a media message group this message belongs to</td>",
"rst_description": "*Optional*. The unique identifier inside this chat of a media message group this message belongs to\n",
"name": "media_group_id",
"required": false
},
@ -755,6 +771,14 @@
"name": "giveaway_completed",
"required": false
},
{
"type": "ManagedBotCreated",
"description": "Service message: user created a bot that will be managed by the current bot",
"html_description": "<td><em>Optional</em>. Service message: user created a bot that will be managed by the current bot</td>",
"rst_description": "*Optional*. Service message: user created a bot that will be managed by the current bot\n",
"name": "managed_bot_created",
"required": false
},
{
"type": "PaidMessagePriceChanged",
"description": "Service message: the price for paid messages has changed in the chat",
@ -763,6 +787,22 @@
"name": "paid_message_price_changed",
"required": false
},
{
"type": "PollOptionAdded",
"description": "Service message: answer option was added to a poll",
"html_description": "<td><em>Optional</em>. Service message: answer option was added to a poll</td>",
"rst_description": "*Optional*. Service message: answer option was added to a poll\n",
"name": "poll_option_added",
"required": false
},
{
"type": "PollOptionDeleted",
"description": "Service message: answer option was deleted from a poll",
"html_description": "<td><em>Optional</em>. Service message: answer option was deleted from a poll</td>",
"rst_description": "*Optional*. Service message: answer option was deleted from a poll\n",
"name": "poll_option_deleted",
"required": false
},
{
"type": "SuggestedPostApproved",
"description": "Service message: a suggested post was approved",
@ -846,8 +886,8 @@
{
"type": "InlineKeyboardMarkup",
"description": "Inline keyboard attached to the message. login_url buttons are represented as ordinary url buttons.",
"html_description": "<td><em>Optional</em>. Inline keyboard attached to the message. <code>login_url</code> buttons are represented as ordinary <code>url</code> buttons.</td>",
"rst_description": "*Optional*. Inline keyboard attached to the message. :code:`login_url` buttons are represented as ordinary :code:`url` buttons.\n",
"html_description": "<td><em>Optional</em>. <a href=\"/bots/features#inline-keyboards\">Inline keyboard</a> attached to the message. <code>login_url</code> buttons are represented as ordinary <code>url</code> buttons.</td>",
"rst_description": "*Optional*. `Inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_ attached to the message. :code:`login_url` buttons are represented as ordinary :code:`url` buttons.\n",
"name": "reply_markup",
"required": false
},

View file

@ -13,9 +13,9 @@
"annotations": [
{
"type": "String",
"description": "Type of the entity. Currently, can be 'mention' (@username), 'hashtag' (#hashtag or #hashtag@chatusername), 'cashtag' ($USD or $USD@chatusername), 'bot_command' (/start@jobs_bot), 'url' (https://telegram.org), 'email' (do-not-reply@telegram.org), 'phone_number' (+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)",
"html_description": "<td>Type of the entity. Currently, can be &#8220;mention&#8221; (<code>@username</code>), &#8220;hashtag&#8221; (<code>#hashtag</code> or <code>#hashtag@chatusername</code>), &#8220;cashtag&#8221; (<code>$USD</code> or <code>$USD@chatusername</code>), &#8220;bot_command&#8221; (<code>/start@jobs_bot</code>), &#8220;url&#8221; (<code>https://telegram.org</code>), &#8220;email&#8221; (<code>do-not-reply@telegram.org</code>), &#8220;phone_number&#8221; (<code>+1-212-555-0123</code>), &#8220;bold&#8221; (<strong>bold text</strong>), &#8220;italic&#8221; (<em>italic text</em>), &#8220;underline&#8221; (underlined text), &#8220;strikethrough&#8221; (strikethrough text), &#8220;spoiler&#8221; (spoiler message), &#8220;blockquote&#8221; (block quotation), &#8220;expandable_blockquote&#8221; (collapsed-by-default block quotation), &#8220;code&#8221; (monowidth string), &#8220;pre&#8221; (monowidth block), &#8220;text_link&#8221; (for clickable text URLs), &#8220;text_mention&#8221; (for users <a href=\"https://telegram.org/blog/edit#new-mentions\">without usernames</a>), &#8220;custom_emoji&#8221; (for inline custom emoji stickers)</td>",
"rst_description": "Type of the entity. Currently, can be 'mention' (:code:`@username`), 'hashtag' (:code:`#hashtag` or :code:`#hashtag@chatusername`), 'cashtag' (:code:`$USD` or :code:`$USD@chatusername`), '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 <https://telegram.org/blog/edit#new-mentions>`_), 'custom_emoji' (for inline custom emoji stickers)\n",
"description": "Type of the entity. Currently, can be 'mention' (@username), 'hashtag' (#hashtag or #hashtag@chatusername), 'cashtag' ($USD or $USD@chatusername), 'bot_command' (/start@jobs_bot), 'url' (https://telegram.org), 'email' (do-not-reply@telegram.org), 'phone_number' (+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), or 'date_time' (for formatted date and time)",
"html_description": "<td>Type of the entity. Currently, can be &#8220;mention&#8221; (<code>@username</code>), &#8220;hashtag&#8221; (<code>#hashtag</code> or <code>#hashtag@chatusername</code>), &#8220;cashtag&#8221; (<code>$USD</code> or <code>$USD@chatusername</code>), &#8220;bot_command&#8221; (<code>/start@jobs_bot</code>), &#8220;url&#8221; (<code>https://telegram.org</code>), &#8220;email&#8221; (<code>do-not-reply@telegram.org</code>), &#8220;phone_number&#8221; (<code>+1-212-555-0123</code>), &#8220;bold&#8221; (<strong>bold text</strong>), &#8220;italic&#8221; (<em>italic text</em>), &#8220;underline&#8221; (underlined text), &#8220;strikethrough&#8221; (strikethrough text), &#8220;spoiler&#8221; (spoiler message), &#8220;blockquote&#8221; (block quotation), &#8220;expandable_blockquote&#8221; (collapsed-by-default block quotation), &#8220;code&#8221; (monowidth string), &#8220;pre&#8221; (monowidth block), &#8220;text_link&#8221; (for clickable text URLs), &#8220;text_mention&#8221; (for users <a href=\"https://telegram.org/blog/edit#new-mentions\">without usernames</a>), &#8220;custom_emoji&#8221; (for inline custom emoji stickers), or &#8220;date_time&#8221; (for formatted date and time)</td>",
"rst_description": "Type of the entity. Currently, can be 'mention' (:code:`@username`), 'hashtag' (:code:`#hashtag` or :code:`#hashtag@chatusername`), 'cashtag' (:code:`$USD` or :code:`$USD@chatusername`), '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 <https://telegram.org/blog/edit#new-mentions>`_), 'custom_emoji' (for inline custom emoji stickers), or 'date_time' (for formatted date and time)\n",
"name": "type",
"required": true
},
@ -66,6 +66,22 @@
"rst_description": "*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\n",
"name": "custom_emoji_id",
"required": false
},
{
"type": "Integer",
"description": "For 'date_time' only, the Unix time associated with the entity",
"html_description": "<td><em>Optional</em>. For &#8220;date_time&#8221; only, the Unix time associated with the entity</td>",
"rst_description": "*Optional*. For 'date_time' only, the Unix time associated with the entity\n",
"name": "unix_time",
"required": false
},
{
"type": "String",
"description": "For 'date_time' only, the string that defines the formatting of the date and time. See date-time entity formatting for more details.",
"html_description": "<td><em>Optional</em>. For &#8220;date_time&#8221; only, the string that defines the formatting of the date and time. See <a href=\"#date-time-entity-formatting\">date-time entity formatting</a> for more details.</td>",
"rst_description": "*Optional*. For 'date_time' only, the string that defines the formatting of the date and time. See `date-time entity formatting <https://core.telegram.org/bots/api#date-time-entity-formatting>`_ for more details.\n",
"name": "date_time_format",
"required": false
}
],
"category": "types"

View file

@ -84,11 +84,19 @@
"required": true
},
{
"type": "Integer",
"description": "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.",
"html_description": "<td><em>Optional</em>. 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.</td>",
"rst_description": "*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.\n",
"name": "correct_option_id",
"type": "Boolean",
"description": "True, if the poll allows to change the chosen answer options",
"html_description": "<td><em>True</em>, if the poll allows to change the chosen answer options</td>",
"rst_description": ":code:`True`, if the poll allows to change the chosen answer options\n",
"name": "allows_revoting",
"required": true
},
{
"type": "Array of Integer",
"description": "Array of 0-based identifiers of the correct answer options. Available only for polls in quiz mode which are closed or were sent (not forwarded) by the bot or to the private chat with the bot.",
"html_description": "<td><em>Optional</em>. Array of 0-based identifiers of the correct answer options. Available only for polls in quiz mode which are closed or were sent (not forwarded) by the bot or to the private chat with the bot.</td>",
"rst_description": "*Optional*. Array of 0-based identifiers of the correct answer options. Available only for polls in quiz mode which are closed or were sent (not forwarded) by the bot or to the private chat with the bot.\n",
"name": "correct_option_ids",
"required": false
},
{
@ -122,6 +130,34 @@
"rst_description": "*Optional*. Point in time (Unix timestamp) when the poll will be automatically closed\n",
"name": "close_date",
"required": false
},
{
"type": "String",
"description": "Description of the poll; for polls inside the Message object only",
"html_description": "<td><em>Optional</em>. Description of the poll; for polls inside the <a href=\"#message\">Message</a> object only</td>",
"rst_description": "*Optional*. Description of the poll; for polls inside the :class:`aiogram.types.message.Message` object only\n",
"name": "description",
"required": false
},
{
"type": "Array of MessageEntity",
"description": "Special entities like usernames, URLs, bot commands, etc. that appear in the description",
"html_description": "<td><em>Optional</em>. Special entities like usernames, URLs, bot commands, etc. that appear in the description</td>",
"rst_description": "*Optional*. Special entities like usernames, URLs, bot commands, etc. that appear in the description\n",
"name": "description_entities",
"required": false
},
{
"type": "Integer",
"description": "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.",
"html_description": "<td><em>Optional</em>. 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.</td>",
"rst_description": "*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.\n",
"name": "correct_option_id",
"required": false,
"deprecated": {
"version": "9.6",
"release_date": "2026-04-03"
}
}
],
"category": "types"

View file

@ -42,6 +42,14 @@
"rst_description": "0-based identifiers of chosen answer options. May be empty if the vote was retracted.\n",
"name": "option_ids",
"required": true
},
{
"type": "Array of String",
"description": "Persistent identifiers of the chosen answer options. May be empty if the vote was retracted.",
"html_description": "<td>Persistent identifiers of the chosen answer options. May be empty if the vote was retracted.</td>",
"rst_description": "Persistent identifiers of the chosen answer options. May be empty if the vote was retracted.\n",
"name": "option_persistent_ids",
"required": true
}
],
"category": "types"

View file

@ -11,6 +11,14 @@
"html_description": "<p>This object contains information about one answer option in a poll.</p>",
"rst_description": "This object contains information about one answer option in a poll.",
"annotations": [
{
"type": "String",
"description": "Unique identifier of the option, persistent on option addition and deletion",
"html_description": "<td>Unique identifier of the option, persistent on option addition and deletion</td>",
"rst_description": "Unique identifier of the option, persistent on option addition and deletion\n",
"name": "persistent_id",
"required": true
},
{
"type": "String",
"description": "Option text, 1-100 characters",
@ -29,11 +37,35 @@
},
{
"type": "Integer",
"description": "Number of users that voted for this option",
"html_description": "<td>Number of users that voted for this option</td>",
"rst_description": "Number of users that voted for this option\n",
"description": "Number of users who voted for this option; may be 0 if unknown",
"html_description": "<td>Number of users who voted for this option; may be 0 if unknown</td>",
"rst_description": "Number of users who voted for this option; may be 0 if unknown\n",
"name": "voter_count",
"required": true
},
{
"type": "User",
"description": "User who added the option; omitted if the option wasn't added by a user after poll creation",
"html_description": "<td><em>Optional</em>. User who added the option; omitted if the option wasn't added by a user after poll creation</td>",
"rst_description": "*Optional*. User who added the option; omitted if the option wasn't added by a user after poll creation\n",
"name": "added_by_user",
"required": false
},
{
"type": "Chat",
"description": "Chat that added the option; omitted if the option wasn't added by a chat after poll creation",
"html_description": "<td><em>Optional</em>. Chat that added the option; omitted if the option wasn't added by a chat after poll creation</td>",
"rst_description": "*Optional*. Chat that added the option; omitted if the option wasn't added by a chat after poll creation\n",
"name": "added_by_chat",
"required": false
},
{
"type": "Integer",
"description": "Point in time (Unix timestamp) when the option was added; omitted if the option existed in the original poll",
"html_description": "<td><em>Optional</em>. Point in time (Unix timestamp) when the option was added; omitted if the option existed in the original poll</td>",
"rst_description": "*Optional*. Point in time (Unix timestamp) when the option was added; omitted if the option existed in the original poll\n",
"name": "addition_date",
"required": false
}
],
"category": "types"

View file

@ -0,0 +1,5 @@
annotations:
addition_date:
parsed_type:
type: std
name: DateTime

View file

@ -0,0 +1,49 @@
{
"meta": {},
"group": {
"title": "Available types",
"anchor": "available-types"
},
"object": {
"anchor": "polloptionadded",
"name": "PollOptionAdded",
"description": "Describes a service message about an option added to a poll.",
"html_description": "<p>Describes a service message about an option added to a poll.</p>",
"rst_description": "Describes a service message about an option added to a poll.",
"annotations": [
{
"type": "MaybeInaccessibleMessage",
"description": "Message containing the poll to which the option was added, if known. Note that the Message object in this field will not contain the reply_to_message field even if it itself is a reply.",
"html_description": "<td><em>Optional</em>. Message containing the poll to which the option was added, if known. Note that the <a href=\"#message\">Message</a> object in this field will not contain the <em>reply_to_message</em> field even if it itself is a reply.</td>",
"rst_description": "*Optional*. Message containing the poll to which the option was added, if known. Note that the :class:`aiogram.types.message.Message` object in this field will not contain the *reply_to_message* field even if it itself is a reply.\n",
"name": "poll_message",
"required": false
},
{
"type": "String",
"description": "Unique identifier of the added option",
"html_description": "<td>Unique identifier of the added option</td>",
"rst_description": "Unique identifier of the added option\n",
"name": "option_persistent_id",
"required": true
},
{
"type": "String",
"description": "Option text",
"html_description": "<td>Option text</td>",
"rst_description": "Option text\n",
"name": "option_text",
"required": true
},
{
"type": "Array of MessageEntity",
"description": "Special entities that appear in the option_text",
"html_description": "<td><em>Optional</em>. Special entities that appear in the <em>option_text</em></td>",
"rst_description": "*Optional*. Special entities that appear in the *option_text*\n",
"name": "option_text_entities",
"required": false
}
],
"category": "types"
}
}

View file

@ -0,0 +1,49 @@
{
"meta": {},
"group": {
"title": "Available types",
"anchor": "available-types"
},
"object": {
"anchor": "polloptiondeleted",
"name": "PollOptionDeleted",
"description": "Describes a service message about an option deleted from a poll.",
"html_description": "<p>Describes a service message about an option deleted from a poll.</p>",
"rst_description": "Describes a service message about an option deleted from a poll.",
"annotations": [
{
"type": "MaybeInaccessibleMessage",
"description": "Message containing the poll from which the option was deleted, if known. Note that the Message object in this field will not contain the reply_to_message field even if it itself is a reply.",
"html_description": "<td><em>Optional</em>. Message containing the poll from which the option was deleted, if known. Note that the <a href=\"#message\">Message</a> object in this field will not contain the <em>reply_to_message</em> field even if it itself is a reply.</td>",
"rst_description": "*Optional*. Message containing the poll from which the option was deleted, if known. Note that the :class:`aiogram.types.message.Message` object in this field will not contain the *reply_to_message* field even if it itself is a reply.\n",
"name": "poll_message",
"required": false
},
{
"type": "String",
"description": "Unique identifier of the deleted option",
"html_description": "<td>Unique identifier of the deleted option</td>",
"rst_description": "Unique identifier of the deleted option\n",
"name": "option_persistent_id",
"required": true
},
{
"type": "String",
"description": "Option text",
"html_description": "<td>Option text</td>",
"rst_description": "Option text\n",
"name": "option_text",
"required": true
},
{
"type": "Array of MessageEntity",
"description": "Special entities that appear in the option_text",
"html_description": "<td><em>Optional</em>. Special entities that appear in the <em>option_text</em></td>",
"rst_description": "*Optional*. Special entities that appear in the *option_text*\n",
"name": "option_text_entities",
"required": false
}
],
"category": "types"
}
}

View file

@ -1,8 +1,8 @@
{
"meta": {},
"group": {
"title": "Inline mode",
"anchor": "inline-mode"
"title": "Available types",
"anchor": "available-types"
},
"object": {
"anchor": "preparedinlinemessage",

View file

@ -0,0 +1,25 @@
{
"meta": {},
"group": {
"title": "Available types",
"anchor": "available-types"
},
"object": {
"anchor": "preparedkeyboardbutton",
"name": "PreparedKeyboardButton",
"description": "Describes a keyboard button to be used by a user of a Mini App.",
"html_description": "<p>Describes a keyboard button to be used by a user of a Mini App.</p>",
"rst_description": "Describes a keyboard button to be used by a user of a Mini App.",
"annotations": [
{
"type": "String",
"description": "Unique identifier of the keyboard button",
"html_description": "<td>Unique identifier of the keyboard button</td>",
"rst_description": "Unique identifier of the keyboard button\n",
"name": "id",
"required": true
}
],
"category": "types"
}
}

View file

@ -37,9 +37,9 @@
},
{
"type": "String",
"description": "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.",
"html_description": "<td><em>Optional</em>. 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 <em>bold</em>, <em>italic</em>, <em>underline</em>, <em>strikethrough</em>, <em>spoiler</em>, and <em>custom_emoji</em> entities. The message will fail to send if the quote isn't found in the original message.</td>",
"rst_description": "*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.\n",
"description": "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, custom_emoji, and date_time entities. The message will fail to send if the quote isn't found in the original message.",
"html_description": "<td><em>Optional</em>. 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 <em>bold</em>, <em>italic</em>, <em>underline</em>, <em>strikethrough</em>, <em>spoiler</em>, <em>custom_emoji</em>, and <em>date_time</em> entities. The message will fail to send if the quote isn't found in the original message.</td>",
"rst_description": "*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*, *custom_emoji*, and *date_time* entities. The message will fail to send if the quote isn't found in the original message.\n",
"name": "quote",
"required": false
},
@ -74,6 +74,14 @@
"rst_description": "*Optional*. Identifier of the specific checklist task to be replied to\n",
"name": "checklist_task_id",
"required": false
},
{
"type": "String",
"description": "Persistent identifier of the specific poll option to be replied to",
"html_description": "<td><em>Optional</em>. Persistent identifier of the specific poll option to be replied to</td>",
"rst_description": "*Optional*. Persistent identifier of the specific poll option to be replied to\n",
"name": "poll_option_id",
"required": false
}
],
"category": "types"

View file

@ -1,8 +1,8 @@
{
"meta": {},
"group": {
"title": "Inline mode",
"anchor": "inline-mode"
"title": "Available types",
"anchor": "available-types"
},
"object": {
"anchor": "sentwebappmessage",

View file

@ -21,9 +21,9 @@
},
{
"type": "Array of MessageEntity",
"description": "Special entities that appear in the quote. Currently, only bold, italic, underline, strikethrough, spoiler, and custom_emoji entities are kept in quotes.",
"html_description": "<td><em>Optional</em>. Special entities that appear in the quote. Currently, only <em>bold</em>, <em>italic</em>, <em>underline</em>, <em>strikethrough</em>, <em>spoiler</em>, and <em>custom_emoji</em> entities are kept in quotes.</td>",
"rst_description": "*Optional*. Special entities that appear in the quote. Currently, only *bold*, *italic*, *underline*, *strikethrough*, *spoiler*, and *custom_emoji* entities are kept in quotes.\n",
"description": "Special entities that appear in the quote. Currently, only bold, italic, underline, strikethrough, spoiler, custom_emoji, and date_time entities are kept in quotes.",
"html_description": "<td><em>Optional</em>. Special entities that appear in the quote. Currently, only <em>bold</em>, <em>italic</em>, <em>underline</em>, <em>strikethrough</em>, <em>spoiler</em>, <em>custom_emoji</em>, and <em>date_time</em> entities are kept in quotes.</td>",
"rst_description": "*Optional*. Special entities that appear in the quote. Currently, only *bold*, *italic*, *underline*, *strikethrough*, *spoiler*, *custom_emoji*, and *date_time* entities are kept in quotes.\n",
"name": "entities",
"required": false
},

View file

@ -202,6 +202,14 @@
"rst_description": "*Optional*. A boost was removed from a chat. The bot must be an administrator in the chat to receive these updates.\n",
"name": "removed_chat_boost",
"required": false
},
{
"type": "ManagedBotUpdated",
"description": "A new bot was created to be managed by the bot or token of a bot was changed",
"html_description": "<td><em>Optional</em>. A new bot was created to be managed by the bot or token of a bot was changed</td>",
"rst_description": "*Optional*. A new bot was created to be managed by the bot or token of a bot was changed\n",
"name": "managed_bot",
"required": false
}
],
"category": "types"

View file

@ -130,6 +130,14 @@
"rst_description": "*Optional*. :code:`True`, if the bot allows users to create and delete topics in private chats. Returned only in :class:`aiogram.methods.get_me.GetMe`.\n",
"name": "allows_users_to_create_topics",
"required": false
},
{
"type": "Boolean",
"description": "True, if other bots can be created to be controlled by the bot. Returned only in getMe.",
"html_description": "<td><em>Optional</em>. <em>True</em>, if other bots can be created to be controlled by the bot. Returned only in <a href=\"#getme\">getMe</a>.</td>",
"rst_description": "*Optional*. :code:`True`, if other bots can be created to be controlled by the bot. Returned only in :class:`aiogram.methods.get_me.GetMe`.\n",
"name": "can_manage_bots",
"required": false
}
],
"category": "types"

View file

@ -0,0 +1,50 @@
Generate a Bot API changelog fragment for aiogram.
Arguments: $ARGUMENTS (format: `<issue_id> <changelog_url>`)
## Steps
1. Parse `$ARGUMENTS`: the first token is the issue/PR number (e.g. `1792`), the rest is the changelog URL (e.g. `https://core.telegram.org/bots/api-changelog#april-3-2026`).
2. Fetch the changelog URL using WebFetch. Extract **all** changes for the Bot API version anchored by that URL: new methods, new types, new/changed fields, new parameters, renamed fields, and any other notable changes.
3. Discover which aiogram modules were generated for the new symbols:
- New methods → search `aiogram/methods/<snake_case_name>.py` via Glob
- New types → search `aiogram/types/<snake_case_name>.py` via Glob
- Confirm every referenced module exists before writing it into the RST.
4. Create `CHANGES/<issue_id>.misc.rst` (overwrite if it exists) with the following RST structure, following the style used for previous Bot API updates in `CHANGES.rst`:
```rst
Updated to `Bot API X.Y <{url}>`_
**{Section heading — e.g. "Feature Area"}**
*New Methods:*
- Added :class:`aiogram.methods.<module>.<ClassName>` method - <short description>
*New Types:*
- Added :class:`aiogram.types.<module>.<ClassName>` type - <short description>
*New Fields:*
- Added :code:`<field>` field to :class:`aiogram.types.<module>.<ClassName>` - <short description>
*New Parameters for* :class:`aiogram.methods.<module>.<ClassName>`:
- Added :code:`<param>` - <short description>
```
Rules for writing the RST:
- Use `:class:`` for types and methods, `:meth:`` for shortcuts, `:code:`` for field/parameter names.
- Module paths must be the full dotted path (e.g. `aiogram.types.poll_option.PollOption`), always verified against real files.
- If a symbol has a shortcut method on a type, mention it with `:meth:`.
- Group related changes under bold section headings (e.g. **Polls**, **Managed Bots**).
- Within each section use italic sub-headings (*New Methods:*, *New Types:*, *New Fields:*, *New Parameters for ...:*) — omit a sub-heading if there is nothing to list under it.
- Describe each item with a brief, user-facing sentence after the dash.
- Do not add a trailing newline after the last bullet.
- Do not include an issue/PR back-reference link (towncrier adds that automatically).
5. Print the path of the created file and confirm it is done.

2
.serena/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/cache
/project.local.yml

View file

@ -0,0 +1,42 @@
# Code Style & Conventions
## General
- `from __future__ import annotations` at the top of every Python file
- Full type hints on all function signatures and class fields
- Max line length: **99** characters (ruff enforced)
- snake_case for Python names; camelCase used only in `__api_method__` strings
## Pydantic models
- All Telegram types extend `TelegramObject(BotContextController, BaseModel)` from `aiogram/types/base.py`
- `TelegramObject` is frozen; use `MutableTelegramObject` when mutation is needed
- Fields default to `None` for optional API parameters; use `Field(None, json_schema_extra={"deprecated": True})` for deprecated fields
- Use `Default("key")` sentinel (from `aiogram.client.default`) for user-configurable defaults like `parse_mode`, `protect_content`
- `TYPE_CHECKING` guards for circular imports — keep runtime imports lean
## API Methods
- Each method is a class inheriting `TelegramMethod[ReturnType]` from `aiogram/methods/base.py`
- Required class attrs: `__returning__` (return type), `__api_method__` (camelCase string)
- Fields with `None` default = optional param
- Method docstring format: short description + `Source: https://core.telegram.org/bots/api#methodname`
- File name: snake_case of method name (e.g., `SendMessage``send_message.py`)
## Imports order (ruff/isort enforced)
1. stdlib
2. third-party
3. `aiogram` (first-party)
4. relative imports
## Ruff rules enforced
- A (annotations), B (bugbear), C4 (comprehensions), DTZ (datetimez), E, F, I (isort), PERF, PL (pylint), Q (quotes), RET, SIM, T10, T20, UP (pyupgrade)
- Several PLR rules disabled (Telegram API naturally has many params/methods)
- `F401` disabled (re-exports in `__init__.py` intentional)
## Code generation convention
- **Never hand-edit generated files** (`.butcher/**/entity.json`, auto-generated `aiogram/types/*.py`, `aiogram/methods/*.py`, `aiogram/enums/*.py`)
- Add features via `.butcher` YAML config/aliases + templates, then regenerate
- After codegen: always run lint + mypy
## Naming patterns
- Enums: PascalCase class, UPPER_SNAKE members (e.g., `ContentType.TEXT`)
- Test files: `test_<module_name>.py`
- Test classes: `Test<ClassName>` with `async def test_<scenario>(self, bot: MockedBot)`

View file

@ -0,0 +1,84 @@
# Codebase Structure
## Top-level layout
```
aiogram/ # Main package
.butcher/ # Code generation inputs (DO NOT edit entity.json files)
tests/ # Test suite
docs/ # Sphinx documentation (RST)
examples/ # Example bot scripts
scripts/ # Version bump scripts
CHANGES/ # Towncrier changelog fragments (CHANGES/<issue>.<category>.rst)
```
## aiogram/ package
```
aiogram/
├── __init__.py # Public API re-exports
├── __meta__.py # Version (hatch reads this)
├── exceptions.py # Framework exceptions
├── loggers.py # Named loggers
├── client/
│ ├── bot.py # Bot class — all API methods as async shortcuts
│ ├── session/ # HTTP session backends (aiohttp, base)
│ ├── default.py # Default() sentinel for configurable defaults
│ └── context_controller.py # Bot context injection into models
├── types/
│ ├── base.py # TelegramObject (Pydantic BaseModel), MutableTelegramObject
│ ├── *.py # One file per Telegram type
│ └── __init__.py # Exports all types
├── methods/
│ ├── base.py # TelegramMethod[T] base class
│ ├── *.py # One file per API method (e.g., send_message.py → SendMessage)
│ └── __init__.py
├── enums/
│ ├── content_type.py # ContentType enum
│ ├── update_type.py # UpdateType enum
│ └── *.py
├── dispatcher/
│ ├── dispatcher.py # Dispatcher (main update processor)
│ ├── router.py # Router (Blueprint-style routing)
│ ├── middlewares/ # Middleware system
│ ├── event/ # Event observer, typed decorators
│ └── flags/ # Handler flags
├── filters/ # Built-in filters (Command, StateFilter, etc.)
├── fsm/
│ ├── context.py # FSMContext
│ ├── state.py # State, StatesGroup
│ └── storage/ # Memory, Redis, MongoDB storage backends
├── handlers/ # Base handler types
├── utils/
│ ├── keyboard.py # Keyboard builder utilities
│ ├── text_decorations.py # HTML/Markdown formatting
│ └── i18n/ # Internationalization support
└── webhook/ # Webhook integrations (aiohttp, SimpleRequestHandler, etc.)
```
## .butcher/ (Code generation)
```
.butcher/
├── schema/schema.json # Full Bot API schema (source of truth)
├── types/ # Per-type entity.json + optional alias YAML overrides
├── methods/ # Per-method entity.json + optional alias YAML overrides
├── enums/ # Per-enum entity.json + optional YAML overrides
└── templates/ # Jinja2 templates for generated Python files
```
**Rule**: Edit `.yml` alias files or templates in `.butcher/`, never `.entity.json` files directly. Regenerate after changes.
## tests/ layout
```
tests/
├── conftest.py # Shared fixtures (bot, dispatcher, etc.)
├── mocked_bot.py # MockedBot for testing without real HTTP
├── test_api/
│ ├── test_types/ # Tests for Telegram types
│ ├── test_methods/ # Tests for API method classes
│ └── test_client/ # HTTP client tests
├── test_dispatcher/ # Dispatcher/Router/Middleware tests
├── test_filters/ # Filter tests
├── test_fsm/ # FSM and storage tests
├── test_handler/ # Handler tests
├── test_utils/ # Utility tests
└── test_webhook/ # Webhook integration tests
```

View file

@ -0,0 +1,44 @@
# Bot API Codegen Workflow
## How code generation works
aiogram uses `butcher` (via `aiogram-cli`) to auto-generate Python files from the Telegram Bot API schema.
### Source of truth
- `.butcher/schema/schema.json` — full parsed Bot API schema
- `.butcher/types/<TypeName>/entity.json` — parsed entity metadata (DO NOT edit)
- `.butcher/methods/<MethodName>/entity.json` — parsed method metadata (DO NOT edit)
- `.butcher/enums/<EnumName>/entity.json` — parsed enum metadata (DO NOT edit)
- `.butcher/templates/` — Jinja2 templates that produce Python code
- YAML alias/override files in `.butcher/types/`, `.butcher/methods/` — edit these for customizations
### Generated files (DO NOT hand-edit)
- `aiogram/types/*.py` (except `base.py`, `custom.py`, `_union.py` — framework internals)
- `aiogram/methods/*.py` (except `base.py`)
- `aiogram/enums/*.py`
- `aiogram/client/bot.py` (the `Bot` class shortcuts)
- `aiogram/types/__init__.py`, `aiogram/methods/__init__.py`
### Regeneration commands
```bash
uv run --extra cli butcher parse # re-parse from API schema
uv run --extra cli butcher refresh # refresh entity JSON from parsed schema
uv run --extra cli butcher apply all # apply templates → generate Python files
```
### Adding a new type/method/shortcut
1. Update the `.butcher` YAML alias/config file for the entity
2. Run regeneration (parse → refresh → apply)
3. Run lint + mypy + tests
4. Commit both the `.butcher` config changes AND the generated Python files
### API version bumps (maintainers)
```bash
make update-api args=patch # or minor/major
```
This runs butcher parse/refresh/apply + version bump scripts that update:
- `aiogram/__meta__.py`
- `README.rst`
- `docs/index.rst`
## Key constraint
The maintainers enforce: **never add types/methods/shortcuts by hand-editing generated files**. All changes must go through `.butcher` config so future regenerations preserve them.

View file

@ -0,0 +1,43 @@
# Adding a New Update/Event Type to aiogram Dispatcher
When Telegram Bot API adds a new update type (e.g. `managed_bot`, `purchased_paid_media`), the following files must be touched. Types, enums, and butcher configs are generated — the dispatcher integration is manual.
## Checklist (in order)
### Generated / butcher layer (run `butcher parse && butcher refresh && butcher apply all`)
- `.butcher/types/<TypeName>/entity.json` — type definition
- `.butcher/types/Update/entity.json` — add field to Update entity
- `aiogram/types/<type_name>.py` — generated type class
- `aiogram/types/__init__.py` — export
- `aiogram/enums/update_type.py``NEW_TYPE = "new_type"` enum member
- `aiogram/types/update.py``new_type: NewType | None = None` field + TYPE_CHECKING import + `__init__` signature
### Manual dispatcher integration (NOT generated)
1. **`aiogram/types/update.py`** — `event_type` property (lines ~161-215): add `if self.new_type: return "new_type"` before the `raise UpdateTypeLookupError` line
2. **`aiogram/dispatcher/router.py`** — two places in `Router.__init__`:
- Add `self.new_type = TelegramEventObserver(router=self, event_name="new_type")` after the last observer attribute (before `self.errors`)
- Add `"new_type": self.new_type,` to the `self.observers` dict (before `"error"`)
3. **`aiogram/dispatcher/middlewares/user_context.py`** — `resolve_event_context()` method: add `if event.new_type: return EventContext(user=..., chat=...)` before `return EventContext()`. Use `user` field for user-scoped events, `chat` for chat-scoped. No `business_connection_id` unless the event has one.
### Tests (manual)
4. **`tests/test_dispatcher/test_dispatcher.py`** — add `pytest.param("new_type", Update(update_id=42, new_type=NewType(...)), has_chat, has_user)` to `test_listen_update` parametrize list. Import `NewType` in the imports block.
5. **`tests/test_dispatcher/test_router.py`** — add `assert router.observers["new_type"] == router.new_type` to `test_observers_config`
### Docs (generated or manual stub)
- `docs/api/types/<type_name>.rst` — RST stub
- `docs/api/types/index.rst` — add to index
## Key invariants
- The snake_case name must be identical across: `UpdateType` enum value, `Update` field name, `event_type` return string, Router attribute name, observers dict key, and `TelegramEventObserver(event_name=...)`.
- `Update.event_type` uses `@lru_cache()` — never mutate Update fields after construction.
- The routing machinery (`propagate_event`, middleware chains, sub-router propagation) requires **zero changes** — it operates on observer names looked up dynamically.
## Example: `managed_bot` (API 9.6)
- Type: `ManagedBotUpdated` with fields `user: User` (creator) and `bot_user: User` (the managed bot)
- user_context: `EventContext(user=event.managed_bot.user)` — user only, no chat
- `has_chat=False, has_user=True` in test parametrization

View file

@ -0,0 +1,43 @@
# Project Overview: aiogram
## Purpose
**aiogram** is a modern, fully asynchronous Python framework for the Telegram Bot API (currently supports Bot API 9.5+). It provides a high-level interface for building Telegram bots using asyncio.
## Tech Stack
- **Python**: 3.103.14 (also supports PyPy)
- **Async runtime**: asyncio + aiohttp (HTTP client)
- **Data validation**: Pydantic v2
- **Package manager**: `uv`
- **Linter/formatter**: `ruff` (check + format)
- **Type checker**: `mypy`
- **Testing**: `pytest` with `pytest-asyncio`, `aresponses`
- **Docs**: Sphinx (reStructuredText), `sphinx-autobuild`
- **Changelog**: `towncrier`
- **Code generation**: `butcher` (aiogram-cli) — generates types, methods, enums from Bot API schema
## Key Links
- Docs (English): https://docs.aiogram.dev/en/dev-3.x/
- GitHub: https://github.com/aiogram/aiogram/
- Bot API schema: `.butcher/schema/schema.json`
## Architecture Summary
The framework is layered:
1. **`aiogram/client/`** — `Bot` class (all API methods as shortcuts), session management, context controller
2. **`aiogram/types/`** — Pydantic models for all Telegram types (`TelegramObject` base)
3. **`aiogram/methods/`** — `TelegramMethod[ReturnType]` subclasses, one per Bot API method
4. **`aiogram/dispatcher/`** — Dispatcher, Router (blueprints), middleware, event observers
5. **`aiogram/filters/`** — Filter classes for routing
6. **`aiogram/fsm/`** — Finite State Machine (states, storage backends)
7. **`aiogram/enums/`** — Enumerations (ContentType, UpdateType, etc.)
8. **`aiogram/utils/`** — Text decoration, keyboards, i18n, etc.
9. **`aiogram/webhook/`** — Webhook server integrations (aiohttp, FastAPI, etc.)
10. **`.butcher/`** — Code generation inputs: YAML/JSON configs for types/methods/enums + Jinja2 templates
## Optional extras
- `fast` — uvloop + aiodns
- `redis` — Redis FSM storage
- `mongo` — MongoDB FSM storage
- `proxy` — SOCKS proxy support
- `i18n` — Babel-based i18n
- `cli``butcher` codegen CLI
- `signature` — cryptographic signature verification

View file

@ -0,0 +1,66 @@
# Suggested Commands
## Setup
```bash
uv sync --all-extras --group dev --group test
uv run pre-commit install
```
## Lint & Format (quick loop — use before every commit)
```bash
uv run ruff check --show-fixes --preview aiogram examples
uv run ruff format --check --diff aiogram tests scripts examples
uv run mypy aiogram
```
## Auto-fix formatting
```bash
uv run ruff format aiogram tests scripts examples
uv run ruff check --fix aiogram tests scripts examples
```
## Run tests
```bash
uv run pytest tests # basic
uv run pytest tests --redis redis://localhost:6379/0 # with Redis
uv run pytest tests --mongo mongodb://mongo:mongo@localhost:27017 # with MongoDB
```
## Build docs
```bash
# Live-reload dev server
uv run --extra docs sphinx-autobuild --watch aiogram/ --watch CHANGES.rst --watch README.rst docs/ docs/_build/
# One-shot build
uv run --extra docs bash -c 'cd docs && make html'
```
## Code generation (Bot API codegen)
```bash
# After editing .butcher/*.yml or templates:
uv run --extra cli butcher parse
uv run --extra cli butcher refresh
uv run --extra cli butcher apply all
```
## API version bump (maintainers only)
```bash
make update-api args=patch # runs butcher parse/refresh/apply + version bump
```
## Changelog
```bash
# Preview draft
uv run --extra docs towncrier build --draft
# Build final
uv run --extra docs towncrier build --yes
```
## Clean build artifacts
```bash
make clean
```
## Build package
```bash
uv build
```

View file

@ -0,0 +1,43 @@
# Task Completion Checklist
Run these before marking any task done or requesting review.
## Quick loop (every PR)
```bash
uv run ruff check --show-fixes --preview aiogram examples
uv run ruff format --check --diff aiogram tests scripts examples
uv run mypy aiogram
uv run pytest tests
```
## Codegen tasks (when touching .butcher/ or generated API files)
```bash
uv run --extra cli butcher parse
uv run --extra cli butcher refresh
uv run --extra cli butcher apply all
# Then re-run quick loop
```
## Integration tests (only if Redis/Mongo storage touched)
```bash
uv run pytest --redis redis://localhost:6379/0 tests
uv run pytest --mongo mongodb://mongo:mongo@localhost:27017 tests
```
## Docs (only if docs/ or public API changed)
```bash
uv run --extra docs bash -c 'cd docs && make html'
```
## Changelog fragment (required unless PR has `skip news` label)
- Create `CHANGES/<issue-or-pr-number>.<category>.rst`
- Valid categories: `feature`, `bugfix`, `doc`, `removal`, `misc`
- Content: user-visible behavior description (not internal/process details)
- Do NOT edit `CHANGES.rst` directly
## PR quality checklist
1. Tests added/updated for all behavior changes
2. Quick loop passes (ruff + mypy + pytest)
3. Changelog fragment added (or justified `skip news`)
4. If codegen-related: both `.butcher` source config AND generated files updated
5. PR body has clear reproduction/validation steps

View file

@ -0,0 +1,45 @@
# Testing Patterns
## Framework
- pytest with async support
- No `pytest-asyncio` explicit marks needed (configured globally in pyproject.toml)
- `MockedBot` (tests/mocked_bot.py) — use for all bot method tests, no real HTTP
## MockedBot pattern
```python
from tests.mocked_bot import MockedBot
from aiogram.methods import SendMessage
from aiogram.types import Message, Chat
import datetime
class TestSendMessage:
async def test_bot_method(self, bot: MockedBot):
prepare_result = bot.add_result_for(
SendMessage,
ok=True,
result=Message(
message_id=42,
date=datetime.datetime.now(),
text="test",
chat=Chat(id=42, type="private"),
),
)
response: Message = await bot.send_message(chat_id=42, text="test")
bot.get_request()
assert response == prepare_result.result
```
## Test structure
- Class per type/method: `class TestSendMessage:`
- One test per scenario: `async def test_<scenario>(self, ...)`
- `bot` fixture comes from `tests/conftest.py`
## Integration tests
- Redis: `uv run pytest --redis redis://localhost:6379/0 tests`
- MongoDB: `uv run pytest --mongo mongodb://mongo:mongo@localhost:27017 tests`
- Only run these when Redis/Mongo storage code is affected
## What NOT to do
- Do not mock the database/storage in FSM tests — use real backends or memory storage
- Do not introduce new test dependencies for small tests
- Keep test style consistent with existing suite

152
.serena/project.yml Normal file
View file

@ -0,0 +1,152 @@
# the name by which the project can be referenced within Serena
project_name: "aiogram3"
# list of languages for which language servers are started; choose from:
# al bash clojure cpp csharp
# csharp_omnisharp dart elixir elm erlang
# fortran fsharp go groovy haskell
# java julia kotlin lua markdown
# matlab nix pascal perl php
# php_phpactor powershell python python_jedi r
# rego ruby ruby_solargraph rust scala
# swift terraform toml typescript typescript_vts
# vue yaml zig
# (This list may be outdated. For the current list, see values of Language enum here:
# https://github.com/oraios/serena/blob/main/src/solidlsp/ls_config.py
# For some languages, there are alternative language servers, e.g. csharp_omnisharp, ruby_solargraph.)
# Note:
# - For C, use cpp
# - For JavaScript, use typescript
# - For Free Pascal/Lazarus, use pascal
# Special requirements:
# Some languages require additional setup/installations.
# See here for details: https://oraios.github.io/serena/01-about/020_programming-languages.html#language-servers
# When using multiple languages, the first language server that supports a given file will be used for that file.
# The first language is the default language and the respective language server will be used as a fallback.
# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored.
languages:
- python
# the encoding used by text files in the project
# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings
encoding: "utf-8"
# line ending convention to use when writing source files.
# Possible values: unset (use global setting), "lf", "crlf", or "native" (platform default)
# This does not affect Serena's own files (e.g. memories and configuration files), which always use native line endings.
line_ending:
# The language backend to use for this project.
# If not set, the global setting from serena_config.yml is used.
# Valid values: LSP, JetBrains
# Note: the backend is fixed at startup. If a project with a different backend
# is activated post-init, an error will be returned.
language_backend:
# whether to use project's .gitignore files to ignore files
ignore_all_files_in_gitignore: true
# advanced configuration option allowing to configure language server-specific options.
# Maps the language key to the options.
# Have a look at the docstring of the constructors of the LS implementations within solidlsp (e.g., for C# or PHP) to see which options are available.
# No documentation on options means no options are available.
ls_specific_settings: {}
# list of additional paths to ignore in this project.
# Same syntax as gitignore, so you can use * and **.
# Note: global ignored_paths from serena_config.yml are also applied additively.
ignored_paths: []
# whether the project is in read-only mode
# If set to true, all editing tools will be disabled and attempts to use them will result in an error
# Added on 2025-04-18
read_only: false
# list of tool names to exclude.
# This extends the existing exclusions (e.g. from the global configuration)
#
# Below is the complete list of tools for convenience.
# To make sure you have the latest list of tools, and to view their descriptions,
# execute `uv run scripts/print_tool_overview.py`.
#
# * `activate_project`: Activates a project by name.
# * `check_onboarding_performed`: Checks whether project onboarding was already performed.
# * `create_text_file`: Creates/overwrites a file in the project directory.
# * `delete_lines`: Deletes a range of lines within a file.
# * `delete_memory`: Deletes a memory from Serena's project-specific memory store.
# * `execute_shell_command`: Executes a shell command.
# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced.
# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type).
# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type).
# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes.
# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file.
# * `initial_instructions`: Gets the initial instructions for the current project.
# Should only be used in settings where the system prompt cannot be set,
# e.g. in clients you have no control over, like Claude Desktop.
# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol.
# * `insert_at_line`: Inserts content at a given line in a file.
# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol.
# * `list_dir`: Lists files and directories in the given directory (optionally with recursion).
# * `list_memories`: Lists memories in Serena's project-specific memory store.
# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building).
# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context).
# * `read_file`: Reads a file within the project directory.
# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store.
# * `remove_project`: Removes a project from the Serena configuration.
# * `replace_lines`: Replaces a range of lines within a file with new content.
# * `replace_symbol_body`: Replaces the full definition of a symbol.
# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen.
# * `search_for_pattern`: Performs a search for a pattern in the project.
# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase.
# * `switch_modes`: Activates modes by providing a list of their names
# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information.
# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task.
# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed.
# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store.
excluded_tools: []
# list of tools to include that would otherwise be disabled (particularly optional tools that are disabled by default).
# This extends the existing inclusions (e.g. from the global configuration).
included_optional_tools: []
# fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools.
# This cannot be combined with non-empty excluded_tools or included_optional_tools.
fixed_tools: []
# list of mode names to that are always to be included in the set of active modes
# The full set of modes to be activated is base_modes + default_modes.
# If the setting is undefined, the base_modes from the global configuration (serena_config.yml) apply.
# Otherwise, this setting overrides the global configuration.
# Set this to [] to disable base modes for this project.
# Set this to a list of mode names to always include the respective modes for this project.
base_modes:
# list of mode names that are to be activated by default.
# The full set of modes to be activated is base_modes + default_modes.
# If the setting is undefined, the default_modes from the global configuration (serena_config.yml) apply.
# Otherwise, this overrides the setting from the global configuration (serena_config.yml).
# This setting can, in turn, be overridden by CLI parameters (--mode).
default_modes:
# initial prompt for the project. It will always be given to the LLM upon activating the project
# (contrary to the memories, which are loaded on demand).
initial_prompt: ""
# time budget (seconds) per tool call for the retrieval of additional symbol information
# such as docstrings or parameter information.
# This overrides the corresponding setting in the global configuration; see the documentation there.
# If null or missing, use the setting from the global configuration.
symbol_info_budget:
# list of regex patterns which, when matched, mark a memory entry as readonly.
# Extends the list from the global configuration, merging the two lists.
read_only_memory_patterns: []
# list of regex patterns for memories to completely ignore.
# Matching memories will not appear in list_memories or activate_project output
# and cannot be accessed via read_memory or write_memory.
# To access ignored memory files, use the read_file tool on the raw file path.
# Extends the list from the global configuration, merging the two lists.
# Example: ["_archive/.*", "_episodes/.*"]
ignored_memory_patterns: []

131
AGENTS.md Normal file
View file

@ -0,0 +1,131 @@
# AGENTS.md
This file defines how coding agents should contribute to `aiogram` on `dev-3.x`.
## Scope and defaults
- Base branch: `dev-3.x`
- Python: `>=3.10`
- Main tooling: `uv`, `ruff`, `mypy`, `pytest`, `towncrier`, `butcher`
- Keep diffs focused; avoid unrelated refactors/reformatting.
## Setup
```bash
uv sync --all-extras --group dev --group test
uv run pre-commit install
```
Note: `uv run pre-commit install` writes hooks to the shared repository `.git/hooks`
(common for all worktrees), not only for the current worktree.
## Codebase Navigation
Use **Serena MCP** for all codebase navigation tasks. Serena provides semantic, symbol-aware tools that are more efficient than raw file reads:
- `get_symbols_overview` — list classes/methods in a file without reading the full body
- `find_symbol` — locate a specific class, method, or field by name path
- `find_referencing_symbols` — find all usages of a symbol across the codebase
- `search_for_pattern` — regex search when symbol names are unknown
Prefer Serena's symbol tools over `Read`/`Grep` for source code exploration. Only fall back to file-based tools when Serena is unavailable or for non-code files (JSON configs, Markdown, etc.).
## Mandatory local checks before PR
Code style/lint in this repository is enforced via Ruff (`ruff check` + `ruff format`).
Quick loop (recommended for most PR iterations):
```bash
uv run ruff check --show-fixes --preview aiogram examples
uv run ruff format --check --diff aiogram tests scripts examples
uv run mypy aiogram
uv run pytest tests
```
Full loop (run before final review request):
```bash
# Run quick loop first, then:
uv run pytest --redis redis://<host>:<port>/<db> tests # when Redis storage paths are affected
uv run pytest --mongo mongodb://<user>:<password>@<host>:<port> tests # when Mongo storage paths are affected
uv run --extra docs bash -c 'cd docs && make html' # when docs or generated API docs are affected
```
If changes touch Redis/Mongo storage behavior, run integration variants too:
```bash
uv run pytest --redis redis://<host>:<port>/<db> tests
uv run pytest --mongo mongodb://<user>:<password>@<host>:<port> tests
```
Run these only if you have accessible Redis/Mongo instances in your environment.
## Changelog rules (CI-gated)
- Add `CHANGES/<issue-or-pr>.<category>.rst` unless PR has `skip news` label.
- Valid categories: `feature`, `bugfix`, `doc`, `removal`, `misc`.
- Changelog text must describe user-visible behavior changes, not process/org details.
- Do not edit `CHANGES.rst` directly for regular PRs.
## Bot API/codegen workflow (critical)
`aiogram` API layers are generated. For Bot API related work:
- Prefer editing generator inputs (`.butcher/**/*.yml`, aliases, templates) instead of hand-editing generated code.
- Do not manually edit `.butcher/**/entity.json` (parser/codegen will overwrite it).
- For new shortcuts, add alias/config in `.butcher` and regenerate.
- Regeneration flow:
```bash
uv run --extra cli butcher parse
uv run --extra cli butcher refresh
uv run --extra cli butcher apply all
```
For maintainers preparing an API/version bump only:
```bash
make update-api args=patch
```
`make update-api args=...` also runs version bump scripts and updates version-related files
(`aiogram/__meta__.py`, `README.rst`, `docs/index.rst`).
After regeneration, run lint/type/tests again.
## Maintainer review signals (recent PRs)
These patterns repeatedly appeared in maintainer feedback and should be treated as hard constraints:
- Keep generation path consistent: shortcuts/features should be added through `.butcher` config + generation, not ad-hoc manual edits.
- Keep test style consistent with existing suite; avoid introducing new dependencies for small tests.
- Preserve framework contracts (e.g., dispatcher/workflow data passed to startup/shutdown callbacks).
- When fixing generated API metadata/docs, update the source mapping in `.butcher` so future regenerations keep the fix.
## Documentation work
For docs changes:
```bash
uv run --extra docs sphinx-autobuild --watch aiogram/ --watch CHANGES.rst --watch README.rst docs/ docs/_build/
```
`sphinx-autobuild` is long-running by design.
Or quick build:
```bash
uv run --extra docs bash -c 'cd docs && make html'
```
## PR quality checklist
Before requesting review:
1. Tests added/updated for behavior changes.
2. Local lint/type/tests pass.
3. Changelog fragment added (or `skip news` is justified).
4. If codegen-related: generated files and source config are both updated coherently.
5. PR body includes clear reproduction/validation steps.

View file

@ -16,6 +16,121 @@ Changelog
.. towncrier release notes start
3.27.0 (2026-04-04)
====================
Features
--------
- Added `__eq__` and `__hash__` methods to the `Default` class.
`#1707 <https://github.com/aiogram/aiogram/issues/1707>`_
Bugfixes
--------
- ``CommandStart(deep_link=False)`` now correctly rejects messages that contain deep-link arguments. Previously ``deep_link=False`` (the default) did not distinguish between ``/start`` and ``/start <payload>``. The default is changed to ``None`` (accept both) to preserve backward compatibility.
`#1713 <https://github.com/aiogram/aiogram/issues/1713>`_
- Fixed ``HtmlDecoration.custom_emoji()`` to use the correct ``emoji-id`` attribute name instead of ``emoji_id`` in the ``<tg-emoji>`` tag, matching the Telegram Bot API specification.
`#1782 <https://github.com/aiogram/aiogram/issues/1782>`_
- Remove redundant list() around sorted() and fix router type name in validation error message
`#1788 <https://github.com/aiogram/aiogram/issues/1788>`_
Misc
----
- Updated to `Bot API 9.6 <https://core.telegram.org/bots/api-changelog#april-3-2026>`_
**Managed Bots**
*New Methods:*
- Added :class:`aiogram.methods.get_managed_bot_token.GetManagedBotToken` method - retrieves the token of a managed bot
- Added :class:`aiogram.methods.replace_managed_bot_token.ReplaceManagedBotToken` method - generates a new token for a managed bot, invalidating the previous one
- Added :class:`aiogram.methods.save_prepared_keyboard_button.SavePreparedKeyboardButton` method - saves a keyboard button to be used in Mini Apps via :code:`requestChat`
*New Types:*
- Added :class:`aiogram.types.keyboard_button_request_managed_bot.KeyboardButtonRequestManagedBot` type - defines criteria for selecting a managed bot via a keyboard button
- Added :class:`aiogram.types.managed_bot_created.ManagedBotCreated` type - describes a service message about a managed bot being created
- Added :class:`aiogram.types.managed_bot_updated.ManagedBotUpdated` type - describes updates to a managed bot
- Added :class:`aiogram.types.prepared_keyboard_button.PreparedKeyboardButton` type - represents a prepared keyboard button for use in Mini Apps
*New Fields:*
- Added :code:`can_manage_bots` field to :class:`aiogram.types.user.User` - indicates whether the bot can manage other bots
- Added :code:`request_managed_bot` field to :class:`aiogram.types.keyboard_button.KeyboardButton` - requests the user to select a managed bot
- Added :code:`managed_bot_created` field to :class:`aiogram.types.message.Message` - service message about a managed bot being created (type: :class:`aiogram.types.managed_bot_created.ManagedBotCreated`)
- Added :code:`managed_bot` field to :class:`aiogram.types.update.Update` - contains updates received by a managed bot
**Polls**
*New Types:*
- Added :class:`aiogram.types.poll_option_added.PollOptionAdded` type - describes a service message about a new option added to a poll
- Added :class:`aiogram.types.poll_option_deleted.PollOptionDeleted` type - describes a service message about a poll option being deleted
*New Fields:*
- Replaced :code:`correct_option_id` with :code:`correct_option_ids` in :class:`aiogram.types.poll.Poll` - supports multiple correct answers for quiz polls
- Added :code:`allows_revoting` field to :class:`aiogram.types.poll.Poll` - indicates whether users are allowed to change their vote
- Added :code:`description` and :code:`description_entities` fields to :class:`aiogram.types.poll.Poll` - optional poll description with formatting entities
- Added :code:`persistent_id` field to :class:`aiogram.types.poll_option.PollOption` - stable identifier for a poll option
- Added :code:`added_by_user` and :code:`added_by_chat` fields to :class:`aiogram.types.poll_option.PollOption` - identifies who added the option
- Added :code:`addition_date` field to :class:`aiogram.types.poll_option.PollOption` - date when the option was added
- Added :code:`option_persistent_ids` field to :class:`aiogram.types.poll_answer.PollAnswer` - persistent IDs of the chosen options
- Added :code:`poll_option_id` field to :class:`aiogram.types.reply_parameters.ReplyParameters` - allows replying to a specific poll option
- Added :code:`reply_to_poll_option_id` field to :class:`aiogram.types.message.Message` - the persistent ID of the poll option the message replies to
*New Parameters for* :class:`aiogram.methods.send_poll.SendPoll`:
- Replaced :code:`correct_option_id` with :code:`correct_option_ids` - supports multiple correct answers for quiz polls
- Added :code:`allows_revoting` - allows users to change their vote after submission
- Added :code:`shuffle_options` - randomizes the order of poll options for each user
- Added :code:`allow_adding_options` - allows users to add their own poll options
- Added :code:`hide_results_until_closes` - hides vote results until the poll is closed
- Added :code:`description`, :code:`description_parse_mode`, :code:`description_entities` - optional poll description with parse mode and formatting
`#1792 <https://github.com/aiogram/aiogram/issues/1792>`_
3.26.0 (2026-03-03)
====================
Bugfixes
--------
- Fixed scene transitions to preserve middleware-injected data when moving between scenes via ``SceneWizard.goto``.
`#1687 <https://github.com/aiogram/aiogram/issues/1687>`_
- Added ``icon_custom_emoji_id`` and ``style`` parameters to ``InlineKeyboardBuilder.button`` and ``ReplyKeyboardBuilder.button`` signatures.
`#1768 <https://github.com/aiogram/aiogram/issues/1768>`_
- Fixed Pydantic protected namespace warning for `model_custom_emoji_id` by adding `protected_namespaces=()` to `model_config`.
`#1772 <https://github.com/aiogram/aiogram/issues/1772>`_
Misc
----
- Documented webhook security constraints for proxy deployments, including trust requirements for :code:`X-Forwarded-For` and recommended defense-in-depth checks.
`#47 <https://github.com/aiogram/aiogram/issues/47>`_
- Updated to `Bot API 9.5 <https://core.telegram.org/bots/api-changelog#march-1-2026>`_
**New Methods:**
- Added :class:`aiogram.methods.send_message_draft.SendMessageDraft` method - allowed for all bots to stream partial messages while they are being generated
- Added :class:`aiogram.methods.set_chat_member_tag.SetChatMemberTag` method - allows bots to set a custom tag for a chat member; available via :meth:`aiogram.types.chat.Chat.set_member_tag` shortcut
**New Fields:**
- Added :code:`date_time` type to :class:`aiogram.types.message_entity.MessageEntity` with :code:`unix_time` and :code:`date_time_format` fields - allows bots to display a formatted date and time to the user
- Added :code:`tag` field to :class:`aiogram.types.chat_member_member.ChatMemberMember` and :class:`aiogram.types.chat_member_restricted.ChatMemberRestricted` - the custom tag set for the chat member
- Added :code:`can_edit_tag` field to :class:`aiogram.types.chat_member_restricted.ChatMemberRestricted` and :class:`aiogram.types.chat_permissions.ChatPermissions` - indicates whether the user is allowed to edit their own tag
- Added :code:`can_manage_tags` field to :class:`aiogram.types.chat_member_administrator.ChatMemberAdministrator` and :class:`aiogram.types.chat_administrator_rights.ChatAdministratorRights` - indicates whether the administrator can manage tags of other chat members
- Added :code:`can_manage_tags` parameter to :class:`aiogram.methods.promote_chat_member.PromoteChatMember` method
- Added :code:`sender_tag` field to :class:`aiogram.types.message.Message` - the tag of the message sender in the chat
`#1780 <https://github.com/aiogram/aiogram/issues/1780>`_
3.25.0 (2026-02-10)
====================

3
CLAUDE.md Normal file
View file

@ -0,0 +1,3 @@
# CLAUDE.md
Use @AGENTS.md as the source of truth for contribution workflow, checks, and Bot API codegen rules in this repository.

View file

@ -52,7 +52,7 @@ Features
- Asynchronous (`asyncio docs <https://docs.python.org/3/library/asyncio.html>`_, :pep:`492`)
- Has type hints (:pep:`484`) and can be used with `mypy <http://mypy-lang.org/>`_
- Supports `PyPy <https://www.pypy.org/>`_
- Supports `Telegram Bot API 9.4 <https://core.telegram.org/bots/api>`_ and gets fast updates to the latest versions of the Bot API
- Supports `Telegram Bot API 9.6 <https://core.telegram.org/bots/api>`_ and gets fast updates to the latest versions of the Bot API
- Telegram Bot API integration code was `autogenerated <https://github.com/aiogram/tg-codegen>`_ and can be easily re-generated when API gets updated
- Updates router (Blueprints)
- Has Finite State Machine

View file

@ -1,2 +1,2 @@
__version__ = "3.25.0"
__api_version__ = "9.4"
__version__ = "3.27.0"
__api_version__ = "9.6"

View file

@ -80,6 +80,7 @@ from ..methods import (
GetFile,
GetForumTopicIconStickers,
GetGameHighScores,
GetManagedBotToken,
GetMe,
GetMyCommands,
GetMyDefaultAdministratorRights,
@ -110,11 +111,13 @@ from ..methods import (
RemoveUserVerification,
ReopenForumTopic,
ReopenGeneralForumTopic,
ReplaceManagedBotToken,
ReplaceStickerInSet,
RepostStory,
RestrictChatMember,
RevokeChatInviteLink,
SavePreparedInlineMessage,
SavePreparedKeyboardButton,
SendAnimation,
SendAudio,
SendChatAction,
@ -144,6 +147,7 @@ from ..methods import (
SetBusinessAccountUsername,
SetChatAdministratorCustomTitle,
SetChatDescription,
SetChatMemberTag,
SetChatMenuButton,
SetChatPermissions,
SetChatPhoto,
@ -215,6 +219,7 @@ from ..types import (
InputProfilePhotoUnion,
InputSticker,
InputStoryContentUnion,
KeyboardButton,
LabeledPrice,
LinkPreviewOptions,
MaskPosition,
@ -227,6 +232,7 @@ from ..types import (
PassportElementErrorUnion,
Poll,
PreparedInlineMessage,
PreparedKeyboardButton,
ReactionTypeUnion,
ReplyMarkupUnion,
ReplyParameters,
@ -2021,6 +2027,7 @@ class Bot:
can_pin_messages: bool | None = None,
can_manage_topics: bool | None = None,
can_manage_direct_messages: bool | None = None,
can_manage_tags: bool | None = None,
request_timeout: int | None = None,
) -> bool:
"""
@ -2046,6 +2053,7 @@ class Bot:
: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 can_manage_direct_messages: Pass :code:`True` if the administrator can manage direct messages within the channel and decline suggested posts; for channels only
:param can_manage_tags: Pass :code:`True` if the administrator can edit the tags of regular members; for groups and supergroups only
:param request_timeout: Request timeout
:return: Returns :code:`True` on success.
"""
@ -2069,6 +2077,7 @@ class Bot:
can_pin_messages=can_pin_messages,
can_manage_topics=can_manage_topics,
can_manage_direct_messages=can_manage_direct_messages,
can_manage_tags=can_manage_tags,
)
return await self(call, request_timeout=request_timeout)
@ -3004,13 +3013,20 @@ class Bot:
is_anonymous: bool | None = None,
type: str | None = None,
allows_multiple_answers: bool | None = None,
correct_option_id: int | None = None,
allows_revoting: bool | None = None,
shuffle_options: bool | None = None,
allow_adding_options: bool | None = None,
hide_results_until_closes: bool | None = None,
correct_option_ids: list[int] | None = None,
explanation: str | None = None,
explanation_parse_mode: str | Default | None = Default("parse_mode"),
explanation_entities: list[MessageEntity] | None = None,
open_period: int | None = None,
close_date: DateTimeUnion | None = None,
is_closed: bool | None = None,
description: str | None = None,
description_parse_mode: str | Default | None = Default("parse_mode"),
description_entities: list[MessageEntity] | None = None,
disable_notification: bool | None = None,
protect_content: bool | Default | None = Default("protect_content"),
allow_paid_broadcast: bool | None = None,
@ -3018,6 +3034,7 @@ class Bot:
reply_parameters: ReplyParameters | None = None,
reply_markup: ReplyMarkupUnion | None = None,
allow_sending_without_reply: bool | None = None,
correct_option_id: int | None = None,
reply_to_message_id: int | None = None,
request_timeout: int | None = None,
) -> Message:
@ -3035,14 +3052,21 @@ class Bot:
: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 allows_multiple_answers: Pass :code:`True`, if the poll allows multiple answers, defaults to :code:`False`
:param allows_revoting: Pass :code:`True`, if the poll allows to change chosen answer options, defaults to :code:`False` for quizzes and to :code:`True` for regular polls
:param shuffle_options: Pass :code:`True`, if the poll options must be shown in random order
:param allow_adding_options: Pass :code:`True`, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes
:param hide_results_until_closes: Pass :code:`True`, if poll results must be shown only after the poll closes
:param correct_option_ids: A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, 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 <https://core.telegram.org/bots/api#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 open_period: Amount of time in seconds the poll will be active after creation, 5-2628000. 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 2628000 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 description: Description of the poll to be sent, 0-1024 characters after entities parsing
:param description_parse_mode: Mode for parsing entities in the poll description. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details.
:param description_entities: A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of *description_parse_mode*
:param disable_notification: Sends the message `silently <https://telegram.org/blog/channels-2-0#silent-messages>`_. Users will receive a notification with no sound.
:param protect_content: Protects the contents of the sent message from forwarding and saving
:param allow_paid_broadcast: Pass :code:`True` to allow up to 1000 messages per second, ignoring `broadcasting limits <https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once>`_ for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance
@ -3050,6 +3074,7 @@ class Bot:
:param reply_parameters: Description of the message to reply to
:param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_, `custom reply keyboard <https://core.telegram.org/bots/features#keyboards>`_, 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 correct_option_id: 0-based identifier of the correct answer option, required for polls in quiz mode
: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.
@ -3066,13 +3091,20 @@ class Bot:
is_anonymous=is_anonymous,
type=type,
allows_multiple_answers=allows_multiple_answers,
correct_option_id=correct_option_id,
allows_revoting=allows_revoting,
shuffle_options=shuffle_options,
allow_adding_options=allow_adding_options,
hide_results_until_closes=hide_results_until_closes,
correct_option_ids=correct_option_ids,
explanation=explanation,
explanation_parse_mode=explanation_parse_mode,
explanation_entities=explanation_entities,
open_period=open_period,
close_date=close_date,
is_closed=is_closed,
description=description,
description_parse_mode=description_parse_mode,
description_entities=description_entities,
disable_notification=disable_notification,
protect_content=protect_content,
allow_paid_broadcast=allow_paid_broadcast,
@ -3080,6 +3112,7 @@ class Bot:
reply_parameters=reply_parameters,
reply_markup=reply_markup,
allow_sending_without_reply=allow_sending_without_reply,
correct_option_id=correct_option_id,
reply_to_message_id=reply_to_message_id,
)
return await self(call, request_timeout=request_timeout)
@ -4900,8 +4933,8 @@ class Bot:
:param chat_id: Required if *user_id* is not specified. Unique identifier for the chat or username of the channel (in the format :code:`@channelusername`) that will receive the gift.
:param pay_for_upgrade: Pass :code:`True` to pay for the gift upgrade from the bot's balance, thereby making the upgrade free for the receiver
:param text: Text that will be shown along with the gift; 0-128 characters
:param text_parse_mode: Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.
:param text_entities: A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of *text_parse_mode*. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.
:param text_parse_mode: Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored.
:param text_entities: A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of *text_parse_mode*. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored.
:param request_timeout: Request timeout
:return: Returns :code:`True` on success.
"""
@ -5228,8 +5261,8 @@ class Bot:
:param month_count: Number of months the Telegram Premium subscription will be active for the user; must be one of 3, 6, or 12
:param star_count: Number of Telegram Stars to pay for the Telegram Premium subscription; must be 1000 for 3 months, 1500 for 6 months, and 2500 for 12 months
:param text: Text that will be shown along with the service message about the subscription; 0-128 characters
:param text_parse_mode: Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.
:param text_entities: A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of *text_parse_mode*. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored.
:param text_parse_mode: Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored.
:param text_entities: A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of *text_parse_mode*. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored.
:param request_timeout: Request timeout
:return: Returns :code:`True` on success.
"""
@ -5560,7 +5593,7 @@ class Bot:
:param chat_id: Unique identifier for the target chat
:param message_id: Unique identifier for the target message
:param checklist: A JSON-serialized object for the new checklist
:param reply_markup: A JSON-serialized object for the new inline keyboard for the message
:param reply_markup: A JSON-serialized object for the new `inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_ for the message
:param request_timeout: Request timeout
:return: On success, the edited :class:`aiogram.types.message.Message` is returned.
"""
@ -5614,7 +5647,7 @@ class Bot:
: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
:param reply_parameters: A JSON-serialized object for description of the message to reply to
:param reply_markup: A JSON-serialized object for an inline keyboard
:param reply_markup: A JSON-serialized object for an `inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_
:param request_timeout: Request timeout
:return: On success, the sent :class:`aiogram.types.message.Message` is returned.
"""
@ -5823,7 +5856,7 @@ class Bot:
request_timeout: int | None = None,
) -> bool:
"""
Use this method to stream a partial message to a user while the message is being generated; supported only for bots with forum topic mode enabled. Returns :code:`True` on success.
Use this method to stream a partial message to a user while the message is being generated. Returns :code:`True` on success.
Source: https://core.telegram.org/bots/api#sendmessagedraft
@ -5908,3 +5941,92 @@ class Bot:
photo=photo,
)
return await self(call, request_timeout=request_timeout)
async def set_chat_member_tag(
self,
chat_id: ChatIdUnion,
user_id: int,
tag: str | None = None,
request_timeout: int | None = None,
) -> bool:
"""
Use this method to set a tag for a regular member in a group or a supergroup. The bot must be an administrator in the chat for this to work and must have the *can_manage_tags* administrator right. Returns :code:`True` on success.
Source: https://core.telegram.org/bots/api#setchatmembertag
: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 tag: New tag for the member; 0-16 characters, emoji are not allowed
:param request_timeout: Request timeout
:return: Returns :code:`True` on success.
"""
call = SetChatMemberTag(
chat_id=chat_id,
user_id=user_id,
tag=tag,
)
return await self(call, request_timeout=request_timeout)
async def get_managed_bot_token(
self,
user_id: int,
request_timeout: int | None = None,
) -> str:
"""
Use this method to get the token of a managed bot. Returns the token as *String* on success.
Source: https://core.telegram.org/bots/api#getmanagedbottoken
:param user_id: User identifier of the managed bot whose token will be returned
:param request_timeout: Request timeout
:return: Returns the token as *String* on success.
"""
call = GetManagedBotToken(
user_id=user_id,
)
return await self(call, request_timeout=request_timeout)
async def replace_managed_bot_token(
self,
user_id: int,
request_timeout: int | None = None,
) -> str:
"""
Use this method to revoke the current token of a managed bot and generate a new one. Returns the new token as *String* on success.
Source: https://core.telegram.org/bots/api#replacemanagedbottoken
:param user_id: User identifier of the managed bot whose token will be replaced
:param request_timeout: Request timeout
:return: Returns the new token as *String* on success.
"""
call = ReplaceManagedBotToken(
user_id=user_id,
)
return await self(call, request_timeout=request_timeout)
async def save_prepared_keyboard_button(
self,
user_id: int,
button: KeyboardButton,
request_timeout: int | None = None,
) -> PreparedKeyboardButton:
"""
Stores a keyboard button that can be used by a user within a Mini App. Returns a :class:`aiogram.types.prepared_keyboard_button.PreparedKeyboardButton` object.
Source: https://core.telegram.org/bots/api#savepreparedkeyboardbutton
:param user_id: Unique identifier of the target user that can use the button
:param button: A JSON-serialized object describing the button to be saved. The button must be of the type *request_users*, *request_chat*, or *request_managed_bot*
:param request_timeout: Request timeout
:return: Returns a :class:`aiogram.types.prepared_keyboard_button.PreparedKeyboardButton` object.
"""
call = SavePreparedKeyboardButton(
user_id=user_id,
button=button,
)
return await self(call, request_timeout=request_timeout)

View file

@ -28,6 +28,14 @@ class Default:
def __repr__(self) -> str:
return f"<{self}>"
def __eq__(self, other: object) -> bool:
if not isinstance(other, Default):
return NotImplemented
return self._name == other._name
def __hash__(self) -> int:
return hash(self._name)
@dataclass(**dataclass_kwargs(slots=True, kw_only=True))
class DefaultBotProperties:

View file

@ -183,4 +183,6 @@ class UserContextMiddleware(BaseMiddleware):
return EventContext(
user=event.purchased_paid_media.from_user,
)
if event.managed_bot:
return EventContext(user=event.managed_bot.user)
return EventContext()

View file

@ -85,6 +85,7 @@ class Router:
router=self,
event_name="purchased_paid_media",
)
self.managed_bot = TelegramEventObserver(router=self, event_name="managed_bot")
self.errors = self.error = TelegramEventObserver(router=self, event_name="error")
@ -115,6 +116,7 @@ class Router:
"edited_business_message": self.edited_business_message,
"business_message": self.business_message,
"purchased_paid_media": self.purchased_paid_media,
"managed_bot": self.managed_bot,
"error": self.errors,
}
@ -131,7 +133,7 @@ class Router:
Is useful for getting updates only for registered event types.
:param skip_events: skip specified event names
:return: set of registered names
:return: sorted list of registered names
"""
handlers_in_use: set[str] = set()
if skip_events is None:
@ -143,7 +145,7 @@ class Router:
if observer.handlers and update_name not in skip_events:
handlers_in_use.add(update_name)
return list(sorted(handlers_in_use)) # NOQA: C413
return sorted(handlers_in_use)
async def propagate_event(self, update_type: str, event: TelegramObject, **kwargs: Any) -> Any:
kwargs.update(event_router=self)
@ -262,7 +264,7 @@ class Router:
:return:
"""
if not isinstance(router, Router):
msg = f"router should be instance of Router not {type(router).__class__.__name__}"
msg = f"router should be instance of Router not {type(router).__name__!r}"
raise ValueError(msg)
router.parent_router = self
return router

View file

@ -67,7 +67,10 @@ class ContentType(str, Enum):
GIVEAWAY = "giveaway"
GIVEAWAY_WINNERS = "giveaway_winners"
GIVEAWAY_COMPLETED = "giveaway_completed"
MANAGED_BOT_CREATED = "managed_bot_created"
PAID_MESSAGE_PRICE_CHANGED = "paid_message_price_changed"
POLL_OPTION_ADDED = "poll_option_added"
POLL_OPTION_DELETED = "poll_option_deleted"
SUGGESTED_POST_APPROVED = "suggested_post_approved"
SUGGESTED_POST_APPROVAL_FAILED = "suggested_post_approval_failed"
SUGGESTED_POST_DECLINED = "suggested_post_declined"

View file

@ -27,3 +27,4 @@ class MessageEntityType(str, Enum):
TEXT_LINK = "text_link"
TEXT_MENTION = "text_mention"
CUSTOM_EMOJI = "custom_emoji"
DATE_TIME = "date_time"

View file

@ -31,3 +31,4 @@ class UpdateType(str, Enum):
CHAT_JOIN_REQUEST = "chat_join_request"
CHAT_BOOST = "chat_boost"
REMOVED_CHAT_BOOST = "removed_chat_boost"
MANAGED_BOT = "managed_bot"

View file

@ -240,7 +240,7 @@ class CommandObject:
class CommandStart(Command):
def __init__(
self,
deep_link: bool = False,
deep_link: bool | None = None,
deep_link_encoded: bool = False,
ignore_case: bool = False,
ignore_mention: bool = False,
@ -282,7 +282,12 @@ class CommandStart(Command):
return command # noqa: RET504
def validate_deeplink(self, command: CommandObject) -> CommandObject:
if not self.deep_link:
if self.deep_link is None:
return command
if self.deep_link is False:
if command.args:
msg = "Deep-link was not expected"
raise CommandException(msg)
return command
if not command.args:
msg = "Deep-link was missing"

View file

@ -259,6 +259,7 @@ class SceneHandlerWrapper:
)
raise SceneException(msg) from None
event_update: Update = kwargs["event_update"]
scenes.data = {**scenes.data, **kwargs}
scene = self.scene(
wizard=SceneWizard(
scene_config=self.scene.__scene_config__,
@ -712,6 +713,9 @@ class ScenesManager:
:param kwargs: Additional keyword arguments to pass to the scene's wizard.enter() method.
:return: None
"""
if kwargs:
self.data = {**self.data, **kwargs}
if _check_active:
active_scene = await self._get_active_scene()
if active_scene is not None:

View file

@ -62,6 +62,7 @@ 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_managed_bot_token import GetManagedBotToken
from .get_me import GetMe
from .get_my_commands import GetMyCommands
from .get_my_default_administrator_rights import GetMyDefaultAdministratorRights
@ -92,11 +93,13 @@ from .remove_my_profile_photo import RemoveMyProfilePhoto
from .remove_user_verification import RemoveUserVerification
from .reopen_forum_topic import ReopenForumTopic
from .reopen_general_forum_topic import ReopenGeneralForumTopic
from .replace_managed_bot_token import ReplaceManagedBotToken
from .replace_sticker_in_set import ReplaceStickerInSet
from .repost_story import RepostStory
from .restrict_chat_member import RestrictChatMember
from .revoke_chat_invite_link import RevokeChatInviteLink
from .save_prepared_inline_message import SavePreparedInlineMessage
from .save_prepared_keyboard_button import SavePreparedKeyboardButton
from .send_animation import SendAnimation
from .send_audio import SendAudio
from .send_chat_action import SendChatAction
@ -126,6 +129,7 @@ from .set_business_account_profile_photo import SetBusinessAccountProfilePhoto
from .set_business_account_username import SetBusinessAccountUsername
from .set_chat_administrator_custom_title import SetChatAdministratorCustomTitle
from .set_chat_description import SetChatDescription
from .set_chat_member_tag import SetChatMemberTag
from .set_chat_menu_button import SetChatMenuButton
from .set_chat_permissions import SetChatPermissions
from .set_chat_photo import SetChatPhoto
@ -229,6 +233,7 @@ __all__ = (
"GetFile",
"GetForumTopicIconStickers",
"GetGameHighScores",
"GetManagedBotToken",
"GetMe",
"GetMyCommands",
"GetMyDefaultAdministratorRights",
@ -259,6 +264,7 @@ __all__ = (
"RemoveUserVerification",
"ReopenForumTopic",
"ReopenGeneralForumTopic",
"ReplaceManagedBotToken",
"ReplaceStickerInSet",
"RepostStory",
"Request",
@ -266,6 +272,7 @@ __all__ = (
"RestrictChatMember",
"RevokeChatInviteLink",
"SavePreparedInlineMessage",
"SavePreparedKeyboardButton",
"SendAnimation",
"SendAudio",
"SendChatAction",
@ -295,6 +302,7 @@ __all__ = (
"SetBusinessAccountUsername",
"SetChatAdministratorCustomTitle",
"SetChatDescription",
"SetChatMemberTag",
"SetChatMenuButton",
"SetChatPermissions",
"SetChatPhoto",

View file

@ -25,7 +25,7 @@ class EditMessageChecklist(TelegramMethod[Message]):
checklist: InputChecklist
"""A JSON-serialized object for the new checklist"""
reply_markup: InlineKeyboardMarkup | None = None
"""A JSON-serialized object for the new inline keyboard for the message"""
"""A JSON-serialized object for the new `inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_ for the message"""
if TYPE_CHECKING:
# DO NOT EDIT MANUALLY!!!

View file

@ -0,0 +1,28 @@
from typing import TYPE_CHECKING, Any
from .base import TelegramMethod
class GetManagedBotToken(TelegramMethod[str]):
"""
Use this method to get the token of a managed bot. Returns the token as *String* on success.
Source: https://core.telegram.org/bots/api#getmanagedbottoken
"""
__returning__ = str
__api_method__ = "getManagedBotToken"
user_id: int
"""User identifier of the managed bot whose token will be returned"""
if TYPE_CHECKING:
# DO NOT EDIT MANUALLY!!!
# This section was auto-generated via `butcher`
def __init__(__pydantic__self__, *, 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__(user_id=user_id, **__pydantic_kwargs)

View file

@ -25,9 +25,9 @@ class GiftPremiumSubscription(TelegramMethod[bool]):
text: str | None = None
"""Text that will be shown along with the service message about the subscription; 0-128 characters"""
text_parse_mode: str | None = None
"""Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored."""
"""Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored."""
text_entities: list[MessageEntity] | None = None
"""A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of *text_parse_mode*. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored."""
"""A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of *text_parse_mode*. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored."""
if TYPE_CHECKING:
# DO NOT EDIT MANUALLY!!!

View file

@ -52,6 +52,8 @@ class PromoteChatMember(TelegramMethod[bool]):
"""Pass :code:`True` if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only"""
can_manage_direct_messages: bool | None = None
"""Pass :code:`True` if the administrator can manage direct messages within the channel and decline suggested posts; for channels only"""
can_manage_tags: bool | None = None
"""Pass :code:`True` if the administrator can edit the tags of regular members; for groups and supergroups only"""
if TYPE_CHECKING:
# DO NOT EDIT MANUALLY!!!
@ -78,6 +80,7 @@ class PromoteChatMember(TelegramMethod[bool]):
can_pin_messages: bool | None = None,
can_manage_topics: bool | None = None,
can_manage_direct_messages: bool | None = None,
can_manage_tags: bool | None = None,
**__pydantic_kwargs: Any,
) -> None:
# DO NOT EDIT MANUALLY!!!
@ -103,5 +106,6 @@ class PromoteChatMember(TelegramMethod[bool]):
can_pin_messages=can_pin_messages,
can_manage_topics=can_manage_topics,
can_manage_direct_messages=can_manage_direct_messages,
can_manage_tags=can_manage_tags,
**__pydantic_kwargs,
)

View file

@ -0,0 +1,28 @@
from typing import TYPE_CHECKING, Any
from .base import TelegramMethod
class ReplaceManagedBotToken(TelegramMethod[str]):
"""
Use this method to revoke the current token of a managed bot and generate a new one. Returns the new token as *String* on success.
Source: https://core.telegram.org/bots/api#replacemanagedbottoken
"""
__returning__ = str
__api_method__ = "replaceManagedBotToken"
user_id: int
"""User identifier of the managed bot whose token will be replaced"""
if TYPE_CHECKING:
# DO NOT EDIT MANUALLY!!!
# This section was auto-generated via `butcher`
def __init__(__pydantic__self__, *, 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__(user_id=user_id, **__pydantic_kwargs)

View file

@ -0,0 +1,33 @@
from typing import TYPE_CHECKING, Any
from ..types import KeyboardButton, PreparedKeyboardButton
from .base import TelegramMethod
class SavePreparedKeyboardButton(TelegramMethod[PreparedKeyboardButton]):
"""
Stores a keyboard button that can be used by a user within a Mini App. Returns a :class:`aiogram.types.prepared_keyboard_button.PreparedKeyboardButton` object.
Source: https://core.telegram.org/bots/api#savepreparedkeyboardbutton
"""
__returning__ = PreparedKeyboardButton
__api_method__ = "savePreparedKeyboardButton"
user_id: int
"""Unique identifier of the target user that can use the button"""
button: KeyboardButton
"""A JSON-serialized object describing the button to be saved. The button must be of the type *request_users*, *request_chat*, or *request_managed_bot*"""
if TYPE_CHECKING:
# DO NOT EDIT MANUALLY!!!
# This section was auto-generated via `butcher`
def __init__(
__pydantic__self__, *, user_id: int, button: KeyboardButton, **__pydantic_kwargs: Any
) -> None:
# DO NOT 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, button=button, **__pydantic_kwargs)

View file

@ -31,7 +31,7 @@ class SendChecklist(TelegramMethod[Message]):
reply_parameters: ReplyParameters | None = None
"""A JSON-serialized object for description of the message to reply to"""
reply_markup: InlineKeyboardMarkup | None = None
"""A JSON-serialized object for an inline keyboard"""
"""A JSON-serialized object for an `inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_"""
if TYPE_CHECKING:
# DO NOT EDIT MANUALLY!!!

View file

@ -28,9 +28,9 @@ class SendGift(TelegramMethod[bool]):
text: str | None = None
"""Text that will be shown along with the gift; 0-128 characters"""
text_parse_mode: str | None = None
"""Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored."""
"""Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored."""
text_entities: list[MessageEntity] | None = None
"""A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of *text_parse_mode*. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', and 'custom_emoji' are ignored."""
"""A JSON-serialized list of special entities that appear in the gift text. It can be specified instead of *text_parse_mode*. Entities other than 'bold', 'italic', 'underline', 'strikethrough', 'spoiler', 'custom_emoji', and 'date_time' are ignored."""
if TYPE_CHECKING:
# DO NOT EDIT MANUALLY!!!

View file

@ -8,7 +8,7 @@ from .base import TelegramMethod
class SendMessageDraft(TelegramMethod[bool]):
"""
Use this method to stream a partial message to a user while the message is being generated; supported only for bots with forum topic mode enabled. Returns :code:`True` on success.
Use this method to stream a partial message to a user while the message is being generated. Returns :code:`True` on success.
Source: https://core.telegram.org/bots/api#sendmessagedraft
"""

View file

@ -46,9 +46,17 @@ class SendPoll(TelegramMethod[Message]):
type: str | None = None
"""Poll type, 'quiz' or 'regular', defaults to 'regular'"""
allows_multiple_answers: bool | None = None
""":code:`True`, if the poll allows multiple answers, ignored for polls in quiz mode, defaults to :code:`False`"""
correct_option_id: int | None = None
"""0-based identifier of the correct answer option, required for polls in quiz mode"""
"""Pass :code:`True`, if the poll allows multiple answers, defaults to :code:`False`"""
allows_revoting: bool | None = None
"""Pass :code:`True`, if the poll allows to change chosen answer options, defaults to :code:`False` for quizzes and to :code:`True` for regular polls"""
shuffle_options: bool | None = None
"""Pass :code:`True`, if the poll options must be shown in random order"""
allow_adding_options: bool | None = None
"""Pass :code:`True`, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes"""
hide_results_until_closes: bool | None = None
"""Pass :code:`True`, if poll results must be shown only after the poll closes"""
correct_option_ids: list[int] | None = None
"""A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, required for polls in quiz mode"""
explanation: str | None = 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: str | Default | None = Default("parse_mode")
@ -56,11 +64,17 @@ class SendPoll(TelegramMethod[Message]):
explanation_entities: list[MessageEntity] | None = 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: int | None = None
"""Amount of time in seconds the poll will be active after creation, 5-600. Can't be used together with *close_date*."""
"""Amount of time in seconds the poll will be active after creation, 5-2628000. Can't be used together with *close_date*."""
close_date: DateTimeUnion | None = 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*."""
"""Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 2628000 seconds in the future. Can't be used together with *open_period*."""
is_closed: bool | None = None
"""Pass :code:`True` if the poll needs to be immediately closed. This can be useful for poll preview."""
description: str | None = None
"""Description of the poll to be sent, 0-1024 characters after entities parsing"""
description_parse_mode: str | Default | None = Default("parse_mode")
"""Mode for parsing entities in the poll description. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details."""
description_entities: list[MessageEntity] | None = None
"""A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of *description_parse_mode*"""
disable_notification: bool | None = None
"""Sends the message `silently <https://telegram.org/blog/channels-2-0#silent-messages>`_. Users will receive a notification with no sound."""
protect_content: bool | Default | None = Default("protect_content")
@ -78,6 +92,11 @@ class SendPoll(TelegramMethod[Message]):
.. deprecated:: API:7.0
https://core.telegram.org/bots/api-changelog#december-29-2023"""
correct_option_id: int | None = Field(None, json_schema_extra={"deprecated": True})
"""0-based identifier of the correct answer option, required for polls in quiz mode
.. deprecated:: API:9.6
https://core.telegram.org/bots/api-changelog#april-3-2026"""
reply_to_message_id: int | None = Field(None, json_schema_extra={"deprecated": True})
"""If the message is a reply, ID of the original message
@ -101,13 +120,20 @@ class SendPoll(TelegramMethod[Message]):
is_anonymous: bool | None = None,
type: str | None = None,
allows_multiple_answers: bool | None = None,
correct_option_id: int | None = None,
allows_revoting: bool | None = None,
shuffle_options: bool | None = None,
allow_adding_options: bool | None = None,
hide_results_until_closes: bool | None = None,
correct_option_ids: list[int] | None = None,
explanation: str | None = None,
explanation_parse_mode: str | Default | None = Default("parse_mode"),
explanation_entities: list[MessageEntity] | None = None,
open_period: int | None = None,
close_date: DateTimeUnion | None = None,
is_closed: bool | None = None,
description: str | None = None,
description_parse_mode: str | Default | None = Default("parse_mode"),
description_entities: list[MessageEntity] | None = None,
disable_notification: bool | None = None,
protect_content: bool | Default | None = Default("protect_content"),
allow_paid_broadcast: bool | None = None,
@ -115,6 +141,7 @@ class SendPoll(TelegramMethod[Message]):
reply_parameters: ReplyParameters | None = None,
reply_markup: ReplyMarkupUnion | None = None,
allow_sending_without_reply: bool | None = None,
correct_option_id: int | None = None,
reply_to_message_id: int | None = None,
**__pydantic_kwargs: Any,
) -> None:
@ -133,13 +160,20 @@ class SendPoll(TelegramMethod[Message]):
is_anonymous=is_anonymous,
type=type,
allows_multiple_answers=allows_multiple_answers,
correct_option_id=correct_option_id,
allows_revoting=allows_revoting,
shuffle_options=shuffle_options,
allow_adding_options=allow_adding_options,
hide_results_until_closes=hide_results_until_closes,
correct_option_ids=correct_option_ids,
explanation=explanation,
explanation_parse_mode=explanation_parse_mode,
explanation_entities=explanation_entities,
open_period=open_period,
close_date=close_date,
is_closed=is_closed,
description=description,
description_parse_mode=description_parse_mode,
description_entities=description_entities,
disable_notification=disable_notification,
protect_content=protect_content,
allow_paid_broadcast=allow_paid_broadcast,
@ -147,6 +181,7 @@ class SendPoll(TelegramMethod[Message]):
reply_parameters=reply_parameters,
reply_markup=reply_markup,
allow_sending_without_reply=allow_sending_without_reply,
correct_option_id=correct_option_id,
reply_to_message_id=reply_to_message_id,
**__pydantic_kwargs,
)

View file

@ -0,0 +1,40 @@
from typing import TYPE_CHECKING, Any
from ..types import ChatIdUnion
from .base import TelegramMethod
class SetChatMemberTag(TelegramMethod[bool]):
"""
Use this method to set a tag for a regular member in a group or a supergroup. The bot must be an administrator in the chat for this to work and must have the *can_manage_tags* administrator right. Returns :code:`True` on success.
Source: https://core.telegram.org/bots/api#setchatmembertag
"""
__returning__ = bool
__api_method__ = "setChatMemberTag"
chat_id: ChatIdUnion
"""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"""
tag: str | None = None
"""New tag for the member; 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: ChatIdUnion,
user_id: int,
tag: str | None = 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, tag=tag, **__pydantic_kwargs)

View file

@ -495,6 +495,7 @@ __all__ = (
"KeyboardButton",
"KeyboardButtonPollType",
"KeyboardButtonRequestChat",
"KeyboardButtonRequestManagedBot",
"KeyboardButtonRequestUser",
"KeyboardButtonRequestUsers",
"LabeledPrice",
@ -502,6 +503,8 @@ __all__ = (
"Location",
"LocationAddress",
"LoginUrl",
"ManagedBotCreated",
"ManagedBotUpdated",
"MaskPosition",
"MaybeInaccessibleMessage",
"MaybeInaccessibleMessageUnion",
@ -554,8 +557,11 @@ __all__ = (
"Poll",
"PollAnswer",
"PollOption",
"PollOptionAdded",
"PollOptionDeleted",
"PreCheckoutQuery",
"PreparedInlineMessage",
"PreparedKeyboardButton",
"ProximityAlertTriggered",
"ReactionCount",
"ReactionType",
@ -652,6 +658,12 @@ __all__ = (
from ..client.default import Default as _Default
from .chat_owner_changed import ChatOwnerChanged
from .chat_owner_left import ChatOwnerLeft
from .keyboard_button_request_managed_bot import KeyboardButtonRequestManagedBot
from .managed_bot_created import ManagedBotCreated
from .managed_bot_updated import ManagedBotUpdated
from .poll_option_added import PollOptionAdded
from .poll_option_deleted import PollOptionDeleted
from .prepared_keyboard_button import PreparedKeyboardButton
from .user_profile_audios import UserProfileAudios
from .video_quality import VideoQuality

View file

@ -16,6 +16,7 @@ class TelegramObject(BotContextController, BaseModel):
populate_by_name=True,
arbitrary_types_allowed=True,
defer_build=True,
protected_namespaces=(),
)
@model_validator(mode="before")

View file

@ -28,6 +28,7 @@ if TYPE_CHECKING:
SendChatAction,
SetChatAdministratorCustomTitle,
SetChatDescription,
SetChatMemberTag,
SetChatPermissions,
SetChatPhoto,
SetChatStickerSet,
@ -967,6 +968,38 @@ class Chat(TelegramObject):
**kwargs,
).as_(self._bot)
def set_member_tag(
self,
user_id: int,
tag: str | None = None,
**kwargs: Any,
) -> SetChatMemberTag:
"""
Shortcut for method :class:`aiogram.methods.set_chat_member_tag.SetChatMemberTag`
will automatically fill method attributes:
- :code:`chat_id`
Use this method to set a tag for a regular member in a group or a supergroup. The bot must be an administrator in the chat for this to work and must have the *can_manage_tags* administrator right. Returns :code:`True` on success.
Source: https://core.telegram.org/bots/api#setchatmembertag
:param user_id: Unique identifier of the target user
:param tag: New tag for the member; 0-16 characters, emoji are not allowed
:return: instance of method :class:`aiogram.methods.set_chat_member_tag.SetChatMemberTag`
"""
# DO NOT EDIT MANUALLY!!!
# This method was auto-generated via `butcher`
from aiogram.methods import SetChatMemberTag
return SetChatMemberTag(
chat_id=self.id,
user_id=user_id,
tag=tag,
**kwargs,
).as_(self._bot)
def set_permissions(
self,
permissions: ChatPermissions,
@ -1018,6 +1051,7 @@ class Chat(TelegramObject):
can_pin_messages: bool | None = None,
can_manage_topics: bool | None = None,
can_manage_direct_messages: bool | None = None,
can_manage_tags: bool | None = None,
**kwargs: Any,
) -> PromoteChatMember:
"""
@ -1047,6 +1081,7 @@ class Chat(TelegramObject):
: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 can_manage_direct_messages: Pass :code:`True` if the administrator can manage direct messages within the channel and decline suggested posts; for channels only
:param can_manage_tags: Pass :code:`True` if the administrator can edit the tags of regular members; for groups and supergroups only
:return: instance of method :class:`aiogram.methods.promote_chat_member.PromoteChatMember`
"""
# DO NOT EDIT MANUALLY!!!
@ -1073,6 +1108,7 @@ class Chat(TelegramObject):
can_pin_messages=can_pin_messages,
can_manage_topics=can_manage_topics,
can_manage_direct_messages=can_manage_direct_messages,
can_manage_tags=can_manage_tags,
**kwargs,
).as_(self._bot)

View file

@ -47,6 +47,8 @@ class ChatAdministratorRights(TelegramObject):
"""*Optional*. :code:`True`, if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only"""
can_manage_direct_messages: bool | None = None
"""*Optional*. :code:`True`, if the administrator can manage direct messages of the channel and decline suggested posts; for channels only"""
can_manage_tags: bool | None = None
"""*Optional*. :code:`True`, if the administrator can edit the tags of regular members; for groups and supergroups only. If omitted defaults to the value of can_pin_messages."""
if TYPE_CHECKING:
# DO NOT EDIT MANUALLY!!!
@ -71,6 +73,7 @@ class ChatAdministratorRights(TelegramObject):
can_pin_messages: bool | None = None,
can_manage_topics: bool | None = None,
can_manage_direct_messages: bool | None = None,
can_manage_tags: bool | None = None,
**__pydantic_kwargs: Any,
) -> None:
# DO NOT EDIT MANUALLY!!!
@ -94,5 +97,6 @@ class ChatAdministratorRights(TelegramObject):
can_pin_messages=can_pin_messages,
can_manage_topics=can_manage_topics,
can_manage_direct_messages=can_manage_direct_messages,
can_manage_tags=can_manage_tags,
**__pydantic_kwargs,
)

View file

@ -1783,13 +1783,20 @@ class ChatJoinRequest(TelegramObject):
is_anonymous: bool | None = None,
type: str | None = None,
allows_multiple_answers: bool | None = None,
correct_option_id: int | None = None,
allows_revoting: bool | None = None,
shuffle_options: bool | None = None,
allow_adding_options: bool | None = None,
hide_results_until_closes: bool | None = None,
correct_option_ids: list[int] | None = None,
explanation: str | None = None,
explanation_parse_mode: str | Default | None = Default("parse_mode"),
explanation_entities: list[MessageEntity] | None = None,
open_period: int | None = None,
close_date: DateTimeUnion | None = None,
is_closed: bool | None = None,
description: str | None = None,
description_parse_mode: str | Default | None = Default("parse_mode"),
description_entities: list[MessageEntity] | None = None,
disable_notification: bool | None = None,
protect_content: bool | Default | None = Default("protect_content"),
allow_paid_broadcast: bool | None = None,
@ -1797,6 +1804,7 @@ class ChatJoinRequest(TelegramObject):
reply_parameters: ReplyParameters | None = None,
reply_markup: ReplyMarkupUnion | None = None,
allow_sending_without_reply: bool | None = None,
correct_option_id: int | None = None,
reply_to_message_id: int | None = None,
**kwargs: Any,
) -> SendPoll:
@ -1818,14 +1826,21 @@ class ChatJoinRequest(TelegramObject):
: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 allows_multiple_answers: Pass :code:`True`, if the poll allows multiple answers, defaults to :code:`False`
:param allows_revoting: Pass :code:`True`, if the poll allows to change chosen answer options, defaults to :code:`False` for quizzes and to :code:`True` for regular polls
:param shuffle_options: Pass :code:`True`, if the poll options must be shown in random order
:param allow_adding_options: Pass :code:`True`, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes
:param hide_results_until_closes: Pass :code:`True`, if poll results must be shown only after the poll closes
:param correct_option_ids: A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, 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 <https://core.telegram.org/bots/api#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 open_period: Amount of time in seconds the poll will be active after creation, 5-2628000. 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 2628000 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 description: Description of the poll to be sent, 0-1024 characters after entities parsing
:param description_parse_mode: Mode for parsing entities in the poll description. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details.
:param description_entities: A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of *description_parse_mode*
:param disable_notification: Sends the message `silently <https://telegram.org/blog/channels-2-0#silent-messages>`_. Users will receive a notification with no sound.
:param protect_content: Protects the contents of the sent message from forwarding and saving
:param allow_paid_broadcast: Pass :code:`True` to allow up to 1000 messages per second, ignoring `broadcasting limits <https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once>`_ for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance
@ -1833,6 +1848,7 @@ class ChatJoinRequest(TelegramObject):
:param reply_parameters: Description of the message to reply to
:param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_, `custom reply keyboard <https://core.telegram.org/bots/features#keyboards>`_, 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 correct_option_id: 0-based identifier of the correct answer option, required for polls in quiz mode
: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`
"""
@ -1852,13 +1868,20 @@ class ChatJoinRequest(TelegramObject):
is_anonymous=is_anonymous,
type=type,
allows_multiple_answers=allows_multiple_answers,
correct_option_id=correct_option_id,
allows_revoting=allows_revoting,
shuffle_options=shuffle_options,
allow_adding_options=allow_adding_options,
hide_results_until_closes=hide_results_until_closes,
correct_option_ids=correct_option_ids,
explanation=explanation,
explanation_parse_mode=explanation_parse_mode,
explanation_entities=explanation_entities,
open_period=open_period,
close_date=close_date,
is_closed=is_closed,
description=description,
description_parse_mode=description_parse_mode,
description_entities=description_entities,
disable_notification=disable_notification,
protect_content=protect_content,
allow_paid_broadcast=allow_paid_broadcast,
@ -1866,6 +1889,7 @@ class ChatJoinRequest(TelegramObject):
reply_parameters=reply_parameters,
reply_markup=reply_markup,
allow_sending_without_reply=allow_sending_without_reply,
correct_option_id=correct_option_id,
reply_to_message_id=reply_to_message_id,
**kwargs,
).as_(self._bot)
@ -1881,13 +1905,20 @@ class ChatJoinRequest(TelegramObject):
is_anonymous: bool | None = None,
type: str | None = None,
allows_multiple_answers: bool | None = None,
correct_option_id: int | None = None,
allows_revoting: bool | None = None,
shuffle_options: bool | None = None,
allow_adding_options: bool | None = None,
hide_results_until_closes: bool | None = None,
correct_option_ids: list[int] | None = None,
explanation: str | None = None,
explanation_parse_mode: str | Default | None = Default("parse_mode"),
explanation_entities: list[MessageEntity] | None = None,
open_period: int | None = None,
close_date: DateTimeUnion | None = None,
is_closed: bool | None = None,
description: str | None = None,
description_parse_mode: str | Default | None = Default("parse_mode"),
description_entities: list[MessageEntity] | None = None,
disable_notification: bool | None = None,
protect_content: bool | Default | None = Default("protect_content"),
allow_paid_broadcast: bool | None = None,
@ -1895,6 +1926,7 @@ class ChatJoinRequest(TelegramObject):
reply_parameters: ReplyParameters | None = None,
reply_markup: ReplyMarkupUnion | None = None,
allow_sending_without_reply: bool | None = None,
correct_option_id: int | None = None,
reply_to_message_id: int | None = None,
**kwargs: Any,
) -> SendPoll:
@ -1916,14 +1948,21 @@ class ChatJoinRequest(TelegramObject):
: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 allows_multiple_answers: Pass :code:`True`, if the poll allows multiple answers, defaults to :code:`False`
:param allows_revoting: Pass :code:`True`, if the poll allows to change chosen answer options, defaults to :code:`False` for quizzes and to :code:`True` for regular polls
:param shuffle_options: Pass :code:`True`, if the poll options must be shown in random order
:param allow_adding_options: Pass :code:`True`, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes
:param hide_results_until_closes: Pass :code:`True`, if poll results must be shown only after the poll closes
:param correct_option_ids: A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, 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 <https://core.telegram.org/bots/api#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 open_period: Amount of time in seconds the poll will be active after creation, 5-2628000. 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 2628000 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 description: Description of the poll to be sent, 0-1024 characters after entities parsing
:param description_parse_mode: Mode for parsing entities in the poll description. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details.
:param description_entities: A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of *description_parse_mode*
:param disable_notification: Sends the message `silently <https://telegram.org/blog/channels-2-0#silent-messages>`_. Users will receive a notification with no sound.
:param protect_content: Protects the contents of the sent message from forwarding and saving
:param allow_paid_broadcast: Pass :code:`True` to allow up to 1000 messages per second, ignoring `broadcasting limits <https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once>`_ for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance
@ -1931,6 +1970,7 @@ class ChatJoinRequest(TelegramObject):
:param reply_parameters: Description of the message to reply to
:param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_, `custom reply keyboard <https://core.telegram.org/bots/features#keyboards>`_, 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 correct_option_id: 0-based identifier of the correct answer option, required for polls in quiz mode
: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`
"""
@ -1950,13 +1990,20 @@ class ChatJoinRequest(TelegramObject):
is_anonymous=is_anonymous,
type=type,
allows_multiple_answers=allows_multiple_answers,
correct_option_id=correct_option_id,
allows_revoting=allows_revoting,
shuffle_options=shuffle_options,
allow_adding_options=allow_adding_options,
hide_results_until_closes=hide_results_until_closes,
correct_option_ids=correct_option_ids,
explanation=explanation,
explanation_parse_mode=explanation_parse_mode,
explanation_entities=explanation_entities,
open_period=open_period,
close_date=close_date,
is_closed=is_closed,
description=description,
description_parse_mode=description_parse_mode,
description_entities=description_entities,
disable_notification=disable_notification,
protect_content=protect_content,
allow_paid_broadcast=allow_paid_broadcast,
@ -1964,6 +2011,7 @@ class ChatJoinRequest(TelegramObject):
reply_parameters=reply_parameters,
reply_markup=reply_markup,
allow_sending_without_reply=allow_sending_without_reply,
correct_option_id=correct_option_id,
reply_to_message_id=reply_to_message_id,
**kwargs,
).as_(self._bot)

View file

@ -54,6 +54,8 @@ class ChatMemberAdministrator(ChatMember):
"""*Optional*. :code:`True`, if the user is allowed to create, rename, close, and reopen forum topics; for supergroups only"""
can_manage_direct_messages: bool | None = None
"""*Optional*. :code:`True`, if the administrator can manage direct messages of the channel and decline suggested posts; for channels only"""
can_manage_tags: bool | None = None
"""*Optional*. :code:`True`, if the administrator can edit the tags of regular members; for groups and supergroups only. If omitted defaults to the value of can_pin_messages."""
custom_title: str | None = None
"""*Optional*. Custom title for this user"""
@ -83,6 +85,7 @@ class ChatMemberAdministrator(ChatMember):
can_pin_messages: bool | None = None,
can_manage_topics: bool | None = None,
can_manage_direct_messages: bool | None = None,
can_manage_tags: bool | None = None,
custom_title: str | None = None,
**__pydantic_kwargs: Any,
) -> None:
@ -110,6 +113,7 @@ class ChatMemberAdministrator(ChatMember):
can_pin_messages=can_pin_messages,
can_manage_topics=can_manage_topics,
can_manage_direct_messages=can_manage_direct_messages,
can_manage_tags=can_manage_tags,
custom_title=custom_title,
**__pydantic_kwargs,
)

View file

@ -21,6 +21,8 @@ class ChatMemberMember(ChatMember):
"""The member's status in the chat, always 'member'"""
user: User
"""Information about the user"""
tag: str | None = None
"""*Optional*. Tag of the member"""
until_date: DateTime | None = None
"""*Optional*. Date when the user's subscription will expire; Unix time"""
@ -33,6 +35,7 @@ class ChatMemberMember(ChatMember):
*,
status: Literal[ChatMemberStatus.MEMBER] = ChatMemberStatus.MEMBER,
user: User,
tag: str | None = None,
until_date: DateTime | None = None,
**__pydantic_kwargs: Any,
) -> None:
@ -40,4 +43,6 @@ class ChatMemberMember(ChatMember):
# 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)
super().__init__(
status=status, user=user, tag=tag, until_date=until_date, **__pydantic_kwargs
)

View file

@ -43,6 +43,8 @@ class ChatMemberRestricted(ChatMember):
""":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_edit_tag: bool
""":code:`True`, if the user is allowed to edit their own tag"""
can_change_info: bool
""":code:`True`, if the user is allowed to change the chat title, photo and other settings"""
can_invite_users: bool
@ -53,6 +55,8 @@ class ChatMemberRestricted(ChatMember):
""":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"""
tag: str | None = None
"""*Optional*. Tag of the member"""
if TYPE_CHECKING:
# DO NOT EDIT MANUALLY!!!
@ -74,11 +78,13 @@ class ChatMemberRestricted(ChatMember):
can_send_polls: bool,
can_send_other_messages: bool,
can_add_web_page_previews: bool,
can_edit_tag: bool,
can_change_info: bool,
can_invite_users: bool,
can_pin_messages: bool,
can_manage_topics: bool,
until_date: DateTime,
tag: str | None = None,
**__pydantic_kwargs: Any,
) -> None:
# DO NOT EDIT MANUALLY!!!
@ -99,10 +105,12 @@ class ChatMemberRestricted(ChatMember):
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_edit_tag=can_edit_tag,
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,
tag=tag,
**__pydantic_kwargs,
)

View file

@ -924,13 +924,20 @@ class ChatMemberUpdated(TelegramObject):
is_anonymous: bool | None = None,
type: str | None = None,
allows_multiple_answers: bool | None = None,
correct_option_id: int | None = None,
allows_revoting: bool | None = None,
shuffle_options: bool | None = None,
allow_adding_options: bool | None = None,
hide_results_until_closes: bool | None = None,
correct_option_ids: list[int] | None = None,
explanation: str | None = None,
explanation_parse_mode: str | Default | None = Default("parse_mode"),
explanation_entities: list[MessageEntity] | None = None,
open_period: int | None = None,
close_date: DateTimeUnion | None = None,
is_closed: bool | None = None,
description: str | None = None,
description_parse_mode: str | Default | None = Default("parse_mode"),
description_entities: list[MessageEntity] | None = None,
disable_notification: bool | None = None,
protect_content: bool | Default | None = Default("protect_content"),
allow_paid_broadcast: bool | None = None,
@ -938,6 +945,7 @@ class ChatMemberUpdated(TelegramObject):
reply_parameters: ReplyParameters | None = None,
reply_markup: ReplyMarkupUnion | None = None,
allow_sending_without_reply: bool | None = None,
correct_option_id: int | None = None,
reply_to_message_id: int | None = None,
**kwargs: Any,
) -> SendPoll:
@ -959,14 +967,21 @@ class ChatMemberUpdated(TelegramObject):
: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 allows_multiple_answers: Pass :code:`True`, if the poll allows multiple answers, defaults to :code:`False`
:param allows_revoting: Pass :code:`True`, if the poll allows to change chosen answer options, defaults to :code:`False` for quizzes and to :code:`True` for regular polls
:param shuffle_options: Pass :code:`True`, if the poll options must be shown in random order
:param allow_adding_options: Pass :code:`True`, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes
:param hide_results_until_closes: Pass :code:`True`, if poll results must be shown only after the poll closes
:param correct_option_ids: A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, 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 <https://core.telegram.org/bots/api#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 open_period: Amount of time in seconds the poll will be active after creation, 5-2628000. 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 2628000 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 description: Description of the poll to be sent, 0-1024 characters after entities parsing
:param description_parse_mode: Mode for parsing entities in the poll description. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details.
:param description_entities: A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of *description_parse_mode*
:param disable_notification: Sends the message `silently <https://telegram.org/blog/channels-2-0#silent-messages>`_. Users will receive a notification with no sound.
:param protect_content: Protects the contents of the sent message from forwarding and saving
:param allow_paid_broadcast: Pass :code:`True` to allow up to 1000 messages per second, ignoring `broadcasting limits <https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once>`_ for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance
@ -974,6 +989,7 @@ class ChatMemberUpdated(TelegramObject):
:param reply_parameters: Description of the message to reply to
:param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_, `custom reply keyboard <https://core.telegram.org/bots/features#keyboards>`_, 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 correct_option_id: 0-based identifier of the correct answer option, required for polls in quiz mode
: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`
"""
@ -993,13 +1009,20 @@ class ChatMemberUpdated(TelegramObject):
is_anonymous=is_anonymous,
type=type,
allows_multiple_answers=allows_multiple_answers,
correct_option_id=correct_option_id,
allows_revoting=allows_revoting,
shuffle_options=shuffle_options,
allow_adding_options=allow_adding_options,
hide_results_until_closes=hide_results_until_closes,
correct_option_ids=correct_option_ids,
explanation=explanation,
explanation_parse_mode=explanation_parse_mode,
explanation_entities=explanation_entities,
open_period=open_period,
close_date=close_date,
is_closed=is_closed,
description=description,
description_parse_mode=description_parse_mode,
description_entities=description_entities,
disable_notification=disable_notification,
protect_content=protect_content,
allow_paid_broadcast=allow_paid_broadcast,
@ -1007,6 +1030,7 @@ class ChatMemberUpdated(TelegramObject):
reply_parameters=reply_parameters,
reply_markup=reply_markup,
allow_sending_without_reply=allow_sending_without_reply,
correct_option_id=correct_option_id,
reply_to_message_id=reply_to_message_id,
**kwargs,
).as_(self._bot)

View file

@ -32,6 +32,8 @@ class ChatPermissions(MutableTelegramObject):
"""*Optional*. :code:`True`, if the user is allowed to send animations, games, stickers and use inline bots"""
can_add_web_page_previews: bool | None = None
"""*Optional*. :code:`True`, if the user is allowed to add web page previews to their messages"""
can_edit_tag: bool | None = None
"""*Optional*. :code:`True`, if the user is allowed to edit their own tag"""
can_change_info: bool | None = 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: bool | None = None
@ -58,6 +60,7 @@ class ChatPermissions(MutableTelegramObject):
can_send_polls: bool | None = None,
can_send_other_messages: bool | None = None,
can_add_web_page_previews: bool | None = None,
can_edit_tag: bool | None = None,
can_change_info: bool | None = None,
can_invite_users: bool | None = None,
can_pin_messages: bool | None = None,
@ -79,6 +82,7 @@ class ChatPermissions(MutableTelegramObject):
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_edit_tag=can_edit_tag,
can_change_info=can_change_info,
can_invite_users=can_invite_users,
can_pin_messages=can_pin_messages,

View file

@ -15,8 +15,6 @@ class GameHighScore(TelegramObject):
If you've got any questions, please check out our `https://core.telegram.org/bots/faq <https://core.telegram.org/bots/faq>`_ **Bot FAQ »**
-
Source: https://core.telegram.org/bots/api#gamehighscore
"""

View file

@ -1746,13 +1746,20 @@ class InaccessibleMessage(MaybeInaccessibleMessage):
is_anonymous: bool | None = None,
type: str | None = None,
allows_multiple_answers: bool | None = None,
correct_option_id: int | None = None,
allows_revoting: bool | None = None,
shuffle_options: bool | None = None,
allow_adding_options: bool | None = None,
hide_results_until_closes: bool | None = None,
correct_option_ids: list[int] | None = None,
explanation: str | None = None,
explanation_parse_mode: str | Default | None = Default("parse_mode"),
explanation_entities: list[MessageEntity] | None = None,
open_period: int | None = None,
close_date: DateTimeUnion | None = None,
is_closed: bool | None = None,
description: str | None = None,
description_parse_mode: str | Default | None = Default("parse_mode"),
description_entities: list[MessageEntity] | None = None,
disable_notification: bool | None = None,
protect_content: bool | Default | None = Default("protect_content"),
allow_paid_broadcast: bool | None = None,
@ -1760,6 +1767,7 @@ class InaccessibleMessage(MaybeInaccessibleMessage):
reply_parameters: ReplyParameters | None = None,
reply_markup: ReplyMarkupUnion | None = None,
allow_sending_without_reply: bool | None = None,
correct_option_id: int | None = None,
reply_to_message_id: int | None = None,
**kwargs: Any,
) -> SendPoll:
@ -1781,14 +1789,21 @@ class InaccessibleMessage(MaybeInaccessibleMessage):
: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 allows_multiple_answers: Pass :code:`True`, if the poll allows multiple answers, defaults to :code:`False`
:param allows_revoting: Pass :code:`True`, if the poll allows to change chosen answer options, defaults to :code:`False` for quizzes and to :code:`True` for regular polls
:param shuffle_options: Pass :code:`True`, if the poll options must be shown in random order
:param allow_adding_options: Pass :code:`True`, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes
:param hide_results_until_closes: Pass :code:`True`, if poll results must be shown only after the poll closes
:param correct_option_ids: A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, 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 <https://core.telegram.org/bots/api#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 open_period: Amount of time in seconds the poll will be active after creation, 5-2628000. 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 2628000 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 description: Description of the poll to be sent, 0-1024 characters after entities parsing
:param description_parse_mode: Mode for parsing entities in the poll description. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details.
:param description_entities: A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of *description_parse_mode*
:param disable_notification: Sends the message `silently <https://telegram.org/blog/channels-2-0#silent-messages>`_. Users will receive a notification with no sound.
:param protect_content: Protects the contents of the sent message from forwarding and saving
:param allow_paid_broadcast: Pass :code:`True` to allow up to 1000 messages per second, ignoring `broadcasting limits <https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once>`_ for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance
@ -1796,6 +1811,7 @@ class InaccessibleMessage(MaybeInaccessibleMessage):
:param reply_parameters: Description of the message to reply to
:param reply_markup: Additional interface options. A JSON-serialized object for an `inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_, `custom reply keyboard <https://core.telegram.org/bots/features#keyboards>`_, 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 correct_option_id: 0-based identifier of the correct answer option, required for polls in quiz mode
: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`
"""
@ -1819,13 +1835,20 @@ class InaccessibleMessage(MaybeInaccessibleMessage):
is_anonymous=is_anonymous,
type=type,
allows_multiple_answers=allows_multiple_answers,
correct_option_id=correct_option_id,
allows_revoting=allows_revoting,
shuffle_options=shuffle_options,
allow_adding_options=allow_adding_options,
hide_results_until_closes=hide_results_until_closes,
correct_option_ids=correct_option_ids,
explanation=explanation,
explanation_parse_mode=explanation_parse_mode,
explanation_entities=explanation_entities,
open_period=open_period,
close_date=close_date,
is_closed=is_closed,
description=description,
description_parse_mode=description_parse_mode,
description_entities=description_entities,
disable_notification=disable_notification,
protect_content=protect_content,
allow_paid_broadcast=allow_paid_broadcast,
@ -1833,6 +1856,7 @@ class InaccessibleMessage(MaybeInaccessibleMessage):
reply_parameters=reply_parameters,
reply_markup=reply_markup,
allow_sending_without_reply=allow_sending_without_reply,
correct_option_id=correct_option_id,
reply_to_message_id=reply_to_message_id,
**kwargs,
).as_(self._bot)
@ -1848,19 +1872,27 @@ class InaccessibleMessage(MaybeInaccessibleMessage):
is_anonymous: bool | None = None,
type: str | None = None,
allows_multiple_answers: bool | None = None,
correct_option_id: int | None = None,
allows_revoting: bool | None = None,
shuffle_options: bool | None = None,
allow_adding_options: bool | None = None,
hide_results_until_closes: bool | None = None,
correct_option_ids: list[int] | None = None,
explanation: str | None = None,
explanation_parse_mode: str | Default | None = Default("parse_mode"),
explanation_entities: list[MessageEntity] | None = None,
open_period: int | None = None,
close_date: DateTimeUnion | None = None,
is_closed: bool | None = None,
description: str | None = None,
description_parse_mode: str | Default | None = Default("parse_mode"),
description_entities: list[MessageEntity] | None = None,
disable_notification: bool | None = None,
protect_content: bool | Default | None = Default("protect_content"),
allow_paid_broadcast: bool | None = None,
message_effect_id: str | None = None,
reply_markup: ReplyMarkupUnion | None = None,
allow_sending_without_reply: bool | None = None,
correct_option_id: int | None = None,
**kwargs: Any,
) -> SendPoll:
"""
@ -1882,20 +1914,28 @@ class InaccessibleMessage(MaybeInaccessibleMessage):
: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 allows_multiple_answers: Pass :code:`True`, if the poll allows multiple answers, defaults to :code:`False`
:param allows_revoting: Pass :code:`True`, if the poll allows to change chosen answer options, defaults to :code:`False` for quizzes and to :code:`True` for regular polls
:param shuffle_options: Pass :code:`True`, if the poll options must be shown in random order
:param allow_adding_options: Pass :code:`True`, if answer options can be added to the poll after creation; not supported for anonymous polls and quizzes
:param hide_results_until_closes: Pass :code:`True`, if poll results must be shown only after the poll closes
:param correct_option_ids: A JSON-serialized list of monotonically increasing 0-based identifiers of the correct answer options, 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 <https://core.telegram.org/bots/api#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 open_period: Amount of time in seconds the poll will be active after creation, 5-2628000. 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 2628000 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 description: Description of the poll to be sent, 0-1024 characters after entities parsing
:param description_parse_mode: Mode for parsing entities in the poll description. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details.
:param description_entities: A JSON-serialized list of special entities that appear in the poll description, which can be specified instead of *description_parse_mode*
:param disable_notification: Sends the message `silently <https://telegram.org/blog/channels-2-0#silent-messages>`_. Users will receive a notification with no sound.
:param protect_content: Protects the contents of the sent message from forwarding and saving
:param allow_paid_broadcast: Pass :code:`True` to allow up to 1000 messages per second, ignoring `broadcasting limits <https://core.telegram.org/bots/faq#how-can-i-message-all-of-my-bot-39s-subscribers-at-once>`_ for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance
: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 <https://core.telegram.org/bots/features#inline-keyboards>`_, `custom reply keyboard <https://core.telegram.org/bots/features#keyboards>`_, 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 correct_option_id: 0-based identifier of the correct answer option, required for polls in quiz mode
:return: instance of method :class:`aiogram.methods.send_poll.SendPoll`
"""
# DO NOT EDIT MANUALLY!!!
@ -1919,19 +1959,27 @@ class InaccessibleMessage(MaybeInaccessibleMessage):
is_anonymous=is_anonymous,
type=type,
allows_multiple_answers=allows_multiple_answers,
correct_option_id=correct_option_id,
allows_revoting=allows_revoting,
shuffle_options=shuffle_options,
allow_adding_options=allow_adding_options,
hide_results_until_closes=hide_results_until_closes,
correct_option_ids=correct_option_ids,
explanation=explanation,
explanation_parse_mode=explanation_parse_mode,
explanation_entities=explanation_entities,
open_period=open_period,
close_date=close_date,
is_closed=is_closed,
description=description,
description_parse_mode=description_parse_mode,
description_entities=description_entities,
disable_notification=disable_notification,
protect_content=protect_content,
allow_paid_broadcast=allow_paid_broadcast,
message_effect_id=message_effect_id,
reply_markup=reply_markup,
allow_sending_without_reply=allow_sending_without_reply,
correct_option_id=correct_option_id,
**kwargs,
).as_(self._bot)

View file

@ -38,7 +38,7 @@ class InlineQueryResultDocument(InlineQueryResult):
description: str | None = None
"""*Optional*. Short description of the result"""
reply_markup: InlineKeyboardMarkup | None = None
"""*Optional*. Inline keyboard attached to the message"""
"""*Optional*. `Inline keyboard <https://core.telegram.org/bots/features#inline-keyboards>`_ attached to the message"""
input_message_content: InputMessageContentUnion | None = None
"""*Optional*. Content of the message to be sent instead of the file"""
thumbnail_url: str | None = None

View file

@ -23,7 +23,7 @@ class InputChecklist(TelegramObject):
parse_mode: str | None = None
"""*Optional*. Mode for parsing entities in the title. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details."""
title_entities: list[MessageEntity] | None = None
"""*Optional*. List of special entities that appear in the title, which can be specified instead of parse_mode. Currently, only *bold*, *italic*, *underline*, *strikethrough*, *spoiler*, and *custom_emoji* entities are allowed."""
"""*Optional*. List of special entities that appear in the title, which can be specified instead of parse_mode. Currently, only *bold*, *italic*, *underline*, *strikethrough*, *spoiler*, *custom_emoji*, and *date_time* entities are allowed."""
others_can_add_tasks: bool | None = None
"""*Optional*. Pass :code:`True` if other users can add tasks to the checklist"""
others_can_mark_tasks_as_done: bool | None = None

View file

@ -22,7 +22,7 @@ class InputChecklistTask(TelegramObject):
parse_mode: str | None = None
"""*Optional*. Mode for parsing entities in the text. See `formatting options <https://core.telegram.org/bots/api#formatting-options>`_ for more details."""
text_entities: list[MessageEntity] | None = None
"""*Optional*. List of special entities that appear in the text, which can be specified instead of parse_mode. Currently, only *bold*, *italic*, *underline*, *strikethrough*, *spoiler*, and *custom_emoji* entities are allowed."""
"""*Optional*. List of special entities that appear in the text, which can be specified instead of parse_mode. Currently, only *bold*, *italic*, *underline*, *strikethrough*, *spoiler*, *custom_emoji*, and *date_time* entities are allowed."""
if TYPE_CHECKING:
# DO NOT EDIT MANUALLY!!!

View file

@ -9,6 +9,7 @@ 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_managed_bot import KeyboardButtonRequestManagedBot
from .keyboard_button_request_user import KeyboardButtonRequestUser
from .keyboard_button_request_users import KeyboardButtonRequestUsers
from .web_app_info import WebAppInfo
@ -31,6 +32,8 @@ class KeyboardButton(MutableTelegramObject):
"""*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: KeyboardButtonRequestChat | None = 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_managed_bot: KeyboardButtonRequestManagedBot | None = None
"""*Optional*. If specified, pressing the button will ask the user to create and share a bot that will be managed by the current bot. Available for bots that enabled management of other bots in the `@BotFather <https://t.me/BotFather>`_ Mini App. Available in private chats only."""
request_contact: bool | None = 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: bool | None = None
@ -59,6 +62,7 @@ class KeyboardButton(MutableTelegramObject):
style: str | None = None,
request_users: KeyboardButtonRequestUsers | None = None,
request_chat: KeyboardButtonRequestChat | None = None,
request_managed_bot: KeyboardButtonRequestManagedBot | None = None,
request_contact: bool | None = None,
request_location: bool | None = None,
request_poll: KeyboardButtonPollType | None = None,
@ -76,6 +80,7 @@ class KeyboardButton(MutableTelegramObject):
style=style,
request_users=request_users,
request_chat=request_chat,
request_managed_bot=request_managed_bot,
request_contact=request_contact,
request_location=request_location,
request_poll=request_poll,

View file

@ -0,0 +1,41 @@
from typing import TYPE_CHECKING, Any
from .base import TelegramObject
class KeyboardButtonRequestManagedBot(TelegramObject):
"""
This object defines the parameters for the creation of a managed bot. Information about the created bot will be shared with the bot using the update *managed_bot* and a :class:`aiogram.types.message.Message` with the field *managed_bot_created*.
Source: https://core.telegram.org/bots/api#keyboardbuttonrequestmanagedbot
"""
request_id: int
"""Signed 32-bit identifier of the request. Must be unique within the message"""
suggested_name: str | None = None
"""*Optional*. Suggested name for the bot"""
suggested_username: str | None = None
"""*Optional*. Suggested username for the bot"""
if TYPE_CHECKING:
# DO NOT EDIT MANUALLY!!!
# This section was auto-generated via `butcher`
def __init__(
__pydantic__self__,
*,
request_id: int,
suggested_name: str | None = None,
suggested_username: str | None = 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,
suggested_name=suggested_name,
suggested_username=suggested_username,
**__pydantic_kwargs,
)

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