From 974484dd5b61b643cc54a8e3c35ba0293c7a8a6e Mon Sep 17 00:00:00 2001 From: shoucandanghehe Date: Thu, 4 Jun 2026 21:43:51 +0800 Subject: [PATCH 1/6] :bug: fix Telegram polling timeout --- .github/workflows/codecov.yml | 2 +- nonebot/adapters/telegram/adapter.py | 31 +++- pdm.lock | 248 +++++++++++++++------------ pyproject.toml | 10 +- tests/test_bot.py | 39 ++++- 5 files changed, 206 insertions(+), 124 deletions(-) diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index 0681632..9e54ec6 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -18,7 +18,7 @@ jobs: cancel-in-progress: true strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] os: [ubuntu-latest, windows-latest, macos-latest] fail-fast: false env: diff --git a/nonebot/adapters/telegram/adapter.py b/nonebot/adapters/telegram/adapter.py index bdf9373..5ee3875 100644 --- a/nonebot/adapters/telegram/adapter.py +++ b/nonebot/adapters/telegram/adapter.py @@ -1,14 +1,22 @@ import json import asyncio +from typing import Any, cast from collections.abc import Iterable from typing_extensions import override -from typing import Any, Union, Optional, cast import anyio from pydantic.main import BaseModel from pydantic.json import pydantic_encoder -from nonebot.utils import escape_tag, logger_wrapper -from nonebot.drivers import URL, Driver, Request, Response, HTTPServerSetup +from nonebot.utils import UNSET, escape_tag, logger_wrapper +from nonebot.drivers import ( + URL, + DEFAULT_TIMEOUT, + Driver, + Request, + Timeout, + Response, + HTTPServerSetup, +) from nonebot.adapters import Adapter as BaseAdapter @@ -152,12 +160,24 @@ async def _call_api(self, bot: Bot, api: str, **data) -> Any: s.capitalize() for s in api.split("_")[1:] ) data = _escape_none(data) + request_timeout = UNSET + if api == "getUpdates": + timeout = data.get("timeout") + if not isinstance(timeout, bool) and isinstance(timeout, int | float): + # Telegram timeout is server-side long polling; the HTTP read + # timeout must be slightly longer. + request_timeout = Timeout( + total=DEFAULT_TIMEOUT.total, + connect=DEFAULT_TIMEOUT.connect, + read=float(timeout) + 5, + close=DEFAULT_TIMEOUT.close, + ) # 分离文件到 files files: dict[str, tuple[str, bytes]] = {} bytes_upload_count = 0 - async def process_input_file(file: Union[InputFile, str]) -> Optional[str]: + async def process_input_file(file: InputFile | str) -> str | None: """处理传过来的文件,如果文件被添加到 files 列表则返回文件名""" nonlocal bytes_upload_count filename = None @@ -206,7 +226,7 @@ async def process_input_file(file: Union[InputFile, str]) -> Optional[str]: ): type = api[4:].lower() for key in (type, "thumbnail"): - value = cast(Optional[Union[str, bytes]], data.pop(key, None)) + value = cast(str | bytes | None, data.pop(key, None)) if value: filename = await process_input_file(value) data[key] = f"attach://{filename}" if filename else value @@ -233,6 +253,7 @@ async def process_input_file(file: Union[InputFile, str]) -> Optional[str]: data=data if files else None, json=data if not files else None, files=files, # type: ignore + timeout=request_timeout, proxy=self.adapter_config.proxy, ) try: diff --git a/pdm.lock b/pdm.lock index ad96248..a1a03fe 100644 --- a/pdm.lock +++ b/pdm.lock @@ -2,13 +2,13 @@ # It is not intended for manual editing. [metadata] -groups = ["default", "codegen", "nonebot", "pre-commit", "tests"] +groups = ["default", "nonebot", "pre-commit", "tests"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:54a49272bc302c2faaa5ade455316815c36626ed5a0c69144ce346a82640da51" +content_hash = "sha256:49bd688abbdd78842c3268e14f6837aba0addd6f88a3c1cf7b4e9beebf56188d" [[metadata.targets]] -requires_python = "~=3.9" +requires_python = "~=3.10" [[package]] name = "aiohappyeyeballs" @@ -861,21 +861,21 @@ files = [ [[package]] name = "nonebot2" -version = "2.4.0" -requires_python = "<4.0,>=3.9" +version = "2.5.0" +requires_python = ">=3.10, <4.0" git = "https://github.com/nonebot/nonebot2.git" -revision = "efae3c8756f32698159a4040dba7ac2884dfce1e" +revision = "f27f5f179f15744cbcb3e1a08b251b3f28f695f1" summary = "An asynchronous python bot framework." groups = ["default", "nonebot", "tests"] dependencies = [ "anyio<5.0.0,>=4.4.0", "exceptiongroup<2.0.0,>=1.2.2", "loguru<1.0.0,>=0.6.0", - "pydantic!=2.10.0,!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0", + "pydantic!=2.10.0,!=2.10.1,!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0", "pygtrie<3.0.0,>=2.4.1", "python-dotenv<2.0.0,>=0.21.0", "tomli<3.0.0,>=2.0.1; python_version < \"3.11\"", - "typing-extensions<5.0.0,>=4.4.0", + "typing-extensions<5.0.0,>=4.6.0", "yarl<2.0.0,>=1.7.2", ] @@ -1094,117 +1094,129 @@ files = [ [[package]] name = "pydantic" -version = "2.10.1" -requires_python = ">=3.8" +version = "2.13.4" +requires_python = ">=3.9" summary = "Data validation using Python type hints" groups = ["default", "nonebot", "tests"] dependencies = [ "annotated-types>=0.6.0", - "pydantic-core==2.27.1", - "typing-extensions>=4.12.2", + "pydantic-core==2.46.4", + "typing-extensions>=4.14.1", + "typing-inspection>=0.4.2", ] files = [ - {file = "pydantic-2.10.1-py3-none-any.whl", hash = "sha256:a8d20db84de64cf4a7d59e899c2caf0fe9d660c7cfc482528e7020d7dd189a7e"}, - {file = "pydantic-2.10.1.tar.gz", hash = "sha256:a4daca2dc0aa429555e0656d6bf94873a7dc5f54ee42b1f5873d666fb3f35560"}, + {file = "pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba"}, + {file = "pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6"}, ] [[package]] name = "pydantic-core" -version = "2.27.1" -requires_python = ">=3.8" +version = "2.46.4" +requires_python = ">=3.9" summary = "Core functionality for Pydantic validation and serialization" groups = ["default", "nonebot", "tests"] dependencies = [ - "typing-extensions!=4.7.0,>=4.6.0", -] -files = [ - {file = "pydantic_core-2.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:71a5e35c75c021aaf400ac048dacc855f000bdfed91614b4a726f7432f1f3d6a"}, - {file = "pydantic_core-2.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f82d068a2d6ecfc6e054726080af69a6764a10015467d7d7b9f66d6ed5afa23b"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:121ceb0e822f79163dd4699e4c54f5ad38b157084d97b34de8b232bcaad70278"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4603137322c18eaf2e06a4495f426aa8d8388940f3c457e7548145011bb68e05"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a33cd6ad9017bbeaa9ed78a2e0752c5e250eafb9534f308e7a5f7849b0b1bfb4"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15cc53a3179ba0fcefe1e3ae50beb2784dede4003ad2dfd24f81bba4b23a454f"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45d9c5eb9273aa50999ad6adc6be5e0ecea7e09dbd0d31bd0c65a55a2592ca08"}, - {file = "pydantic_core-2.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bf7b66ce12a2ac52d16f776b31d16d91033150266eb796967a7e4621707e4f6"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:655d7dd86f26cb15ce8a431036f66ce0318648f8853d709b4167786ec2fa4807"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:5556470f1a2157031e676f776c2bc20acd34c1990ca5f7e56f1ebf938b9ab57c"}, - {file = "pydantic_core-2.27.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f69ed81ab24d5a3bd93861c8c4436f54afdf8e8cc421562b0c7504cf3be58206"}, - {file = "pydantic_core-2.27.1-cp310-none-win32.whl", hash = "sha256:f5a823165e6d04ccea61a9f0576f345f8ce40ed533013580e087bd4d7442b52c"}, - {file = "pydantic_core-2.27.1-cp310-none-win_amd64.whl", hash = "sha256:57866a76e0b3823e0b56692d1a0bf722bffb324839bb5b7226a7dbd6c9a40b17"}, - {file = "pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8"}, - {file = "pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025"}, - {file = "pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c"}, - {file = "pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc"}, - {file = "pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9"}, - {file = "pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5"}, - {file = "pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89"}, - {file = "pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f"}, - {file = "pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35"}, - {file = "pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb"}, - {file = "pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae"}, - {file = "pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c"}, - {file = "pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16"}, - {file = "pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e"}, - {file = "pydantic_core-2.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f216dbce0e60e4d03e0c4353c7023b202d95cbaeff12e5fd2e82ea0a66905073"}, - {file = "pydantic_core-2.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a2e02889071850bbfd36b56fd6bc98945e23670773bc7a76657e90e6b6603c08"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b0e23f119b2b456d07ca91b307ae167cc3f6c846a7b169fca5326e32fdc6cf"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:764be71193f87d460a03f1f7385a82e226639732214b402f9aa61f0d025f0737"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c00666a3bd2f84920a4e94434f5974d7bbc57e461318d6bb34ce9cdbbc1f6b2"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ccaa88b24eebc0f849ce0a4d09e8a408ec5a94afff395eb69baf868f5183107"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c65af9088ac534313e1963443d0ec360bb2b9cba6c2909478d22c2e363d98a51"}, - {file = "pydantic_core-2.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206b5cf6f0c513baffaeae7bd817717140770c74528f3e4c3e1cec7871ddd61a"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:062f60e512fc7fff8b8a9d680ff0ddaaef0193dba9fa83e679c0c5f5fbd018bc"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:a0697803ed7d4af5e4c1adf1670af078f8fcab7a86350e969f454daf598c4960"}, - {file = "pydantic_core-2.27.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:58ca98a950171f3151c603aeea9303ef6c235f692fe555e883591103da709b23"}, - {file = "pydantic_core-2.27.1-cp313-none-win32.whl", hash = "sha256:8065914ff79f7eab1599bd80406681f0ad08f8e47c880f17b416c9f8f7a26d05"}, - {file = "pydantic_core-2.27.1-cp313-none-win_amd64.whl", hash = "sha256:ba630d5e3db74c79300d9a5bdaaf6200172b107f263c98a0539eeecb857b2337"}, - {file = "pydantic_core-2.27.1-cp313-none-win_arm64.whl", hash = "sha256:45cf8588c066860b623cd11c4ba687f8d7175d5f7ef65f7129df8a394c502de5"}, - {file = "pydantic_core-2.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e9386266798d64eeb19dd3677051f5705bf873e98e15897ddb7d76f477131967"}, - {file = "pydantic_core-2.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4228b5b646caa73f119b1ae756216b59cc6e2267201c27d3912b592c5e323b60"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b3dfe500de26c52abe0477dde16192ac39c98f05bf2d80e76102d394bd13854"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aee66be87825cdf72ac64cb03ad4c15ffef4143dbf5c113f64a5ff4f81477bf9"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b748c44bb9f53031c8cbc99a8a061bc181c1000c60a30f55393b6e9c45cc5bd"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ca038c7f6a0afd0b2448941b6ef9d5e1949e999f9e5517692eb6da58e9d44be"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bd57539da59a3e4671b90a502da9a28c72322a4f17866ba3ac63a82c4498e"}, - {file = "pydantic_core-2.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ac6c2c45c847bbf8f91930d88716a0fb924b51e0c6dad329b793d670ec5db792"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b94d4ba43739bbe8b0ce4262bcc3b7b9f31459ad120fb595627eaeb7f9b9ca01"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:00e6424f4b26fe82d44577b4c842d7df97c20be6439e8e685d0d715feceb9fb9"}, - {file = "pydantic_core-2.27.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:38de0a70160dd97540335b7ad3a74571b24f1dc3ed33f815f0880682e6880131"}, - {file = "pydantic_core-2.27.1-cp39-none-win32.whl", hash = "sha256:7ccebf51efc61634f6c2344da73e366c75e735960b5654b63d7e6f69a5885fa3"}, - {file = "pydantic_core-2.27.1-cp39-none-win_amd64.whl", hash = "sha256:a57847b090d7892f123726202b7daa20df6694cbd583b67a592e856bff603d6c"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3fa80ac2bd5856580e242dbc202db873c60a01b20309c8319b5c5986fbe53ce6"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d950caa237bb1954f1b8c9227b5065ba6875ac9771bb8ec790d956a699b78676"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e4216e64d203e39c62df627aa882f02a2438d18a5f21d7f721621f7a5d3611d"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a3d637bd387c41d46b002f0e49c52642281edacd2740e5a42f7017feea3f2c"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:161c27ccce13b6b0c8689418da3885d3220ed2eae2ea5e9b2f7f3d48f1d52c27"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:19910754e4cc9c63bc1c7f6d73aa1cfee82f42007e407c0f413695c2f7ed777f"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:e173486019cc283dc9778315fa29a363579372fe67045e971e89b6365cc035ed"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:af52d26579b308921b73b956153066481f064875140ccd1dfd4e77db89dbb12f"}, - {file = "pydantic_core-2.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:981fb88516bd1ae8b0cbbd2034678a39dedc98752f264ac9bc5839d3923fa04c"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5fde892e6c697ce3e30c61b239330fc5d569a71fefd4eb6512fc6caec9dd9e2f"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:816f5aa087094099fff7edabb5e01cc370eb21aa1a1d44fe2d2aefdfb5599b31"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c10c309e18e443ddb108f0ef64e8729363adbfd92d6d57beec680f6261556f3"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98476c98b02c8e9b2eec76ac4156fd006628b1b2d0ef27e548ffa978393fd154"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3027001c28434e7ca5a6e1e527487051136aa81803ac812be51802150d880dd"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7699b1df36a48169cdebda7ab5a2bac265204003f153b4bd17276153d997670a"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1c39b07d90be6b48968ddc8c19e7585052088fd7ec8d568bb31ff64c70ae3c97"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:46ccfe3032b3915586e469d4972973f893c0a2bb65669194a5bdea9bacc088c2"}, - {file = "pydantic_core-2.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:62ba45e21cf6571d7f716d903b5b7b6d2617e2d5d67c0923dc47b9d41369f840"}, - {file = "pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235"}, + "typing-extensions>=4.14.1", +] +files = [ + {file = "pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4"}, + {file = "pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63e0198ca18aad131c089b9204c23079c3afa95487e561f4c522d519e55aba"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f47286a97f0bc9b8859519809077b91b2cefe4ae47fcbf5e466a009c1c5d742b"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905a0ed8ea6f2d61c1738835f99b699348d7857379083e5fc497fa0c967a407c"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea793e075b70290d89d8142074262885d3f7da19634845135751bd6344f73b50"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395aebd9183f9d112f569aeb5b2214d1a10a33bec8456447f7fbdfa51d38d4cd"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b078afbc25f3a1436c7a1d2cd3e322497ee99615ba97c563566fdf46aff1ee01"}, + {file = "pydantic_core-2.46.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f747929cf940cddb5b3668a390056ddd5ba2e5010615ea2dcf4f9c4f3ab8791d"}, + {file = "pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:daa27d92c36f24388fe3ad306b174781c747627f134452e4f128ea00ce1fe8c4"}, + {file = "pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:19e51f073cd3df251856a8a4189fbdf1de4012c3ebacfb1884f94f1eb406079f"}, + {file = "pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1747f85cee84c26985853c6f3d9bd3e75da5212912443fa111c113b9c246f39"}, + {file = "pydantic_core-2.46.4-cp310-cp310-win32.whl", hash = "sha256:2f84c03c8607173d16b5a854ec68a2f9079ae03237a54fb506d13af47e1d018d"}, + {file = "pydantic_core-2.46.4-cp310-cp310-win_amd64.whl", hash = "sha256:8358a950c8909158e3df31538a7e4edc2d7265a7c54b47f0864d9e5bae9dcebf"}, + {file = "pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594"}, + {file = "pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398"}, + {file = "pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3"}, + {file = "pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848"}, + {file = "pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3"}, + {file = "pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109"}, + {file = "pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda"}, + {file = "pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33"}, + {file = "pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d"}, + {file = "pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2"}, + {file = "pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987"}, + {file = "pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b"}, + {file = "pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458"}, + {file = "pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b"}, + {file = "pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c"}, + {file = "pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894"}, + {file = "pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89"}, + {file = "pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a"}, + {file = "pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008"}, + {file = "pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262"}, + {file = "pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e"}, + {file = "pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd"}, + {file = "pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be"}, + {file = "pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d"}, + {file = "pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb"}, + {file = "pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292"}, + {file = "pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d"}, + {file = "pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb"}, + {file = "pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c"}, + {file = "pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb"}, + {file = "pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898"}, + {file = "pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e"}, + {file = "pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519"}, + {file = "pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4"}, + {file = "pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac"}, + {file = "pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5"}, + {file = "pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc"}, + {file = "pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983"}, + {file = "pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1"}, ] [[package]] @@ -1416,13 +1428,27 @@ files = [ [[package]] name = "typing-extensions" -version = "4.12.2" -requires_python = ">=3.8" -summary = "Backported and Experimental Type Hints for Python 3.8+" +version = "4.15.0" +requires_python = ">=3.9" +summary = "Backported and Experimental Type Hints for Python 3.9+" groups = ["default", "nonebot", "pre-commit", "tests"] files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +requires_python = ">=3.9" +summary = "Runtime typing introspection tools" +groups = ["default", "nonebot", "tests"] +dependencies = [ + "typing-extensions>=4.12.0", +] +files = [ + {file = "typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7"}, + {file = "typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 39c4a40..d658162 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,11 +4,11 @@ version = "0.1.0b20" description = "Telegram Adapter for NoneBot2" authors = [{ name = "Jigsaw", email = "j1g5aw@foxmail.com" }] dependencies = [ - "nonebot2<3.0.0,>=2.1.3", + "nonebot2<3.0.0,>=2.5.0", "anyio<5.0.0,>=4.2.0", "pydantic >=2.0.3,<3.0.0,!=2.5.0,!=2.5.1", ] -requires-python = ">=3.9,<4.0" +requires-python = ">=3.10,<4.0" readme = "README.md" license = { text = "MIT" } keywords = ["bot", "telegram"] @@ -45,7 +45,7 @@ tests = [ [tool.black] line-length = 88 -target-version = ["py39", "py310", "py311", "py312"] +target-version = ["py310", "py311", "py312"] include = '\.pyi?$' extend-exclude = ''' ''' @@ -61,7 +61,7 @@ extra_standard_library = ["typing_extensions"] [tool.ruff] line-length = 88 -target-version = "py39" +target-version = "py310" [tool.ruff.lint] select = [ @@ -96,7 +96,7 @@ addopts = "--cov nonebot/adapters/telegram --cov-report term-missing" [tool.pyright] reportShadowedImports = false -pythonVersion = "3.9" +pythonVersion = "3.10" pythonPlatform = "All" typeCheckingMode = "basic" ignore = ["./example", "./tests"] diff --git a/tests/test_bot.py b/tests/test_bot.py index c6e8e4c..0270389 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -1,3 +1,6 @@ +import json +from pathlib import Path + import pytest from nonebug import App @@ -8,8 +11,40 @@ bot_config = BotConfig(token="1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI") -import json -from pathlib import Path +@pytest.mark.asyncio +async def test_get_updates_sets_driver_read_timeout(app: App): + from nonebot.drivers import DEFAULT_TIMEOUT, Timeout, Response + + import nonebot + from nonebot.adapters.telegram.bot import Bot + + captured_request = None + + async def request(setup): + nonlocal captured_request + captured_request = setup + return Response( + 200, + content=b'{"ok": true, "result": []}', + request=setup, + ) + + adapter = Adapter(nonebot.get_driver()) + adapter.request = request # type: ignore[method-assign] + bot = Bot( + adapter, + Bot.get_bot_id_by_token(bot_config.token), + config=bot_config, + ) + + await bot.get_updates(timeout=30) + + assert captured_request is not None + timeout = captured_request.timeout + assert isinstance(timeout, Timeout) + assert timeout.read == 35.0 + assert timeout.connect == DEFAULT_TIMEOUT.connect + assert timeout.total == DEFAULT_TIMEOUT.total @pytest.mark.asyncio From 840c0882d2fbd9224eba1dbe105982995063d784 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 13:45:52 +0000 Subject: [PATCH 2/6] :rotating_light: auto fix by pre-commit hooks --- nonebot/adapters/telegram/api.py | 1224 +++++++++++----------- nonebot/adapters/telegram/bot.py | 28 +- nonebot/adapters/telegram/config.py | 6 +- nonebot/adapters/telegram/event.py | 62 +- nonebot/adapters/telegram/exception.py | 6 +- nonebot/adapters/telegram/message.py | 70 +- nonebot/adapters/telegram/model.py | 1318 ++++++++++++------------ 7 files changed, 1336 insertions(+), 1378 deletions(-) diff --git a/nonebot/adapters/telegram/api.py b/nonebot/adapters/telegram/api.py index 263b3e8..fe598ee 100644 --- a/nonebot/adapters/telegram/api.py +++ b/nonebot/adapters/telegram/api.py @@ -1,4 +1,4 @@ -from typing import Union, Literal, Optional +from typing import Literal from .model import ( File, @@ -57,25 +57,25 @@ class API: async def get_updates( self, - offset: Optional[int] = None, - limit: Optional[int] = None, - timeout: Optional[int] = None, - allowed_updates: Optional[list[str]] = None, + offset: int | None = None, + limit: int | None = None, + timeout: int | None = None, + allowed_updates: list[str] | None = None, ) -> list[Update]: ... async def set_webhook( self, url: str, - certificate: Optional[InputFile] = None, - ip_address: Optional[str] = None, - max_connections: Optional[int] = None, - allowed_updates: Optional[list[str]] = None, - drop_pending_updates: Optional[bool] = None, - secret_token: Optional[str] = None, + certificate: InputFile | None = None, + ip_address: str | None = None, + max_connections: int | None = None, + allowed_updates: list[str] | None = None, + drop_pending_updates: bool | None = None, + secret_token: str | None = None, ) -> Literal[True]: ... async def delete_webhook( - self, drop_pending_updates: Optional[bool] = None + self, drop_pending_updates: bool | None = None ) -> Literal[True]: ... async def get_webhook_info(self) -> WebhookInfo: ... @@ -95,450 +95,433 @@ async def close(self) -> Literal[True]: ... async def send_message( self, - chat_id: Union[int, str], + chat_id: int | str, text: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, - entities: Optional[list[MessageEntity]] = None, - link_preview_options: Optional[LinkPreviewOptions] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, + entities: list[MessageEntity] | None = None, + link_preview_options: LinkPreviewOptions | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def forward_message( self, - chat_id: Union[int, str], - from_chat_id: Union[int, str], + chat_id: int | str, + from_chat_id: int | str, message_id: int, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, + message_thread_id: int | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, ) -> Message: ... async def forward_messages( self, - chat_id: Union[int, str], - from_chat_id: Union[int, str], + chat_id: int | str, + from_chat_id: int | str, message_ids: list[int], - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, + message_thread_id: int | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, ) -> list[MessageId]: ... async def copy_message( self, - chat_id: Union[int, str], - from_chat_id: Union[int, str], + chat_id: int | str, + from_chat_id: int | str, message_id: int, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, - caption_entities: Optional[list[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + message_thread_id: int | None = None, + caption: str | None = None, + parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, + caption_entities: list[MessageEntity] | None = None, + show_caption_above_media: bool | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> MessageId: ... async def copy_messages( self, - chat_id: Union[int, str], - from_chat_id: Union[int, str], + chat_id: int | str, + from_chat_id: int | str, message_ids: list[int], - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - remove_caption: Optional[bool] = None, + message_thread_id: int | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + remove_caption: bool | None = None, ) -> list[MessageId]: ... async def send_photo( self, - chat_id: Union[int, str], - photo: Union[str, InputFile], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, - caption_entities: Optional[list[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + chat_id: int | str, + photo: str | InputFile, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + caption: str | None = None, + parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, + caption_entities: list[MessageEntity] | None = None, + show_caption_above_media: bool | None = None, + has_spoiler: bool | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def send_audio( self, - chat_id: Union[int, str], - audio: Union[str, InputFile], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, - caption_entities: Optional[list[MessageEntity]] = None, - duration: Optional[int] = None, - performer: Optional[str] = None, - title: Optional[str] = None, - thumbnail: Optional[Union[str, InputFile]] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + chat_id: int | str, + audio: str | InputFile, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + caption: str | None = None, + parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, + caption_entities: list[MessageEntity] | None = None, + duration: int | None = None, + performer: str | None = None, + title: str | None = None, + thumbnail: str | InputFile | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def send_document( self, - chat_id: Union[int, str], - document: Union[str, InputFile], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - thumbnail: Optional[Union[str, InputFile]] = None, - caption: Optional[str] = None, - parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, - caption_entities: Optional[list[MessageEntity]] = None, - disable_content_type_detection: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + chat_id: int | str, + document: str | InputFile, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + thumbnail: str | InputFile | None = None, + caption: str | None = None, + parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, + caption_entities: list[MessageEntity] | None = None, + disable_content_type_detection: bool | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def send_video( self, - chat_id: Union[int, str], - video: Union[str, InputFile], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[Union[str, InputFile]] = None, - caption: Optional[str] = None, - parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, - caption_entities: Optional[list[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - has_spoiler: Optional[bool] = None, - supports_streaming: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + chat_id: int | str, + video: str | InputFile, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + duration: int | None = None, + width: int | None = None, + height: int | None = None, + thumbnail: str | InputFile | None = None, + caption: str | None = None, + parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, + caption_entities: list[MessageEntity] | None = None, + show_caption_above_media: bool | None = None, + has_spoiler: bool | None = None, + supports_streaming: bool | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def send_animation( self, - chat_id: Union[int, str], - animation: Union[str, InputFile], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - width: Optional[int] = None, - height: Optional[int] = None, - thumbnail: Optional[Union[str, InputFile]] = None, - caption: Optional[str] = None, - parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, - caption_entities: Optional[list[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - has_spoiler: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + chat_id: int | str, + animation: str | InputFile, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + duration: int | None = None, + width: int | None = None, + height: int | None = None, + thumbnail: str | InputFile | None = None, + caption: str | None = None, + parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, + caption_entities: list[MessageEntity] | None = None, + show_caption_above_media: bool | None = None, + has_spoiler: bool | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def send_voice( self, - chat_id: Union[int, str], - voice: Union[str, InputFile], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - caption: Optional[str] = None, - parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, - caption_entities: Optional[list[MessageEntity]] = None, - duration: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + chat_id: int | str, + voice: str | InputFile, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + caption: str | None = None, + parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, + caption_entities: list[MessageEntity] | None = None, + duration: int | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def send_video_note( self, - chat_id: Union[int, str], - video_note: Union[str, InputFile], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - duration: Optional[int] = None, - length: Optional[int] = None, - thumbnail: Optional[Union[str, InputFile]] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + chat_id: int | str, + video_note: str | InputFile, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + duration: int | None = None, + length: int | None = None, + thumbnail: str | InputFile | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def send_paid_media( self, - chat_id: Union[int, str], + chat_id: int | str, star_count: int, media: list[InputPaidMedia], - business_connection_id: Optional[str] = None, - payload: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[str] = None, - caption_entities: Optional[list[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + business_connection_id: str | None = None, + payload: str | None = None, + caption: str | None = None, + parse_mode: str | None = None, + caption_entities: list[MessageEntity] | None = None, + show_caption_above_media: bool | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def send_media_group( self, - chat_id: Union[int, str], + chat_id: int | str, media: list[ - Union[InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo] + InputMediaAudio | InputMediaDocument | InputMediaPhoto | InputMediaVideo ], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, ) -> list[Message]: ... async def send_location( self, - chat_id: Union[int, str], + chat_id: int | str, latitude: float, longitude: float, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - horizontal_accuracy: Optional[float] = None, - live_period: Optional[int] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + horizontal_accuracy: float | None = None, + live_period: int | None = None, + heading: int | None = None, + proximity_alert_radius: int | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def send_venue( self, - chat_id: Union[int, str], + chat_id: int | str, latitude: float, longitude: float, title: str, address: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + foursquare_id: str | None = None, + foursquare_type: str | None = None, + google_place_id: str | None = None, + google_place_type: str | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def send_contact( self, - chat_id: Union[int, str], + chat_id: int | str, phone_number: str, first_name: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - last_name: Optional[str] = None, - vcard: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + last_name: str | None = None, + vcard: str | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def send_poll( self, - chat_id: Union[int, str], + chat_id: int | str, question: str, options: list[InputPollOption], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - question_parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, - question_entities: Optional[list[MessageEntity]] = None, - is_anonymous: Optional[bool] = None, - type: Optional[Literal["quiz", "regular"]] = None, - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[int] = None, - explanation: Optional[str] = None, - explanation_parse_mode: Optional[ - Literal["MarkdownV2", "Markdown", "HTML"] - ] = None, - explanation_entities: Optional[list[MessageEntity]] = None, - open_period: Optional[int] = None, - close_date: Optional[int] = None, - is_closed: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + question_parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, + question_entities: list[MessageEntity] | None = None, + is_anonymous: bool | None = None, + type: Literal["quiz", "regular"] | None = None, + allows_multiple_answers: bool | None = None, + correct_option_id: int | None = None, + explanation: str | None = None, + explanation_parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, + explanation_entities: list[MessageEntity] | None = None, + open_period: int | None = None, + close_date: int | None = None, + is_closed: bool | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def send_dice( self, - chat_id: Union[int, str], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - emoji: Optional[Literal["🎲", "🎯", "🏀", "⚽", "🎳", "🎰"]] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + chat_id: int | str, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + emoji: Literal["🎲", "🎯", "🏀", "⚽", "🎳", "🎰"] | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def send_chat_action( self, - chat_id: Union[int, str], + chat_id: int | str, action: Literal[ "typing", "upload_photo", @@ -552,255 +535,237 @@ async def send_chat_action( "record_video_note", "upload_video_note", ], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, + business_connection_id: str | None = None, + message_thread_id: int | None = None, ) -> Literal[True]: ... async def set_message_reaction( self, - chat_id: Union[int, str], + chat_id: int | str, message_id: int, - reaction: Optional[list[ReactionType]] = None, - is_big: Optional[bool] = None, + reaction: list[ReactionType] | None = None, + is_big: bool | None = None, ) -> Literal[True]: ... async def get_user_profile_photos( - self, user_id: int, offset: Optional[int] = None, limit: Optional[int] = None + self, user_id: int, offset: int | None = None, limit: int | None = None ) -> UserProfilePhotos: ... async def get_file(self, file_id: str) -> File: ... async def ban_chat_member( self, - chat_id: Union[int, str], + chat_id: int | str, user_id: int, - until_date: Optional[int] = None, - revoke_messages: Optional[bool] = None, + until_date: int | None = None, + revoke_messages: bool | None = None, ) -> Literal[True]: ... async def unban_chat_member( self, - chat_id: Union[int, str], + chat_id: int | str, user_id: int, - only_if_banned: Optional[bool] = None, + only_if_banned: bool | None = None, ) -> Literal[True]: ... async def restrict_chat_member( self, - chat_id: Union[int, str], + chat_id: int | str, user_id: int, permissions: ChatPermissions, - use_independent_chat_permissions: Optional[bool] = None, - until_date: Optional[int] = None, + use_independent_chat_permissions: bool | None = None, + until_date: int | None = None, ) -> Literal[True]: ... async def promote_chat_member( self, - chat_id: Union[int, str], + chat_id: int | str, user_id: int, - is_anonymous: Optional[bool] = None, - can_manage_chat: Optional[bool] = None, - can_delete_messages: Optional[bool] = None, - can_manage_video_chats: Optional[bool] = None, - can_restrict_members: Optional[bool] = None, - can_promote_members: Optional[bool] = None, - can_change_info: Optional[bool] = None, - can_invite_users: Optional[bool] = None, - can_post_stories: Optional[bool] = None, - can_edit_stories: Optional[bool] = None, - can_delete_stories: Optional[bool] = None, - can_post_messages: Optional[bool] = None, - can_edit_messages: Optional[bool] = None, - can_pin_messages: Optional[bool] = None, - can_manage_topics: Optional[bool] = None, + is_anonymous: bool | None = None, + can_manage_chat: bool | None = None, + can_delete_messages: bool | None = None, + can_manage_video_chats: bool | None = None, + can_restrict_members: bool | None = None, + can_promote_members: bool | None = None, + can_change_info: bool | None = None, + can_invite_users: bool | None = None, + can_post_stories: bool | None = None, + can_edit_stories: bool | None = None, + can_delete_stories: bool | None = None, + can_post_messages: bool | None = None, + can_edit_messages: bool | None = None, + can_pin_messages: bool | None = None, + can_manage_topics: bool | None = None, ) -> Literal[True]: ... async def set_chat_administrator_custom_title( - self, chat_id: Union[int, str], user_id: int, custom_title: str + self, chat_id: int | str, user_id: int, custom_title: str ) -> Literal[True]: ... async def ban_chat_sender_chat( - self, chat_id: Union[int, str], sender_chat_id: int + self, chat_id: int | str, sender_chat_id: int ) -> Literal[True]: ... async def unban_chat_sender_chat( - self, chat_id: Union[int, str], sender_chat_id: int + self, chat_id: int | str, sender_chat_id: int ) -> Literal[True]: ... async def set_chat_permissions( self, - chat_id: Union[int, str], + chat_id: int | str, permissions: ChatPermissions, - use_independent_chat_permissions: Optional[bool] = None, + use_independent_chat_permissions: bool | None = None, ) -> Literal[True]: ... - async def export_chat_invite_link(self, chat_id: Union[int, str]) -> str: ... + async def export_chat_invite_link(self, chat_id: int | str) -> str: ... async def create_chat_invite_link( self, - chat_id: Union[int, str], - name: Optional[str] = None, - expire_date: Optional[int] = None, - member_limit: Optional[int] = None, - creates_join_request: Optional[bool] = None, + chat_id: int | str, + name: str | None = None, + expire_date: int | None = None, + member_limit: int | None = None, + creates_join_request: bool | None = None, ) -> ChatInviteLink: ... async def edit_chat_invite_link( self, - chat_id: Union[int, str], + chat_id: int | str, invite_link: str, - name: Optional[str] = None, - expire_date: Optional[int] = None, - member_limit: Optional[int] = None, - creates_join_request: Optional[bool] = None, + name: str | None = None, + expire_date: int | None = None, + member_limit: int | None = None, + creates_join_request: bool | None = None, ) -> ChatInviteLink: ... async def create_chat_subscription_invite_link( self, - chat_id: Union[int, str], + chat_id: int | str, subscription_period: int, subscription_price: int, - name: Optional[str] = None, + name: str | None = None, ) -> ChatInviteLink: ... async def edit_chat_subscription_invite_link( - self, chat_id: Union[int, str], invite_link: str, name: Optional[str] = None + self, chat_id: int | str, invite_link: str, name: str | None = None ) -> ChatInviteLink: ... async def revoke_chat_invite_link( - self, chat_id: Union[int, str], invite_link: str + self, chat_id: int | str, invite_link: str ) -> ChatInviteLink: ... async def approve_chat_join_request( - self, chat_id: Union[int, str], user_id: int + self, chat_id: int | str, user_id: int ) -> Literal[True]: ... async def decline_chat_join_request( - self, chat_id: Union[int, str], user_id: int + self, chat_id: int | str, user_id: int ) -> Literal[True]: ... async def set_chat_photo( - self, chat_id: Union[int, str], photo: InputFile + self, chat_id: int | str, photo: InputFile ) -> Literal[True]: ... - async def delete_chat_photo(self, chat_id: Union[int, str]) -> Literal[True]: ... + async def delete_chat_photo(self, chat_id: int | str) -> Literal[True]: ... - async def set_chat_title( - self, chat_id: Union[int, str], title: str - ) -> Literal[True]: ... + async def set_chat_title(self, chat_id: int | str, title: str) -> Literal[True]: ... async def set_chat_description( - self, chat_id: Union[int, str], description: Optional[str] = None + self, chat_id: int | str, description: str | None = None ) -> Literal[True]: ... async def pin_chat_message( self, - chat_id: Union[int, str], + chat_id: int | str, message_id: int, - business_connection_id: Optional[str] = None, - disable_notification: Optional[bool] = None, + business_connection_id: str | None = None, + disable_notification: bool | None = None, ) -> Literal[True]: ... async def unpin_chat_message( self, - chat_id: Union[int, str], - business_connection_id: Optional[str] = None, - message_id: Optional[int] = None, + chat_id: int | str, + business_connection_id: str | None = None, + message_id: int | None = None, ) -> Literal[True]: ... - async def unpin_all_chat_messages( - self, chat_id: Union[int, str] - ) -> Literal[True]: ... + async def unpin_all_chat_messages(self, chat_id: int | str) -> Literal[True]: ... - async def leave_chat(self, chat_id: Union[int, str]) -> Literal[True]: ... + async def leave_chat(self, chat_id: int | str) -> Literal[True]: ... - async def get_chat(self, chat_id: Union[int, str]) -> ChatFullInfo: ... + async def get_chat(self, chat_id: int | str) -> ChatFullInfo: ... - async def get_chat_administrators( - self, chat_id: Union[int, str] - ) -> list[ChatMember]: ... + async def get_chat_administrators(self, chat_id: int | str) -> list[ChatMember]: ... - async def get_chat_member_count(self, chat_id: Union[int, str]) -> int: ... + async def get_chat_member_count(self, chat_id: int | str) -> int: ... - async def get_chat_member( - self, chat_id: Union[int, str], user_id: int - ) -> ChatMember: ... + async def get_chat_member(self, chat_id: int | str, user_id: int) -> ChatMember: ... async def set_chat_sticker_set( - self, chat_id: Union[int, str], sticker_set_name: str + self, chat_id: int | str, sticker_set_name: str ) -> Literal[True]: ... - async def delete_chat_sticker_set( - self, chat_id: Union[int, str] - ) -> Literal[True]: ... + async def delete_chat_sticker_set(self, chat_id: int | str) -> Literal[True]: ... async def get_forum_topic_icon_stickers(self) -> list[Sticker]: ... async def create_forum_topic( self, - chat_id: Union[int, str], + chat_id: int | str, name: str, - icon_color: Optional[int] = None, - icon_custom_emoji_id: Optional[str] = None, + icon_color: int | None = None, + icon_custom_emoji_id: str | None = None, ) -> ForumTopic: ... async def edit_forum_topic( self, - chat_id: Union[int, str], + chat_id: int | str, message_thread_id: int, - name: Optional[str] = None, - icon_custom_emoji_id: Optional[str] = None, + name: str | None = None, + icon_custom_emoji_id: str | None = None, ) -> Literal[True]: ... async def close_forum_topic( - self, chat_id: Union[int, str], message_thread_id: int + self, chat_id: int | str, message_thread_id: int ) -> Literal[True]: ... async def reopen_forum_topic( - self, chat_id: Union[int, str], message_thread_id: int + self, chat_id: int | str, message_thread_id: int ) -> Literal[True]: ... async def delete_forum_topic( - self, chat_id: Union[int, str], message_thread_id: int + self, chat_id: int | str, message_thread_id: int ) -> Literal[True]: ... async def unpin_all_forum_topic_messages( - self, chat_id: Union[int, str], message_thread_id: int + self, chat_id: int | str, message_thread_id: int ) -> Literal[True]: ... async def edit_general_forum_topic( - self, chat_id: Union[int, str], name: str + self, chat_id: int | str, name: str ) -> Literal[True]: ... - async def close_general_forum_topic( - self, chat_id: Union[int, str] - ) -> Literal[True]: ... + async def close_general_forum_topic(self, chat_id: int | str) -> Literal[True]: ... - async def reopen_general_forum_topic( - self, chat_id: Union[int, str] - ) -> Literal[True]: ... + async def reopen_general_forum_topic(self, chat_id: int | str) -> Literal[True]: ... - async def hide_general_forum_topic( - self, chat_id: Union[int, str] - ) -> Literal[True]: ... + async def hide_general_forum_topic(self, chat_id: int | str) -> Literal[True]: ... - async def unhide_general_forum_topic( - self, chat_id: Union[int, str] - ) -> Literal[True]: ... + async def unhide_general_forum_topic(self, chat_id: int | str) -> Literal[True]: ... async def unpin_all_general_forum_topic_messages( - self, chat_id: Union[int, str] + self, chat_id: int | str ) -> Literal[True]: ... async def answer_callback_query( self, callback_query_id: str, - text: Optional[str] = None, - show_alert: Optional[bool] = None, - url: Optional[str] = None, - cache_time: Optional[int] = None, + text: str | None = None, + show_alert: bool | None = None, + url: str | None = None, + cache_time: int | None = None, ) -> Literal[True]: ... async def get_user_chat_boosts( - self, chat_id: Union[int, str], user_id: int + self, chat_id: int | str, user_id: int ) -> UserChatBoosts: ... async def get_business_connection( self, business_connection_id: str @@ -809,169 +774,166 @@ async def get_business_connection( async def set_my_commands( self, commands: list[BotCommand], - scope: Optional[BotCommandScope] = None, - language_code: Optional[str] = None, + scope: BotCommandScope | None = None, + language_code: str | None = None, ) -> Literal[True]: ... async def delete_my_commands( self, - scope: Optional[BotCommandScope] = None, - language_code: Optional[str] = None, + scope: BotCommandScope | None = None, + language_code: str | None = None, ) -> Literal[True]: ... async def get_my_commands( self, - scope: Optional[BotCommandScope] = None, - language_code: Optional[str] = None, + scope: BotCommandScope | None = None, + language_code: str | None = None, ) -> list[BotCommand]: ... async def set_my_name( - self, name: Optional[str] = None, language_code: Optional[str] = None + self, name: str | None = None, language_code: str | None = None ) -> Literal[True]: ... - async def get_my_name(self, language_code: Optional[str] = None) -> BotName: ... + async def get_my_name(self, language_code: str | None = None) -> BotName: ... async def set_my_description( - self, description: Optional[str] = None, language_code: Optional[str] = None + self, description: str | None = None, language_code: str | None = None ) -> Literal[True]: ... async def get_my_description( - self, language_code: Optional[str] = None + self, language_code: str | None = None ) -> BotDescription: ... async def set_my_short_description( self, - short_description: Optional[str] = None, - language_code: Optional[str] = None, + short_description: str | None = None, + language_code: str | None = None, ) -> Literal[True]: ... async def get_my_short_description( - self, language_code: Optional[str] = None + self, language_code: str | None = None ) -> BotShortDescription: ... async def set_chat_menu_button( - self, chat_id: Optional[int] = None, menu_button: Optional[MenuButton] = None + self, chat_id: int | None = None, menu_button: MenuButton | None = None ) -> Literal[True]: ... - async def get_chat_menu_button( - self, chat_id: Optional[int] = None - ) -> MenuButton: ... + async def get_chat_menu_button(self, chat_id: int | None = None) -> MenuButton: ... async def set_my_default_administrator_rights( self, - rights: Optional[ChatAdministratorRights] = None, - for_channels: Optional[bool] = None, + rights: ChatAdministratorRights | None = None, + for_channels: bool | None = None, ) -> Literal[True]: ... async def get_my_default_administrator_rights( - self, for_channels: Optional[bool] = None + self, for_channels: bool | None = None ) -> ChatAdministratorRights: ... async def edit_message_text( self, text: str, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, - entities: Optional[list[MessageEntity]] = None, - link_preview_options: Optional[LinkPreviewOptions] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - ) -> Union[Message, Literal[True]]: ... + business_connection_id: str | None = None, + chat_id: int | str | None = None, + message_id: int | None = None, + inline_message_id: str | None = None, + parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, + entities: list[MessageEntity] | None = None, + link_preview_options: LinkPreviewOptions | None = None, + reply_markup: InlineKeyboardMarkup | None = None, + ) -> Message | Literal[True]: ... async def edit_message_caption( self, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - caption: Optional[str] = None, - parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, - caption_entities: Optional[list[MessageEntity]] = None, - show_caption_above_media: Optional[bool] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - ) -> Union[Message, Literal[True]]: ... + business_connection_id: str | None = None, + chat_id: int | str | None = None, + message_id: int | None = None, + inline_message_id: str | None = None, + caption: str | None = None, + parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, + caption_entities: list[MessageEntity] | None = None, + show_caption_above_media: bool | None = None, + reply_markup: InlineKeyboardMarkup | None = None, + ) -> Message | Literal[True]: ... async def edit_message_media( self, media: InputMedia, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - ) -> Union[Message, Literal[True]]: ... + business_connection_id: str | None = None, + chat_id: int | str | None = None, + message_id: int | None = None, + inline_message_id: str | None = None, + reply_markup: InlineKeyboardMarkup | None = None, + ) -> Message | Literal[True]: ... async def edit_message_live_location( self, latitude: float, longitude: float, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - live_period: Optional[int] = None, - horizontal_accuracy: Optional[float] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - ) -> Union[Message, Literal[True]]: ... + business_connection_id: str | None = None, + chat_id: int | str | None = None, + message_id: int | None = None, + inline_message_id: str | None = None, + live_period: int | None = None, + horizontal_accuracy: float | None = None, + heading: int | None = None, + proximity_alert_radius: int | None = None, + reply_markup: InlineKeyboardMarkup | None = None, + ) -> Message | Literal[True]: ... async def stop_message_live_location( self, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - ) -> Union[Message, Literal[True]]: ... + business_connection_id: str | None = None, + chat_id: int | str | None = None, + message_id: int | None = None, + inline_message_id: str | None = None, + reply_markup: InlineKeyboardMarkup | None = None, + ) -> Message | Literal[True]: ... async def edit_message_reply_markup( self, - business_connection_id: Optional[str] = None, - chat_id: Optional[Union[int, str]] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, - ) -> Union[Message, Literal[True]]: ... + business_connection_id: str | None = None, + chat_id: int | str | None = None, + message_id: int | None = None, + inline_message_id: str | None = None, + reply_markup: InlineKeyboardMarkup | None = None, + ) -> Message | Literal[True]: ... async def stop_poll( self, - chat_id: Union[int, str], + chat_id: int | str, message_id: int, - business_connection_id: Optional[str] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, + business_connection_id: str | None = None, + reply_markup: InlineKeyboardMarkup | None = None, ) -> Poll: ... async def delete_message( - self, chat_id: Union[int, str], message_id: int + self, chat_id: int | str, message_id: int ) -> Literal[True]: ... async def delete_messages( - self, chat_id: Union[int, str], message_ids: list[int] + self, chat_id: int | str, message_ids: list[int] ) -> Literal[True]: ... async def send_sticker( self, - chat_id: Union[int, str], - sticker: Union[str, InputFile], - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - emoji: Optional[str] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[ - Union[ - InlineKeyboardMarkup, - ReplyKeyboardMarkup, - ReplyKeyboardRemove, - ForceReply, - ] - ] = None, + chat_id: int | str, + sticker: str | InputFile, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + emoji: str | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: ( + InlineKeyboardMarkup + | ReplyKeyboardMarkup + | ReplyKeyboardRemove + | ForceReply + | None + ) = None, ) -> Message: ... async def get_sticker_set(self, name: str) -> StickerSet: ... @@ -993,8 +955,8 @@ async def create_new_sticker_set( name: str, title: str, stickers: list[InputSticker], - sticker_type: Optional[str] = None, - needs_repainting: Optional[bool] = None, + sticker_type: str | None = None, + needs_repainting: bool | None = None, ) -> Literal[True]: ... async def add_sticker_to_set( @@ -1018,11 +980,11 @@ async def set_sticker_emoji_list( ) -> Literal[True]: ... async def set_sticker_keywords( - self, sticker: str, keywords: Optional[list[str]] = None + self, sticker: str, keywords: list[str] | None = None ) -> Literal[True]: ... async def set_sticker_mask_position( - self, sticker: str, mask_position: Optional[MaskPosition] = None + self, sticker: str, mask_position: MaskPosition | None = None ) -> Literal[True]: ... async def set_sticker_set_title(self, name: str, title: str) -> Literal[True]: ... @@ -1032,11 +994,11 @@ async def set_sticker_set_thumbnail( name: str, user_id: int, format: Literal["static", "animated", "video"], - thumbnail: Optional[Union[str, InputFile]] = None, + thumbnail: str | InputFile | None = None, ) -> Literal[True]: ... async def set_custom_emoji_sticker_set_thumbnail( - self, name: str, custom_emoji_id: Optional[str] = None + self, name: str, custom_emoji_id: str | None = None ) -> Literal[True]: ... async def delete_sticker_set(self, name: str) -> Literal[True]: ... @@ -1045,10 +1007,10 @@ async def answer_inline_query( self, inline_query_id: str, results: list[InlineQueryResult], - cache_time: Optional[int] = None, - is_personal: Optional[bool] = None, - next_offset: Optional[str] = None, - button: Optional[InlineQueryResultsButton] = None, + cache_time: int | None = None, + is_personal: bool | None = None, + next_offset: str | None = None, + button: InlineQueryResultsButton | None = None, ) -> Literal[True]: ... async def answer_web_app_query( @@ -1057,35 +1019,35 @@ async def answer_web_app_query( async def send_invoice( self, - chat_id: Union[int, str], + chat_id: int | str, title: str, description: str, payload: str, currency: str, prices: list[LabeledPrice], - message_thread_id: Optional[int] = None, - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[list[int]] = None, - start_parameter: Optional[str] = None, - provider_data: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, + message_thread_id: int | None = None, + provider_token: str | None = None, + max_tip_amount: int | None = None, + suggested_tip_amounts: list[int] | None = None, + start_parameter: str | None = None, + provider_data: str | None = None, + photo_url: str | None = None, + photo_size: int | None = None, + photo_width: int | None = None, + photo_height: int | None = None, + need_name: bool | None = None, + need_phone_number: bool | None = None, + need_email: bool | None = None, + need_shipping_address: bool | None = None, + send_phone_number_to_provider: bool | None = None, + send_email_to_provider: bool | None = None, + is_flexible: bool | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: InlineKeyboardMarkup | None = None, ) -> Message: ... async def create_invoice_link( @@ -1095,36 +1057,36 @@ async def create_invoice_link( payload: str, currency: str, prices: list[LabeledPrice], - provider_token: Optional[str] = None, - max_tip_amount: Optional[int] = None, - suggested_tip_amounts: Optional[list[int]] = None, - provider_data: Optional[str] = None, - photo_url: Optional[str] = None, - photo_size: Optional[int] = None, - photo_width: Optional[int] = None, - photo_height: Optional[int] = None, - need_name: Optional[bool] = None, - need_phone_number: Optional[bool] = None, - need_email: Optional[bool] = None, - need_shipping_address: Optional[bool] = None, - send_phone_number_to_provider: Optional[bool] = None, - send_email_to_provider: Optional[bool] = None, - is_flexible: Optional[bool] = None, + provider_token: str | None = None, + max_tip_amount: int | None = None, + suggested_tip_amounts: list[int] | None = None, + provider_data: str | None = None, + photo_url: str | None = None, + photo_size: int | None = None, + photo_width: int | None = None, + photo_height: int | None = None, + need_name: bool | None = None, + need_phone_number: bool | None = None, + need_email: bool | None = None, + need_shipping_address: bool | None = None, + send_phone_number_to_provider: bool | None = None, + send_email_to_provider: bool | None = None, + is_flexible: bool | None = None, ) -> str: ... async def answer_shipping_query( self, shipping_query_id: str, ok: bool, - shipping_options: Optional[list[ShippingOption]] = None, - error_message: Optional[str] = None, + shipping_options: list[ShippingOption] | None = None, + error_message: str | None = None, ) -> Literal[True]: ... async def answer_pre_checkout_query( - self, pre_checkout_query_id: str, ok: bool, error_message: Optional[str] = None + self, pre_checkout_query_id: str, ok: bool, error_message: str | None = None ) -> Literal[True]: ... async def get_star_transactions( - self, offset: Optional[int] = None, limit: Optional[int] = None + self, offset: int | None = None, limit: int | None = None ) -> StarTransaction: ... async def refund_star_payment( self, user_id: int, telegram_payment_charge_id: str @@ -1138,31 +1100,31 @@ async def send_game( self, chat_id: int, game_short_name: str, - business_connection_id: Optional[str] = None, - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - allow_paid_broadcast: Optional[bool] = None, - message_effect_id: Optional[str] = None, - reply_parameters: Optional[ReplyParameters] = None, - reply_markup: Optional[InlineKeyboardMarkup] = None, + business_connection_id: str | None = None, + message_thread_id: int | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + allow_paid_broadcast: bool | None = None, + message_effect_id: str | None = None, + reply_parameters: ReplyParameters | None = None, + reply_markup: InlineKeyboardMarkup | None = None, ) -> Message: ... async def set_game_score( self, user_id: int, score: int, - force: Optional[bool] = None, - disable_edit_message: Optional[bool] = None, - chat_id: Optional[int] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, - ) -> Union[Message, Literal[True]]: ... + force: bool | None = None, + disable_edit_message: bool | None = None, + chat_id: int | None = None, + message_id: int | None = None, + inline_message_id: str | None = None, + ) -> Message | Literal[True]: ... async def get_game_high_scores( self, user_id: int, - chat_id: Optional[int] = None, - message_id: Optional[int] = None, - inline_message_id: Optional[str] = None, + chat_id: int | None = None, + message_id: int | None = None, + inline_message_id: str | None = None, ) -> list[GameHighScore]: ... diff --git a/nonebot/adapters/telegram/bot.py b/nonebot/adapters/telegram/bot.py index c3fc4e4..c1404a8 100644 --- a/nonebot/adapters/telegram/bot.py +++ b/nonebot/adapters/telegram/bot.py @@ -1,8 +1,8 @@ import inspect from uuid import uuid4 +from typing import Any, cast from functools import partial from typing_extensions import override -from typing import Any, Union, Optional, cast from pydantic import TypeAdapter from nonebot.message import handle_event @@ -34,13 +34,13 @@ def __init__( adapter: "Adapter", self_id: str, *, - config: Optional[BotConfig] = None, + config: BotConfig | None = None, ): if not config: raise ValueError("config is required") super().__init__(adapter, self_id) - self.username: Optional[str] = None + self.username: str | None = None self.bot_config = config self.secret_token = uuid4().hex @@ -112,13 +112,13 @@ def __getattribute__(self, __name: str) -> Any: # TODO 重构 async def send_to( self, - chat_id: Union[int, str], - message: Union[str, Message, MessageSegment], - message_thread_id: Optional[int] = None, - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, - reply_to_message_id: Optional[int] = None, # Deprecated - allow_sending_without_reply: Optional[bool] = None, # Deprecated + chat_id: int | str, + message: str | Message | MessageSegment, + message_thread_id: int | None = None, + disable_notification: bool | None = None, + protect_content: bool | None = None, + reply_to_message_id: int | None = None, # Deprecated + allow_sending_without_reply: bool | None = None, # Deprecated media_group_caption_index: int = 0, # 非 Telegram 原生参数 **kwargs, ): @@ -273,9 +273,9 @@ async def send_to( async def send( self, event: Event, - message: Union[str, Message, MessageSegment], - disable_notification: Optional[bool] = None, - protect_content: Optional[bool] = None, + message: str | Message | MessageSegment, + disable_notification: bool | None = None, + protect_content: bool | None = None, **kwargs, ) -> Any: if not isinstance(event, EventWithChat): @@ -289,7 +289,7 @@ async def send( ) message_thread_id = cast( - Optional[int], + int | None, getattr(event, "message_thread_id", None), ) diff --git a/nonebot/adapters/telegram/config.py b/nonebot/adapters/telegram/config.py index 307fb41..64eae69 100644 --- a/nonebot/adapters/telegram/config.py +++ b/nonebot/adapters/telegram/config.py @@ -1,5 +1,3 @@ -from typing import Optional - from pydantic import Field, BaseModel, ConfigDict @@ -30,9 +28,9 @@ class AdapterConfig(BaseModel): - ``telegram_webhook_url``: 自定义 webhook url """ - proxy: Optional[str] = Field(default=None, alias="telegram_proxy") + proxy: str | None = Field(default=None, alias="telegram_proxy") telegram_bots: list["BotConfig"] = [] - telegram_webhook_url: Optional[str] = None + telegram_webhook_url: str | None = None model_config: ConfigDict = ConfigDict( extra="ignore", populate_by_name=True, diff --git a/nonebot/adapters/telegram/event.py b/nonebot/adapters/telegram/event.py index f679545..59f12fb 100644 --- a/nonebot/adapters/telegram/event.py +++ b/nonebot/adapters/telegram/event.py @@ -129,16 +129,16 @@ class MessageEvent(Event): message_id: int date: int chat: Chat - forward_from: Optional[User] = None - forward_from_chat: Optional[Chat] = None - forward_from_message_id: Optional[int] = None - forward_signature: Optional[str] = None - forward_sender_name: Optional[str] = None - forward_date: Optional[int] = None - via_bot: Optional[User] = None - has_protected_content: Optional[Literal[True]] = None - media_group_id: Optional[str] = None - author_signature: Optional[str] = None + forward_from: User | None = None + forward_from_chat: Chat | None = None + forward_from_message_id: int | None = None + forward_signature: str | None = None + forward_sender_name: str | None = None + forward_date: int | None = None + via_bot: User | None = None + has_protected_content: Literal[True] | None = None + media_group_id: str | None = None + author_signature: str | None = None reply_to_message: Optional["MessageEvent"] = None message: Message = Message() original_message: Message = Message() @@ -227,7 +227,7 @@ def __parse_event(cls, obj: dict) -> "Event": return event from_: User = Field(alias="from") - sender_chat: Optional[Chat] = None + sender_chat: Chat | None = None @override def get_event_name(self) -> str: @@ -269,7 +269,7 @@ def get_event_description(self) -> str: class ChannelPostEvent(MessageEvent): - sender_chat: Optional[Chat] = None + sender_chat: Chat | None = None @override def get_event_name(self) -> str: @@ -284,10 +284,10 @@ class EditedMessageEvent(Event): message_id: int date: int chat: Chat - via_bot: Optional[User] = None + via_bot: User | None = None edit_date: int - media_group_id: Optional[str] = None - author_signature: Optional[str] = None + media_group_id: str | None = None + author_signature: str | None = None reply_to_message: Optional["MessageEvent"] = None message: Message = Message() @@ -335,7 +335,7 @@ def get_event_description(self) -> str: class PrivateEditedMessageEvent(EditedMessageEvent): from_: User = Field(alias="from") - sender_chat: Optional[Chat] = None + sender_chat: Chat | None = None @override def get_event_name(self) -> str: @@ -363,7 +363,7 @@ def get_event_description(self) -> str: class GroupEditedMessageEvent(EditedMessageEvent): from_: User = Field(default=None, alias="from") - sender_chat: Optional[Chat] = None + sender_chat: Chat | None = None @classmethod def __parse_event(cls, obj: dict) -> "Event": @@ -414,7 +414,7 @@ def get_event_description(self) -> str: class EditedChannelPostEvent(EditedMessageEvent): - sender_chat: Optional[Chat] = None + sender_chat: Chat | None = None @override def get_event_name(self) -> str: @@ -466,8 +466,8 @@ def get_event_name(self) -> str: class PinnedMessageEvent(NoticeEvent): message_id: int - from_: Optional[User] = Field(alias="from") - sender_chat: Optional[Chat] = None + from_: User | None = Field(alias="from") + sender_chat: Chat | None = None chat: Chat date: int pinned_message: MessageEvent = Field(default=None) @@ -497,7 +497,7 @@ def get_event_description(self) -> str: class NewChatMemberEvent(NoticeEvent): message_id: int - from_: Optional[User] = Field(default=None, alias="from") + from_: User | None = Field(default=None, alias="from") chat: Chat date: int new_chat_members: list[User] @@ -509,7 +509,7 @@ def get_event_name(self) -> str: class LeftChatMemberEvent(NoticeEvent): message_id: int - from_: Optional[User] = Field(default=None, alias="from") + from_: User | None = Field(default=None, alias="from") chat: Chat date: int left_chat_member: User @@ -539,7 +539,7 @@ def get_event_name(self) -> str: class NewChatTitleEvent(NoticeEvent): date: int - from_: Optional[User] = Field(default=None, alias="from") + from_: User | None = Field(default=None, alias="from") chat: Chat new_chat_title: str @@ -550,7 +550,7 @@ def get_event_name(self) -> str: class NewChatPhotoEvent(NoticeEvent): date: int - from_: Optional[User] = Field(default=None, alias="from") + from_: User | None = Field(default=None, alias="from") chat: Chat new_chat_photo: list[PhotoSize] @@ -561,7 +561,7 @@ def get_event_name(self) -> str: class DeleteChatPhotoEvent(NoticeEvent): date: int - from_: Optional[User] = Field(default=None, alias="from") + from_: User | None = Field(default=None, alias="from") chat: Chat delete_chat_photo: Literal[True] @@ -572,7 +572,7 @@ def get_event_name(self) -> str: class ForumTopicCreatedEvent(NoticeEvent): message_thread_id: int - from_: Optional[User] = Field(default=None, alias="from") + from_: User | None = Field(default=None, alias="from") chat: Chat date: int forum_topic_created: ForumTopicCreated @@ -584,7 +584,7 @@ def get_event_name(self) -> str: class ForumTopicEditedEvent(NoticeEvent): message_thread_id: int - from_: Optional[User] = Field(default=None, alias="from") + from_: User | None = Field(default=None, alias="from") chat: Chat date: int forum_topic_edited: ForumTopicEdited @@ -596,7 +596,7 @@ def get_event_name(self) -> str: class ForumTopicClosedEvent(NoticeEvent): message_thread_id: int - from_: Optional[User] = Field(default=None, alias="from") + from_: User | None = Field(default=None, alias="from") chat: Chat date: int forum_topic_closed: ForumTopicClosed @@ -608,7 +608,7 @@ def get_event_name(self) -> str: class ForumTopicReopenedEvent(NoticeEvent): message_thread_id: int - from_: Optional[User] = Field(default=None, alias="from") + from_: User | None = Field(default=None, alias="from") chat: Chat date: int forum_topic_reopened: ForumTopicReopened @@ -619,7 +619,7 @@ def get_event_name(self) -> str: class GeneralForumTopicHiddenEvent(NoticeEvent): - from_: Optional[User] = Field(default=None, alias="from") + from_: User | None = Field(default=None, alias="from") chat: Chat date: int general_forum_topic_hidden: GeneralForumTopicHidden @@ -630,7 +630,7 @@ def get_event_name(self) -> str: class GeneralForumTopicUnhiddenEvent(NoticeEvent): - from_: Optional[User] = Field(default=None, alias="from") + from_: User | None = Field(default=None, alias="from") chat: Chat date: int general_forum_topic_unhidden: GeneralForumTopicUnhidden diff --git a/nonebot/adapters/telegram/exception.py b/nonebot/adapters/telegram/exception.py index 06a8721..d74eb72 100644 --- a/nonebot/adapters/telegram/exception.py +++ b/nonebot/adapters/telegram/exception.py @@ -1,5 +1,3 @@ -from typing import Optional - from nonebot.exception import AdapterException from nonebot.exception import ActionFailed as BaseActionFailed from nonebot.exception import NetworkError as BaseNetworkError @@ -22,7 +20,7 @@ class ActionFailed(BaseActionFailed, TelegramAdapterException): API 请求返回错误信息。 """ - def __init__(self, description: Optional[str] = None): + def __init__(self, description: str | None = None): super().__init__() self.description = description @@ -39,7 +37,7 @@ class NetworkError(BaseNetworkError, TelegramAdapterException): 网络错误。 """ - def __init__(self, msg: Optional[str] = None): + def __init__(self, msg: str | None = None): super().__init__() self.msg = msg diff --git a/nonebot/adapters/telegram/message.py b/nonebot/adapters/telegram/message.py index 4a3fcb3..c4ff092 100644 --- a/nonebot/adapters/telegram/message.py +++ b/nonebot/adapters/telegram/message.py @@ -1,6 +1,6 @@ from collections.abc import Iterable from typing_extensions import override -from typing import Any, Union, Literal, TypeVar, Optional +from typing import Any, Literal, TypeVar from nonebot.adapters import Message as BaseMessage from nonebot.adapters import MessageSegment as BaseMessageSegment @@ -50,10 +50,10 @@ def is_text(self) -> bool: def location( latitude: float, longitude: float, - horizontal_accuracy: Optional[float] = None, - live_period: Optional[int] = None, - heading: Optional[int] = None, - proximity_alert_radius: Optional[int] = None, + horizontal_accuracy: float | None = None, + live_period: int | None = None, + heading: int | None = None, + proximity_alert_radius: int | None = None, ) -> "MessageSegment": return MessageSegment( "location", @@ -73,10 +73,10 @@ def venue( longitude: float, title: str, address: str, - foursquare_id: Optional[str] = None, - foursquare_type: Optional[str] = None, - google_place_id: Optional[str] = None, - google_place_type: Optional[str] = None, + foursquare_id: str | None = None, + foursquare_type: str | None = None, + google_place_id: str | None = None, + google_place_type: str | None = None, ) -> "MessageSegment": return MessageSegment( "venue", @@ -96,13 +96,13 @@ def venue( def poll( question: str, options: list[str], - is_anonymous: Optional[bool] = None, - type: Optional[str] = None, - allows_multiple_answers: Optional[bool] = None, - correct_option_id: Optional[int] = None, - explanation: Optional[str] = None, - open_period: Optional[int] = None, - close_date: Optional[int] = None, + is_anonymous: bool | None = None, + type: str | None = None, + allows_multiple_answers: bool | None = None, + correct_option_id: int | None = None, + explanation: str | None = None, + open_period: int | None = None, + close_date: int | None = None, ) -> "MessageSegment": return MessageSegment( "poll", @@ -166,10 +166,10 @@ class Reply(MessageSegment): @staticmethod def reply( message_id: int, - chat_id: Optional[Union[int, str]] = None, - allow_sending_without_reply: Optional[bool] = None, - quote: Optional[str] = None, - quote_position: Optional[int] = None, + chat_id: int | str | None = None, + allow_sending_without_reply: bool | None = None, + quote: str | None = None, + quote_position: int | None = None, ): return Reply( "reply", @@ -353,19 +353,19 @@ def build_telegram_entities(entities: list["Entity"]) -> list[MessageEntity]: class File(MessageSegment): @staticmethod def photo( - file: Union[str, bytes, tuple[str, bytes]], has_spoiler: Optional[bool] = None + file: str | bytes | tuple[str, bytes], has_spoiler: bool | None = None ) -> "MessageSegment": return File("photo", {"file": file, "has_spoiler": has_spoiler}) @staticmethod - def voice(file: Union[str, bytes, tuple[str, bytes]]) -> "MessageSegment": + def voice(file: str | bytes | tuple[str, bytes]) -> "MessageSegment": return File("voice", {"file": file}) @staticmethod def animation( - file: Union[str, bytes, tuple[str, bytes]], - thumbnail: Union[None, str, bytes] = None, - has_spoiler: Optional[bool] = None, + file: str | bytes | tuple[str, bytes], + thumbnail: None | str | bytes = None, + has_spoiler: bool | None = None, ) -> "MessageSegment": return File( "animation", @@ -374,23 +374,23 @@ def animation( @staticmethod def audio( - file: Union[str, bytes, tuple[str, bytes]], - thumbnail: Union[None, str, bytes] = None, + file: str | bytes | tuple[str, bytes], + thumbnail: None | str | bytes = None, ) -> "MessageSegment": return File("audio", {"file": file, "thumbnail": thumbnail}) @staticmethod def document( - file: Union[str, bytes, tuple[str, bytes]], - thumbnail: Union[None, str, bytes] = None, + file: str | bytes | tuple[str, bytes], + thumbnail: None | str | bytes = None, ) -> "MessageSegment": return File("document", {"file": file, "thumbnail": thumbnail}) @staticmethod def video( - file: Union[str, bytes, tuple[str, bytes]], - thumbnail: Union[None, str, bytes] = None, - has_spoiler: Optional[bool] = None, + file: str | bytes | tuple[str, bytes], + thumbnail: None | str | bytes = None, + has_spoiler: bool | None = None, ) -> "MessageSegment": return File( "video", @@ -400,13 +400,13 @@ def video( class UnCombinFile(File): @staticmethod - def sticker(file: Union[str, bytes, tuple[str, bytes]]) -> "MessageSegment": + def sticker(file: str | bytes | tuple[str, bytes]) -> "MessageSegment": return File("sticker", {"file": file}) @staticmethod def video_note( - file: Union[str, bytes, tuple[str, bytes]], - thumbnail: Union[None, str, bytes] = None, + file: str | bytes | tuple[str, bytes], + thumbnail: None | str | bytes = None, ) -> "MessageSegment": """ 不支持 URL diff --git a/nonebot/adapters/telegram/model.py b/nonebot/adapters/telegram/model.py index 1541d9f..7a41a8a 100644 --- a/nonebot/adapters/telegram/model.py +++ b/nonebot/adapters/telegram/model.py @@ -7,26 +7,26 @@ class User(BaseModel): id: int is_bot: bool first_name: str - last_name: Optional[str] = None - username: Optional[str] = None - language_code: Optional[str] = None - is_premium: Optional[Literal[True]] = None - added_to_attachment_menu: Optional[Literal[True]] = None - can_join_groups: Optional[bool] = None - can_read_all_group_messages: Optional[bool] = None - supports_inline_queries: Optional[bool] = None - can_connect_to_business: Optional[bool] = None - has_main_web_app: Optional[bool] = None + last_name: str | None = None + username: str | None = None + language_code: str | None = None + is_premium: Literal[True] | None = None + added_to_attachment_menu: Literal[True] | None = None + can_join_groups: bool | None = None + can_read_all_group_messages: bool | None = None + supports_inline_queries: bool | None = None + can_connect_to_business: bool | None = None + has_main_web_app: bool | None = None class Chat(BaseModel): id: int type: Literal["private", "group", "supergroup", "channel"] - title: Optional[str] = None - username: Optional[str] = None - first_name: Optional[str] = None - last_name: Optional[str] = None - is_forum: Optional[Literal[True]] = None + title: str | None = None + username: str | None = None + first_name: str | None = None + last_name: str | None = None + is_forum: Literal[True] | None = None class MessageOriginUser(BaseModel): @@ -45,7 +45,7 @@ class MessageOriginChat(BaseModel): type: Literal["chat"] = "chat" date: int sender_chat: Chat - author_signature: Optional[str] = None + author_signature: str | None = None class MessageOriginChannel(BaseModel): @@ -53,7 +53,7 @@ class MessageOriginChannel(BaseModel): date: int chat: Chat message_id: int - author_signature: Optional[str] = None + author_signature: str | None = None MessageOrigin = Union[ @@ -62,11 +62,11 @@ class MessageOriginChannel(BaseModel): class LinkPreviewOptions(BaseModel): - is_disabled: Optional[bool] = None - url: Optional[str] = None - prefer_small_media: Optional[bool] = None - prefer_large_media: Optional[bool] = None - show_above_text: Optional[bool] = None + is_disabled: bool | None = None + url: str | None = None + prefer_small_media: bool | None = None + prefer_large_media: bool | None = None + show_above_text: bool | None = None class PhotoSize(BaseModel): @@ -74,7 +74,7 @@ class PhotoSize(BaseModel): file_unique_id: str width: int height: int - file_size: Optional[int] = None + file_size: int | None = None class Animation(BaseModel): @@ -83,38 +83,38 @@ class Animation(BaseModel): width: int height: int duration: int - thumbnail: Optional[PhotoSize] = None - file_name: Optional[str] = None - mime_type: Optional[str] = None - file_size: Optional[int] = None + thumbnail: PhotoSize | None = None + file_name: str | None = None + mime_type: str | None = None + file_size: int | None = None class Audio(BaseModel): file_id: str file_unique_id: str duration: int - performer: Optional[str] = None - title: Optional[str] = None - file_name: Optional[str] = None - mime_type: Optional[str] = None - file_size: Optional[int] = None - thumbnail: Optional[PhotoSize] = None + performer: str | None = None + title: str | None = None + file_name: str | None = None + mime_type: str | None = None + file_size: int | None = None + thumbnail: PhotoSize | None = None class Document(BaseModel): file_id: str file_unique_id: str - thumbnail: Optional[PhotoSize] = None - file_name: Optional[str] = None - mime_type: Optional[str] = None - file_size: Optional[int] = None + thumbnail: PhotoSize | None = None + file_name: str | None = None + mime_type: str | None = None + file_size: int | None = None class PaidMediaPreview(BaseModel): type: Literal["preview"] = "preview" - width: Optional[int] = None - height: Optional[int] = None - duration: Optional[int] = None + width: int | None = None + height: int | None = None + duration: int | None = None class PaidMediaPhoto(BaseModel): @@ -128,10 +128,10 @@ class Video(BaseModel): width: int height: int duration: int - thumbnail: Optional[PhotoSize] = None - file_name: Optional[str] = None - mime_type: Optional[str] = None - file_size: Optional[int] = None + thumbnail: PhotoSize | None = None + file_name: str | None = None + mime_type: str | None = None + file_size: int | None = None class PaidMediaVideo(BaseModel): @@ -150,8 +150,8 @@ class PaidMediaInfo(BaseModel): class File(BaseModel): file_id: str file_unique_id: str - file_size: Optional[int] = None - file_path: Optional[str] = None + file_size: int | None = None + file_path: str | None = None class MaskPosition(BaseModel): @@ -169,14 +169,14 @@ class Sticker(BaseModel): height: int is_animated: bool is_video: bool - thumbnail: Optional[PhotoSize] = None - emoji: Optional[str] = None - set_name: Optional[str] = None - premium_animation: Optional[File] = None - mask_position: Optional[MaskPosition] = None - custom_emoji_id: Optional[str] = None - needs_repainting: Optional[Literal[True]] = None - file_size: Optional[int] = None + thumbnail: PhotoSize | None = None + emoji: str | None = None + set_name: str | None = None + premium_animation: File | None = None + mask_position: MaskPosition | None = None + custom_emoji_id: str | None = None + needs_repainting: Literal[True] | None = None + file_size: int | None = None class Story(BaseModel): @@ -189,24 +189,24 @@ class VideoNote(BaseModel): file_unique_id: str length: int duration: int - thumbnail: Optional[PhotoSize] = None - file_size: Optional[int] = None + thumbnail: PhotoSize | None = None + file_size: int | None = None class Voice(BaseModel): file_id: str file_unique_id: str duration: int - mime_type: Optional[str] = None - file_size: Optional[int] = None + mime_type: str | None = None + file_size: int | None = None class Contact(BaseModel): phone_number: str first_name: str - last_name: Optional[str] = None - user_id: Optional[int] = None - vcard: Optional[str] = None + last_name: str | None = None + user_id: int | None = None + vcard: str | None = None class Dice(BaseModel): @@ -238,31 +238,31 @@ class MessageEntity(BaseModel): ] offset: int length: int - url: Optional[str] = None - user: Optional[User] = None - language: Optional[str] = None - custom_emoji_id: Optional[str] = None + url: str | None = None + user: User | None = None + language: str | None = None + custom_emoji_id: str | None = None class Game(BaseModel): title: str description: str photo: list[PhotoSize] - text: Optional[str] = None - text_entities: Optional[list[MessageEntity]] = None - animation: Optional[Animation] = None + text: str | None = None + text_entities: list[MessageEntity] | None = None + animation: Animation | None = None class Giveaway(BaseModel): chats: list[Chat] winners_selection_date: int winner_count: int - only_new_members: Optional[Literal[True]] = None - has_public_winners: Optional[Literal[True]] = None - prize_description: Optional[str] = None - country_codes: Optional[list[str]] = None - prize_star_count: Optional[int] = None - premium_subscription_month_count: Optional[int] = None + only_new_members: Literal[True] | None = None + has_public_winners: Literal[True] | None = None + prize_description: str | None = None + country_codes: list[str] | None = None + prize_star_count: int | None = None + premium_subscription_month_count: int | None = None class GiveawayWinners(BaseModel): @@ -271,13 +271,13 @@ class GiveawayWinners(BaseModel): winners_selection_date: int winner_count: int winners: list[User] - additional_chat_count: Optional[int] = None - prize_star_count: Optional[int] = None - premium_subscription_month_count: Optional[int] = None - unclaimed_prize_count: Optional[int] = None - only_new_members: Optional[Literal[True]] = None - was_refunded: Optional[Literal[True]] = None - prize_description: Optional[str] = None + additional_chat_count: int | None = None + prize_star_count: int | None = None + premium_subscription_month_count: int | None = None + unclaimed_prize_count: int | None = None + only_new_members: Literal[True] | None = None + was_refunded: Literal[True] | None = None + prize_description: str | None = None class Invoice(BaseModel): @@ -291,77 +291,77 @@ class Invoice(BaseModel): class Location(BaseModel): latitude: float longitude: float - horizontal_accuracy: Optional[float] = None - live_period: Optional[int] = None - heading: Optional[int] = None - proximity_alert_radius: Optional[int] = None + horizontal_accuracy: float | None = None + live_period: int | None = None + heading: int | None = None + proximity_alert_radius: int | None = None class PollOption(BaseModel): text: str - text_entities: Optional[list[MessageEntity]] = None + text_entities: list[MessageEntity] | None = None voter_count: int class Poll(BaseModel): id: str question: str - question_entities: Optional[list[MessageEntity]] = None + question_entities: list[MessageEntity] | None = None options: list[PollOption] total_voter_count: int is_closed: bool is_anonymous: bool type: Literal["regular", "quiz"] allows_multiple_answers: bool - correct_option_id: Optional[int] = None - explanation: Optional[str] = None - explanation_entities: Optional[list[MessageEntity]] = None - open_period: Optional[int] = None - close_date: Optional[int] = None + correct_option_id: int | None = None + explanation: str | None = None + explanation_entities: list[MessageEntity] | None = None + open_period: int | None = None + close_date: int | None = None class Venue(BaseModel): location: Location title: str address: str - foursquare_id: Optional[str] = None - foursquare_type: Optional[str] = None - google_place_id: Optional[str] = None - google_place_type: Optional[str] = None + foursquare_id: str | None = None + foursquare_type: str | None = None + google_place_id: str | None = None + google_place_type: str | None = None class ExternalReplyInfo(BaseModel): origin: MessageOrigin - chat: Optional[Chat] = None - message_id: Optional[int] = None - link_preview_options: Optional[LinkPreviewOptions] = None - animation: Optional[Animation] = None - audio: Optional[Audio] = None - document: Optional[Document] = None - paid_media: Optional[PaidMediaInfo] = None - photo: Optional[list[PhotoSize]] = None - sticker: Optional[Sticker] = None - story: Optional[Story] = None - video: Optional[Video] = None - video_note: Optional[VideoNote] = None - voice: Optional[Voice] = None - has_media_spoiler: Optional[Literal[True]] = None - contact: Optional[Contact] = None - dice: Optional[Dice] = None - game: Optional[Game] = None - giveaway: Optional[Giveaway] = None - giveaway_winners: Optional[GiveawayWinners] = None - invoice: Optional[Invoice] = None - location: Optional[Location] = None - poll: Optional[Poll] = None - venue: Optional[Venue] = None + chat: Chat | None = None + message_id: int | None = None + link_preview_options: LinkPreviewOptions | None = None + animation: Animation | None = None + audio: Audio | None = None + document: Document | None = None + paid_media: PaidMediaInfo | None = None + photo: list[PhotoSize] | None = None + sticker: Sticker | None = None + story: Story | None = None + video: Video | None = None + video_note: VideoNote | None = None + voice: Voice | None = None + has_media_spoiler: Literal[True] | None = None + contact: Contact | None = None + dice: Dice | None = None + game: Game | None = None + giveaway: Giveaway | None = None + giveaway_winners: GiveawayWinners | None = None + invoice: Invoice | None = None + location: Location | None = None + poll: Poll | None = None + venue: Venue | None = None class TextQuote(BaseModel): text: str - entities: Optional[list[MessageEntity]] = None + entities: list[MessageEntity] | None = None position: int - is_manual: Optional[Literal[True]] = None + is_manual: Literal[True] | None = None class MessageAutoDeleteTimerChanged(BaseModel): @@ -387,18 +387,18 @@ class ShippingAddress(BaseModel): class OrderInfo(BaseModel): - name: Optional[str] = None - phone_number: Optional[str] = None - email: Optional[str] = None - shipping_address: Optional[ShippingAddress] = None + name: str | None = None + phone_number: str | None = None + email: str | None = None + shipping_address: ShippingAddress | None = None class SuccessfulPayment(BaseModel): currency: str total_amount: int invoice_payload: str - shipping_option_id: Optional[str] = None - order_info: Optional[OrderInfo] = None + shipping_option_id: str | None = None + order_info: OrderInfo | None = None telegram_payment_charge_id: str provider_payment_charge_id: str @@ -408,15 +408,15 @@ class RefundedPayment(BaseModel): total_amount: int invoice_payload: str telegram_payment_charge_id: str - provider_payment_charge_id: Optional[str] = None + provider_payment_charge_id: str | None = None class SharedUser(BaseModel): user_id: int - first_name: Optional[str] = None - last_name: Optional[str] = None - username: Optional[str] = None - photo: Optional[list[PhotoSize]] = None + first_name: str | None = None + last_name: str | None = None + username: str | None = None + photo: list[PhotoSize] | None = None class UsersShared(BaseModel): @@ -427,15 +427,15 @@ class UsersShared(BaseModel): class ChatShared(BaseModel): request_id: int chat_id: int - title: Optional[str] = None - username: Optional[str] = None - photo: Optional[list[PhotoSize]] = None + title: str | None = None + username: str | None = None + photo: list[PhotoSize] | None = None class WriteAccessAllowed(BaseModel): - from_request: Optional[bool] = None - web_app_name: Optional[str] = None - from_attachment_menu: Optional[bool] = None + from_request: bool | None = None + web_app_name: str | None = None + from_attachment_menu: bool | None = None class PassportFile(BaseModel): @@ -461,14 +461,14 @@ class EncryptedPassportElement(BaseModel): "phone_number", "email", ] - data: Optional[str] = None - phone_number: Optional[str] = None - email: Optional[str] = None - files: Optional[list[PassportFile]] = None - front_side: Optional[PassportFile] = None - reverse_side: Optional[PassportFile] = None - selfie: Optional[PassportFile] = None - translation: Optional[list[PassportFile]] = None + data: str | None = None + phone_number: str | None = None + email: str | None = None + files: list[PassportFile] | None = None + front_side: PassportFile | None = None + reverse_side: PassportFile | None = None + selfie: PassportFile | None = None + translation: list[PassportFile] | None = None hash: str @@ -525,8 +525,8 @@ class BackgroundTypeWallpaper(BaseModel): type: Literal["wallpaper"] = "wallpaper" document: Document dark_theme_dimming: int - is_blurred: Optional[Literal[True]] = None - is_moving: Optional[Literal[True]] = None + is_blurred: Literal[True] | None = None + is_moving: Literal[True] | None = None class BackgroundTypePattern(BaseModel): @@ -534,8 +534,8 @@ class BackgroundTypePattern(BaseModel): document: Document fill: BackgroundFill intensity: int - is_inverted: Optional[Literal[True]] = None - is_moving: Optional[Literal[True]] = None + is_inverted: Literal[True] | None = None + is_moving: Literal[True] | None = None class BackgroundTypeChatTheme(BaseModel): @@ -558,12 +558,12 @@ class ChatBackground(BaseModel): class ForumTopicCreated(BaseModel): name: str icon_color: int - icon_custom_emoji_id: Optional[str] = None + icon_custom_emoji_id: str | None = None class ForumTopicEdited(BaseModel): - name: Optional[str] = None - icon_custom_emoji_id: Optional[str] = None + name: str | None = None + icon_custom_emoji_id: str | None = None class ForumTopicClosed(BaseModel): @@ -583,14 +583,14 @@ class GeneralForumTopicUnhidden(BaseModel): class GiveawayCreated(BaseModel): - prize_star_count: Optional[int] = None + prize_star_count: int | None = None class GiveawayCompleted(BaseModel): winner_count: int - unclaimed_prize_count: Optional[int] = None + unclaimed_prize_count: int | None = None giveaway_message: Optional["Message"] = None - is_star_giveaway: Optional[Literal[True]] = None + is_star_giveaway: Literal[True] | None = None class VideoChatScheduled(BaseModel): @@ -620,17 +620,17 @@ class WebAppInfo(BaseModel): class LoginUrl(BaseModel): url: str - forward_text: Optional[str] = None - bot_username: Optional[str] = None - request_write_access: Optional[bool] = None + forward_text: str | None = None + bot_username: str | None = None + request_write_access: bool | None = None class SwitchInlineQueryChosenChat(BaseModel): - query: Optional[str] = None - allow_user_chats: Optional[bool] = None - allow_bot_chats: Optional[bool] = None - allow_group_chats: Optional[bool] = None - allow_channel_chats: Optional[bool] = None + query: str | None = None + allow_user_chats: bool | None = None + allow_bot_chats: bool | None = None + allow_group_chats: bool | None = None + allow_channel_chats: bool | None = None class CopyTextButton(BaseModel): @@ -643,16 +643,16 @@ class CallbackGame(BaseModel): class InlineKeyboardButton(BaseModel): text: str - url: Optional[str] = None - callback_data: Optional[str] = None - web_app: Optional[WebAppInfo] = None - login_url: Optional[LoginUrl] = None - switch_inline_query: Optional[str] = None - switch_inline_query_current_chat: Optional[str] = None - switch_inline_query_chosen_chat: Optional[SwitchInlineQueryChosenChat] = None - copy_text: Optional[CopyTextButton] = None - callback_game: Optional[CallbackGame] = None - pay: Optional[bool] = None + url: str | None = None + callback_data: str | None = None + web_app: WebAppInfo | None = None + login_url: LoginUrl | None = None + switch_inline_query: str | None = None + switch_inline_query_current_chat: str | None = None + switch_inline_query_chosen_chat: SwitchInlineQueryChosenChat | None = None + copy_text: CopyTextButton | None = None + callback_game: CallbackGame | None = None + pay: bool | None = None class InlineKeyboardMarkup(BaseModel): @@ -661,90 +661,90 @@ class InlineKeyboardMarkup(BaseModel): class Message(BaseModel): message_id: int - message_thread_id: Optional[int] = None - from_: Optional[User] = Field(default=None, alias="from") - sender_chat: Optional[Chat] = None - sender_boost_count: Optional[int] = None - sender_business_bot: Optional[User] = None + message_thread_id: int | None = None + from_: User | None = Field(default=None, alias="from") + sender_chat: Chat | None = None + sender_boost_count: int | None = None + sender_business_bot: User | None = None date: int - business_connection_id: Optional[str] = None + business_connection_id: str | None = None chat: Chat - forward_origin: Optional[MessageOrigin] = None - is_topic_message: Optional[Literal[True]] = None - is_automatic_forward: Optional[Literal[True]] = None + forward_origin: MessageOrigin | None = None + is_topic_message: Literal[True] | None = None + is_automatic_forward: Literal[True] | None = None reply_to_message: Optional["Message"] = None - external_reply: Optional[ExternalReplyInfo] = None - quote: Optional[TextQuote] = None - reply_to_story: Optional[Story] = None - via_bot: Optional[User] = None - edit_date: Optional[int] = None - has_protected_content: Optional[Literal[True]] = None - is_from_offline: Optional[Literal[True]] = None - media_group_id: Optional[str] = None - author_signature: Optional[str] = None - text: Optional[str] = None - entities: Optional[list[MessageEntity]] = None - link_preview_options: Optional[LinkPreviewOptions] = None - effect_id: Optional[str] = None - animation: Optional[Animation] = None - audio: Optional[Audio] = None - document: Optional[Document] = None - paid_media: Optional[PaidMediaInfo] = None - photo: Optional[list[PhotoSize]] = None - sticker: Optional[Sticker] = None - story: Optional[Story] = None - video: Optional[Video] = None - video_note: Optional[VideoNote] = None - voice: Optional[Voice] = None - caption: Optional[str] = None - caption_entities: Optional[list[MessageEntity]] = None - show_caption_above_media: Optional[Literal[True]] = None - has_media_spoiler: Optional[Literal[True]] = None - contact: Optional[Contact] = None - dice: Optional[Dice] = None - game: Optional[Game] = None - poll: Optional[Poll] = None - venue: Optional[Venue] = None - location: Optional[Location] = None - new_chat_members: Optional[list[User]] = None - left_chat_member: Optional[User] = None - new_chat_title: Optional[str] = None - new_chat_photo: Optional[list[PhotoSize]] = None - delete_chat_photo: Optional[Literal[True]] = None - group_chat_created: Optional[Literal[True]] = None - supergroup_chat_created: Optional[Literal[True]] = None - channel_chat_created: Optional[Literal[True]] = None - message_auto_delete_timer_changed: Optional[MessageAutoDeleteTimerChanged] = None - migrate_to_chat_id: Optional[int] = None - migrate_from_chat_id: Optional[int] = None - pinned_message: Optional[MaybeInaccessibleMessage] = None - invoice: Optional[Invoice] = None - successful_payment: Optional[SuccessfulPayment] = None - refunded_payment: Optional[RefundedPayment] = None - users_shared: Optional[UsersShared] = None - chat_shared: Optional[ChatShared] = None - connected_website: Optional[str] = None - write_access_allowed: Optional[WriteAccessAllowed] = None - passport_data: Optional[PassportData] = None - proximity_alert_triggered: Optional[ProximityAlertTriggered] = None - boost_added: Optional[ChatBoostAdded] = None - chat_background_set: Optional[ChatBackground] = None - forum_topic_created: Optional[ForumTopicCreated] = None - forum_topic_edited: Optional[ForumTopicEdited] = None - forum_topic_closed: Optional[ForumTopicClosed] = None - forum_topic_reopened: Optional[ForumTopicReopened] = None - general_forum_topic_hidden: Optional[GeneralForumTopicHidden] = None - general_forum_topic_unhidden: Optional[GeneralForumTopicUnhidden] = None - giveaway_created: Optional[GiveawayCreated] = None - giveaway: Optional[Giveaway] = None - giveaway_winners: Optional[GiveawayWinners] = None - giveaway_completed: Optional[GiveawayCompleted] = None - video_chat_scheduled: Optional[VideoChatScheduled] = None - video_chat_started: Optional[VideoChatStarted] = None - video_chat_ended: Optional[VideoChatEnded] = None - video_chat_participants_invited: Optional[VideoChatParticipantsInvited] = None - web_app_data: Optional[WebAppData] = None - reply_markup: Optional[InlineKeyboardMarkup] = None + external_reply: ExternalReplyInfo | None = None + quote: TextQuote | None = None + reply_to_story: Story | None = None + via_bot: User | None = None + edit_date: int | None = None + has_protected_content: Literal[True] | None = None + is_from_offline: Literal[True] | None = None + media_group_id: str | None = None + author_signature: str | None = None + text: str | None = None + entities: list[MessageEntity] | None = None + link_preview_options: LinkPreviewOptions | None = None + effect_id: str | None = None + animation: Animation | None = None + audio: Audio | None = None + document: Document | None = None + paid_media: PaidMediaInfo | None = None + photo: list[PhotoSize] | None = None + sticker: Sticker | None = None + story: Story | None = None + video: Video | None = None + video_note: VideoNote | None = None + voice: Voice | None = None + caption: str | None = None + caption_entities: list[MessageEntity] | None = None + show_caption_above_media: Literal[True] | None = None + has_media_spoiler: Literal[True] | None = None + contact: Contact | None = None + dice: Dice | None = None + game: Game | None = None + poll: Poll | None = None + venue: Venue | None = None + location: Location | None = None + new_chat_members: list[User] | None = None + left_chat_member: User | None = None + new_chat_title: str | None = None + new_chat_photo: list[PhotoSize] | None = None + delete_chat_photo: Literal[True] | None = None + group_chat_created: Literal[True] | None = None + supergroup_chat_created: Literal[True] | None = None + channel_chat_created: Literal[True] | None = None + message_auto_delete_timer_changed: MessageAutoDeleteTimerChanged | None = None + migrate_to_chat_id: int | None = None + migrate_from_chat_id: int | None = None + pinned_message: MaybeInaccessibleMessage | None = None + invoice: Invoice | None = None + successful_payment: SuccessfulPayment | None = None + refunded_payment: RefundedPayment | None = None + users_shared: UsersShared | None = None + chat_shared: ChatShared | None = None + connected_website: str | None = None + write_access_allowed: WriteAccessAllowed | None = None + passport_data: PassportData | None = None + proximity_alert_triggered: ProximityAlertTriggered | None = None + boost_added: ChatBoostAdded | None = None + chat_background_set: ChatBackground | None = None + forum_topic_created: ForumTopicCreated | None = None + forum_topic_edited: ForumTopicEdited | None = None + forum_topic_closed: ForumTopicClosed | None = None + forum_topic_reopened: ForumTopicReopened | None = None + general_forum_topic_hidden: GeneralForumTopicHidden | None = None + general_forum_topic_unhidden: GeneralForumTopicUnhidden | None = None + giveaway_created: GiveawayCreated | None = None + giveaway: Giveaway | None = None + giveaway_winners: GiveawayWinners | None = None + giveaway_completed: GiveawayCompleted | None = None + video_chat_scheduled: VideoChatScheduled | None = None + video_chat_started: VideoChatStarted | None = None + video_chat_ended: VideoChatEnded | None = None + video_chat_participants_invited: VideoChatParticipantsInvited | None = None + web_app_data: WebAppData | None = None + reply_markup: InlineKeyboardMarkup | None = None class BusinessConnection(BaseModel): @@ -782,8 +782,8 @@ class ReactionTypePaid(BaseModel): class MessageReactionUpdated(BaseModel): chat: Chat message_id: int - user: Optional[User] = None - actor_chat: Optional[Chat] = None + user: User | None = None + actor_chat: Chat | None = None date: int old_reaction: list[ReactionType] new_reaction: list[ReactionType] @@ -806,28 +806,28 @@ class InlineQuery(BaseModel): from_: User = Field(alias="from") query: str offset: str - chat_type: Optional[ - Literal["sender", "private", "group", "supergroup", "channel"] - ] = None - location: Optional[Location] = None + chat_type: Literal["sender", "private", "group", "supergroup", "channel"] | None = ( + None + ) + location: Location | None = None class ChosenInlineResult(BaseModel): result_id: str from_: User = Field(alias="from") - location: Optional[Location] = None - inline_message_id: Optional[str] = None + location: Location | None = None + inline_message_id: str | None = None query: str class CallbackQuery(BaseModel): id: str from_: User = Field(alias="from") - message: Optional[MaybeInaccessibleMessage] = None - inline_message_id: Optional[str] = None + message: MaybeInaccessibleMessage | None = None + inline_message_id: str | None = None chat_instance: str - data: Optional[str] = None - game_short_name: Optional[str] = None + data: str | None = None + game_short_name: str | None = None class ShippingQuery(BaseModel): @@ -843,8 +843,8 @@ class PreCheckoutQuery(BaseModel): currency: str total_amount: int invoice_payload: str - shipping_option_id: Optional[str] = None - order_info: Optional[OrderInfo] = None + shipping_option_id: str | None = None + order_info: OrderInfo | None = None class PaidMediaPurchased(BaseModel): @@ -854,8 +854,8 @@ class PaidMediaPurchased(BaseModel): class PollAnswer(BaseModel): poll_id: str - voter_chat: Optional[Chat] = None - user: Optional[User] = None + voter_chat: Chat | None = None + user: User | None = None option_ids: list[int] @@ -863,7 +863,7 @@ class ChatMemberOwner(BaseModel): status: Literal["creator"] = "creator" user: User is_anonymous: bool - custom_title: Optional[str] = None + custom_title: str | None = None class ChatMemberAdministrator(BaseModel): @@ -881,17 +881,17 @@ class ChatMemberAdministrator(BaseModel): can_post_stories: bool can_edit_stories: bool can_delete_stories: bool - can_post_messages: Optional[bool] = None - can_edit_messages: Optional[bool] = None - can_pin_messages: Optional[bool] = None - can_manage_topics: Optional[bool] = None - custom_title: Optional[str] = None + can_post_messages: bool | None = None + can_edit_messages: bool | None = None + can_pin_messages: bool | None = None + can_manage_topics: bool | None = None + custom_title: str | None = None class ChatMemberMember(BaseModel): status: Literal["member"] = "member" user: User - until_date: Optional[int] = None + until_date: int | None = None class ChatMemberRestricted(BaseModel): @@ -942,12 +942,12 @@ class ChatInviteLink(BaseModel): creates_join_request: bool is_primary: bool is_revoked: bool - name: Optional[str] = None - expire_date: Optional[int] = None - member_limit: Optional[int] = None - pending_join_request_count: Optional[int] = None - subscription_period: Optional[int] = None - subscription_price: Optional[int] = None + name: str | None = None + expire_date: int | None = None + member_limit: int | None = None + pending_join_request_count: int | None = None + subscription_period: int | None = None + subscription_price: int | None = None class ChatMemberUpdated(BaseModel): @@ -956,9 +956,9 @@ class ChatMemberUpdated(BaseModel): date: int old_chat_member: ChatMember new_chat_member: ChatMember - invite_link: Optional[ChatInviteLink] = None - via_join_request: Optional[bool] = None - via_chat_folder_invite_link: Optional[bool] = None + invite_link: ChatInviteLink | None = None + via_join_request: bool | None = None + via_chat_folder_invite_link: bool | None = None class ChatJoinRequest(BaseModel): @@ -966,8 +966,8 @@ class ChatJoinRequest(BaseModel): from_: User = Field(alias="from") user_chat_id: int date: int - bio: Optional[str] = None - invite_link: Optional[ChatInviteLink] = None + bio: str | None = None + invite_link: ChatInviteLink | None = None class ChatBoostSourcePremium(BaseModel): @@ -983,9 +983,9 @@ class ChatBoostSourceGiftCode(BaseModel): class ChatBoostSourceGiveaway(BaseModel): source: Literal["giveaway"] = "giveaway" giveaway_message_id: int - user: Optional[User] = None - prize_star_count: Optional[int] = None - is_unclaimed: Optional[Literal[True]] = None + user: User | None = None + prize_star_count: int | None = None + is_unclaimed: Literal[True] | None = None ChatBoostSource = Union[ @@ -1014,41 +1014,41 @@ class ChatBoostRemoved(BaseModel): class Update(BaseModel): update_id: int - message: Optional[Message] = None - edited_message: Optional[Message] = None - channel_post: Optional[Message] = None - edited_channel_post: Optional[Message] = None - business_connection: Optional[BusinessConnection] = None - business_message: Optional[Message] = None - edited_business_message: Optional[Message] = None - deleted_business_messages: Optional[BusinessMessagesDeleted] = None - message_reaction: Optional[MessageReactionUpdated] = None - message_reaction_count: Optional[MessageReactionCountUpdated] = None - inline_query: Optional[InlineQuery] = None - chosen_inline_result: Optional[ChosenInlineResult] = None - callback_query: Optional[CallbackQuery] = None - shipping_query: Optional[ShippingQuery] = None - pre_checkout_query: Optional[PreCheckoutQuery] = None - purchased_paid_media: Optional[PaidMediaPurchased] = None - poll: Optional[Poll] = None - poll_answer: Optional[PollAnswer] = None - my_chat_member: Optional[ChatMemberUpdated] = None - chat_member: Optional[ChatMemberUpdated] = None - chat_join_request: Optional[ChatJoinRequest] = None - chat_boost: Optional[ChatBoostUpdated] = None - removed_chat_boost: Optional[ChatBoostRemoved] = None + message: Message | None = None + edited_message: Message | None = None + channel_post: Message | None = None + edited_channel_post: Message | None = None + business_connection: BusinessConnection | None = None + business_message: Message | None = None + edited_business_message: Message | None = None + deleted_business_messages: BusinessMessagesDeleted | None = None + message_reaction: MessageReactionUpdated | None = None + message_reaction_count: MessageReactionCountUpdated | None = None + inline_query: InlineQuery | None = None + chosen_inline_result: ChosenInlineResult | None = None + callback_query: CallbackQuery | None = None + shipping_query: ShippingQuery | None = None + pre_checkout_query: PreCheckoutQuery | None = None + purchased_paid_media: PaidMediaPurchased | None = None + poll: Poll | None = None + poll_answer: PollAnswer | None = None + my_chat_member: ChatMemberUpdated | None = None + chat_member: ChatMemberUpdated | None = None + chat_join_request: ChatJoinRequest | None = None + chat_boost: ChatBoostUpdated | None = None + removed_chat_boost: ChatBoostRemoved | None = None class WebhookInfo(BaseModel): url: str has_custom_certificate: bool pending_update_count: int - ip_address: Optional[str] = None - last_error_date: Optional[int] = None - last_error_message: Optional[str] = None - last_synchronization_error_date: Optional[int] = None - max_connections: Optional[int] = None - allowed_updates: Optional[list[str]] = None + ip_address: str | None = None + last_error_date: int | None = None + last_error_message: str | None = None + last_synchronization_error_date: int | None = None + max_connections: int | None = None + allowed_updates: list[str] | None = None class ChatPhoto(BaseModel): @@ -1061,18 +1061,18 @@ class ChatPhoto(BaseModel): class Birthdate(BaseModel): day: int month: int - year: Optional[int] = None + year: int | None = None class BusinessIntro(BaseModel): - title: Optional[str] = None - message: Optional[str] = None - sticker: Optional[Sticker] = None + title: str | None = None + message: str | None = None + sticker: Sticker | None = None class BusinessLocation(BaseModel): address: str - location: Optional[Location] = None + location: Location | None = None class BusinessOpeningHoursInterval(BaseModel): @@ -1086,20 +1086,20 @@ class BusinessOpeningHours(BaseModel): class ChatPermissions(BaseModel): - can_send_messages: Optional[bool] = None - can_send_audios: Optional[bool] = None - can_send_documents: Optional[bool] = None - can_send_photos: Optional[bool] = None - can_send_videos: Optional[bool] = None - can_send_video_notes: Optional[bool] = None - can_send_voice_notes: Optional[bool] = None - can_send_polls: Optional[bool] = None - can_send_other_messages: Optional[bool] = None - can_add_web_page_previews: Optional[bool] = None - can_change_info: Optional[bool] = None - can_invite_users: Optional[bool] = None - can_pin_messages: Optional[bool] = None - can_manage_topics: Optional[bool] = None + can_send_messages: bool | None = None + can_send_audios: bool | None = None + can_send_documents: bool | None = None + can_send_photos: bool | None = None + can_send_videos: bool | None = None + can_send_video_notes: bool | None = None + can_send_voice_notes: bool | None = None + can_send_polls: bool | None = None + can_send_other_messages: bool | None = None + can_add_web_page_previews: bool | None = None + can_change_info: bool | None = None + can_invite_users: bool | None = None + can_pin_messages: bool | None = None + can_manage_topics: bool | None = None class ChatLocation(BaseModel): @@ -1110,48 +1110,48 @@ class ChatLocation(BaseModel): class ChatFullInfo(BaseModel): id: int type: Literal["private", "group", "supergroup", "channel"] - title: Optional[str] = None - username: Optional[str] = None - first_name: Optional[str] = None - last_name: Optional[str] = None - is_forum: Optional[Literal[True]] = None + title: str | None = None + username: str | None = None + first_name: str | None = None + last_name: str | None = None + is_forum: Literal[True] | None = None accent_color_id: int max_reaction_count: int - photo: Optional[ChatPhoto] = None - active_usernames: Optional[list[str]] = None - birthdate: Optional[Birthdate] = None - business_intro: Optional[BusinessIntro] = None - business_location: Optional[BusinessLocation] = None - business_opening_hours: Optional[BusinessOpeningHours] = None - personal_chat: Optional[Chat] = None - available_reactions: Optional[list[ReactionType]] = None - background_custom_emoji_id: Optional[str] = None - profile_accent_color_id: Optional[int] = None - profile_background_custom_emoji_id: Optional[str] = None - emoji_status_custom_emoji_id: Optional[str] = None - emoji_status_expiration_date: Optional[int] = None - bio: Optional[str] = None - has_private_forwards: Optional[Literal[True]] = None - has_restricted_voice_and_video_messages: Optional[Literal[True]] = None - join_to_send_messages: Optional[Literal[True]] = None - join_by_request: Optional[Literal[True]] = None - description: Optional[str] = None - invite_link: Optional[str] = None + photo: ChatPhoto | None = None + active_usernames: list[str] | None = None + birthdate: Birthdate | None = None + business_intro: BusinessIntro | None = None + business_location: BusinessLocation | None = None + business_opening_hours: BusinessOpeningHours | None = None + personal_chat: Chat | None = None + available_reactions: list[ReactionType] | None = None + background_custom_emoji_id: str | None = None + profile_accent_color_id: int | None = None + profile_background_custom_emoji_id: str | None = None + emoji_status_custom_emoji_id: str | None = None + emoji_status_expiration_date: int | None = None + bio: str | None = None + has_private_forwards: Literal[True] | None = None + has_restricted_voice_and_video_messages: Literal[True] | None = None + join_to_send_messages: Literal[True] | None = None + join_by_request: Literal[True] | None = None + description: str | None = None + invite_link: str | None = None pinned_message: Optional["Message"] = None - permissions: Optional[ChatPermissions] = None - can_send_paid_media: Optional[Literal[True]] = None - slow_mode_delay: Optional[int] = None - unrestrict_boost_count: Optional[int] = None - message_auto_delete_time: Optional[int] = None - has_aggressive_anti_spam_enabled: Optional[Literal[True]] = None - has_hidden_members: Optional[Literal[True]] = None - has_protected_content: Optional[Literal[True]] = None - has_visible_history: Optional[Literal[True]] = None - sticker_set_name: Optional[str] = None - can_set_sticker_set: Optional[Literal[True]] = None - custom_emoji_sticker_set_name: Optional[str] = None - linked_chat_id: Optional[int] = None - location: Optional[ChatLocation] = None + permissions: ChatPermissions | None = None + can_send_paid_media: Literal[True] | None = None + slow_mode_delay: int | None = None + unrestrict_boost_count: int | None = None + message_auto_delete_time: int | None = None + has_aggressive_anti_spam_enabled: Literal[True] | None = None + has_hidden_members: Literal[True] | None = None + has_protected_content: Literal[True] | None = None + has_visible_history: Literal[True] | None = None + sticker_set_name: str | None = None + can_set_sticker_set: Literal[True] | None = None + custom_emoji_sticker_set_name: str | None = None + linked_chat_id: int | None = None + location: ChatLocation | None = None class MessageId(BaseModel): @@ -1160,18 +1160,18 @@ class MessageId(BaseModel): class ReplyParameters(BaseModel): message_id: int - chat_id: Optional[Union[int, str]] = None - allow_sending_without_reply: Optional[bool] = None - quote: Optional[str] = None - quote_parse_mode: Optional[Literal["MarkdownV2", "HTML"]] = None - quote_entities: Optional[list[MessageEntity]] = None - quote_position: Optional[int] = None + chat_id: int | str | None = None + allow_sending_without_reply: bool | None = None + quote: str | None = None + quote_parse_mode: Literal["MarkdownV2", "HTML"] | None = None + quote_entities: list[MessageEntity] | None = None + quote_position: int | None = None class InputPollOption(BaseModel): text: str - text_parse_mode: Optional[str] = None - text_entities: Optional[list[MessageEntity]] = None + text_parse_mode: str | None = None + text_entities: list[MessageEntity] | None = None class UserProfilePhotos(BaseModel): @@ -1181,12 +1181,12 @@ class UserProfilePhotos(BaseModel): class KeyboardButtonRequestUsers(BaseModel): request_id: int - user_is_bot: Optional[bool] = None - user_is_premium: Optional[bool] = None - max_quantity: Optional[int] = None - request_name: Optional[bool] = None - request_username: Optional[bool] = None - request_photo: Optional[bool] = None + user_is_bot: bool | None = None + user_is_premium: bool | None = None + max_quantity: int | None = None + request_name: bool | None = None + request_username: bool | None = None + request_photo: bool | None = None class ChatAdministratorRights(BaseModel): @@ -1201,65 +1201,65 @@ class ChatAdministratorRights(BaseModel): can_post_stories: bool can_edit_stories: bool can_delete_stories: bool - can_post_messages: Optional[bool] = None - can_edit_messages: Optional[bool] = None - can_pin_messages: Optional[bool] = None - can_manage_topics: Optional[bool] = None + can_post_messages: bool | None = None + can_edit_messages: bool | None = None + can_pin_messages: bool | None = None + can_manage_topics: bool | None = None class KeyboardButtonRequestChat(BaseModel): request_id: int chat_is_channel: bool - chat_is_forum: Optional[bool] = None - chat_has_username: Optional[bool] = None - chat_is_created: Optional[bool] = None - user_administrator_rights: Optional[ChatAdministratorRights] = None - bot_administrator_rights: Optional[ChatAdministratorRights] = None - bot_is_member: Optional[bool] = None - request_title: Optional[bool] = None - request_username: Optional[bool] = None - request_photo: Optional[bool] = None + chat_is_forum: bool | None = None + chat_has_username: bool | None = None + chat_is_created: bool | None = None + user_administrator_rights: ChatAdministratorRights | None = None + bot_administrator_rights: ChatAdministratorRights | None = None + bot_is_member: bool | None = None + request_title: bool | None = None + request_username: bool | None = None + request_photo: bool | None = None class KeyboardButtonPollType(BaseModel): - type: Optional[str] = None + type: str | None = None class KeyboardButton(BaseModel): text: str - request_users: Optional[KeyboardButtonRequestUsers] = None - request_chat: Optional[KeyboardButtonRequestChat] = None - request_contact: Optional[bool] = None - request_location: Optional[bool] = None - request_poll: Optional[KeyboardButtonPollType] = None - web_app: Optional[WebAppInfo] = None + request_users: KeyboardButtonRequestUsers | None = None + request_chat: KeyboardButtonRequestChat | None = None + request_contact: bool | None = None + request_location: bool | None = None + request_poll: KeyboardButtonPollType | None = None + web_app: WebAppInfo | None = None class ReplyKeyboardMarkup(BaseModel): keyboard: list[list[KeyboardButton]] - is_persistent: Optional[bool] = None - resize_keyboard: Optional[bool] = None - one_time_keyboard: Optional[bool] = None - input_field_placeholder: Optional[str] = None - selective: Optional[bool] = None + is_persistent: bool | None = None + resize_keyboard: bool | None = None + one_time_keyboard: bool | None = None + input_field_placeholder: str | None = None + selective: bool | None = None class ReplyKeyboardRemove(BaseModel): remove_keyboard: Literal[True] - selective: Optional[bool] = None + selective: bool | None = None class ForceReply(BaseModel): force_reply: Literal[True] - input_field_placeholder: Optional[str] = None - selective: Optional[bool] = None + input_field_placeholder: str | None = None + selective: bool | None = None class ForumTopic(BaseModel): message_thread_id: int name: str icon_color: int - icon_custom_emoji_id: Optional[str] = None + icon_custom_emoji_id: str | None = None class BotCommand(BaseModel): @@ -1285,17 +1285,17 @@ class BotCommandScopeAllChatAdministrators(BaseModel): class BotCommandScopeChat(BaseModel): type: Literal["chat"] = "chat" - chat_id: Union[int, str] + chat_id: int | str class BotCommandScopeChatAdministrators(BaseModel): type: Literal["chat_administrators"] = "chat_administrators" - chat_id: Union[int, str] + chat_id: int | str class BotCommandScopeChatMember(BaseModel): type: Literal["chat_member"] = "chat_member" - chat_id: Union[int, str] + chat_id: int | str user_id: int @@ -1344,8 +1344,8 @@ class UserChatBoosts(BaseModel): class ResponseParameters(BaseModel): - migrate_to_chat_id: Optional[int] = None - retry_after: Optional[int] = None + migrate_to_chat_id: int | None = None + retry_after: int | None = None InputFile = Union[bytes, tuple[str, bytes]] @@ -1353,62 +1353,62 @@ class ResponseParameters(BaseModel): class InputMediaAnimation(BaseModel): type: Literal["animation"] = "animation" - media: Union[str, InputFile] - thumbnail: Optional[Union[str, InputFile]] = None - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - width: Optional[int] = None - height: Optional[int] = None - duration: Optional[int] = None - has_spoiler: Optional[bool] = None + media: str | InputFile + thumbnail: str | InputFile | None = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + width: int | None = None + height: int | None = None + duration: int | None = None + has_spoiler: bool | None = None class InputMediaDocument(BaseModel): type: Literal["document"] = "document" - media: Union[str, InputFile] - thumbnail: Optional[Union[str, InputFile]] = None - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - disable_content_type_detection: Optional[bool] = None + media: str | InputFile + thumbnail: str | InputFile | None = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + disable_content_type_detection: bool | None = None class InputMediaAudio(BaseModel): type: Literal["audio"] = "audio" - media: Union[str, InputFile] - thumbnail: Optional[Union[str, InputFile]] = None - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - duration: Optional[int] = None - performer: Optional[str] = None - title: Optional[str] = None + media: str | InputFile + thumbnail: str | InputFile | None = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + duration: int | None = None + performer: str | None = None + title: str | None = None class InputMediaPhoto(BaseModel): type: Literal["photo"] = "photo" - media: Union[str, InputFile] - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - show_caption_above_media: Optional[bool] = None - has_spoiler: Optional[bool] = None + media: str | InputFile + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + show_caption_above_media: bool | None = None + has_spoiler: bool | None = None class InputMediaVideo(BaseModel): type: Literal["video"] = "video" - media: Union[str, InputFile] - thumbnail: Optional[Union[str, InputFile]] = None - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - show_caption_above_media: Optional[bool] = None - width: Optional[int] = None - height: Optional[int] = None - duration: Optional[int] = None - supports_streaming: Optional[bool] = None - has_spoiler: Optional[bool] = None + media: str | InputFile + thumbnail: str | InputFile | None = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + show_caption_above_media: bool | None = None + width: int | None = None + height: int | None = None + duration: int | None = None + supports_streaming: bool | None = None + has_spoiler: bool | None = None InputMedia = Union[ @@ -1422,17 +1422,17 @@ class InputMediaVideo(BaseModel): class InputPaidMediaPhoto(BaseModel): type: Literal["photo"] = "photo" - media: Union[str, InputFile] + media: str | InputFile class InputPaidMediaVideo(BaseModel): type: Literal["video"] = "video" - media: Union[str, InputFile] - thumbnail: Optional[Union[str, InputFile]] = None - width: Optional[int] = None - height: Optional[int] = None - duration: Optional[int] = None - supports_streaming: Optional[bool] = None + media: str | InputFile + thumbnail: str | InputFile | None = None + width: int | None = None + height: int | None = None + duration: int | None = None + supports_streaming: bool | None = None InputPaidMedia = Union[InputPaidMediaPhoto, InputPaidMediaVideo] @@ -1443,37 +1443,37 @@ class StickerSet(BaseModel): title: str sticker_type: Literal["regular", "mask", "custom_emoji"] stickers: list[Sticker] - thumbnail: Optional[PhotoSize] = None + thumbnail: PhotoSize | None = None class InputSticker(BaseModel): - sticker: Union[str, InputFile] + sticker: str | InputFile format: Literal["static", "animated", "video"] emoji_list: list[str] - mask_position: Optional[MaskPosition] = None - keywords: Optional[list[str]] = None + mask_position: MaskPosition | None = None + keywords: list[str] | None = None class InlineQueryResultsButton(BaseModel): text: str - web_app: Optional[WebAppInfo] = None - start_parameter: Optional[str] = None + web_app: WebAppInfo | None = None + start_parameter: str | None = None class InputTextMessageContent(BaseModel): message_text: str - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - entities: Optional[list[MessageEntity]] = None - link_preview_options: Optional[LinkPreviewOptions] = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + entities: list[MessageEntity] | None = None + link_preview_options: LinkPreviewOptions | None = None class InputLocationMessageContent(BaseModel): latitude: float longitude: float - horizontal_accuracy: Optional[float] = None - live_period: Optional[int] = None - heading: Optional[int] = None - proximity_alert_radius: Optional[int] = None + horizontal_accuracy: float | None = None + live_period: int | None = None + heading: int | None = None + proximity_alert_radius: int | None = None class InputVenueMessageContent(BaseModel): @@ -1481,17 +1481,17 @@ class InputVenueMessageContent(BaseModel): longitude: float title: str address: str - foursquare_id: Optional[str] = None - foursquare_type: Optional[str] = None - google_place_id: Optional[str] = None - google_place_type: Optional[str] = None + foursquare_id: str | None = None + foursquare_type: str | None = None + google_place_id: str | None = None + google_place_type: str | None = None class InputContactMessageContent(BaseModel): phone_number: str first_name: str - last_name: Optional[str] = None - vcard: Optional[str] = None + last_name: str | None = None + vcard: str | None = None class LabeledPrice(BaseModel): @@ -1503,23 +1503,23 @@ class InputInvoiceMessageContent(BaseModel): title: str description: str payload: str - provider_token: Optional[str] = None + provider_token: str | None = None currency: str prices: list[LabeledPrice] - max_tip_amount: Optional[int] = None - suggested_tip_amounts: Optional[list[int]] = None - provider_data: Optional[str] = None - photo_url: Optional[str] = None - photo_size: Optional[int] = None - photo_width: Optional[int] = None - photo_height: Optional[int] = None - need_name: Optional[bool] = None - need_phone_number: Optional[bool] = None - need_email: Optional[bool] = None - need_shipping_address: Optional[bool] = None - send_phone_number_to_provider: Optional[bool] = None - send_email_to_provider: Optional[bool] = None - is_flexible: Optional[bool] = None + max_tip_amount: int | None = None + suggested_tip_amounts: list[int] | None = None + provider_data: str | None = None + photo_url: str | None = None + photo_size: int | None = None + photo_width: int | None = None + photo_height: int | None = None + need_name: bool | None = None + need_phone_number: bool | None = None + need_email: bool | None = None + need_shipping_address: bool | None = None + send_phone_number_to_provider: bool | None = None + send_email_to_provider: bool | None = None + is_flexible: bool | None = None InputMessageContent = Union[ @@ -1535,11 +1535,11 @@ class InlineQueryResultCachedAudio(BaseModel): type: Literal["audio"] = "audio" id: str audio_file_id: str - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None class InlineQueryResultCachedDocument(BaseModel): @@ -1547,60 +1547,60 @@ class InlineQueryResultCachedDocument(BaseModel): id: str title: str document_file_id: str - description: Optional[str] = None - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + description: str | None = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None class InlineQueryResultCachedGif(BaseModel): type: Literal["gif"] = "gif" id: str gif_file_id: str - title: Optional[str] = None - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - show_caption_above_media: Optional[bool] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + title: str | None = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + show_caption_above_media: bool | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None class InlineQueryResultCachedMpeg4Gif(BaseModel): type: Literal["mpeg4_gif"] = "mpeg4_gif" id: str mpeg4_file_id: str - title: Optional[str] = None - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - show_caption_above_media: Optional[bool] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + title: str | None = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + show_caption_above_media: bool | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None class InlineQueryResultCachedPhoto(BaseModel): type: Literal["photo"] = "photo" id: str photo_file_id: str - title: Optional[str] = None - description: Optional[str] = None - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - show_caption_above_media: Optional[bool] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + title: str | None = None + description: str | None = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + show_caption_above_media: bool | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None class InlineQueryResultCachedSticker(BaseModel): type: Literal["sticker"] = "sticker" id: str sticker_file_id: str - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None class InlineQueryResultCachedVideo(BaseModel): @@ -1608,13 +1608,13 @@ class InlineQueryResultCachedVideo(BaseModel): id: str video_file_id: str title: str - description: Optional[str] = None - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - show_caption_above_media: Optional[bool] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + description: str | None = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + show_caption_above_media: bool | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None class InlineQueryResultCachedVoice(BaseModel): @@ -1622,11 +1622,11 @@ class InlineQueryResultCachedVoice(BaseModel): id: str voice_file_id: str title: str - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None class InlineQueryResultArticle(BaseModel): @@ -1634,13 +1634,13 @@ class InlineQueryResultArticle(BaseModel): id: str title: str input_message_content: InputMessageContent - reply_markup: Optional[InlineKeyboardMarkup] = None - url: Optional[str] = None - hide_url: Optional[bool] = None - description: Optional[str] = None - thumbnail_url: Optional[str] = None - thumbnail_width: Optional[int] = None - thumbnail_height: Optional[int] = None + reply_markup: InlineKeyboardMarkup | None = None + url: str | None = None + hide_url: bool | None = None + description: str | None = None + thumbnail_url: str | None = None + thumbnail_width: int | None = None + thumbnail_height: int | None = None class InlineQueryResultAudio(BaseModel): @@ -1648,13 +1648,13 @@ class InlineQueryResultAudio(BaseModel): id: str audio_url: str title: str - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - performer: Optional[str] = None - audio_duration: Optional[int] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + performer: str | None = None + audio_duration: int | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None class InlineQueryResultContact(BaseModel): @@ -1662,55 +1662,55 @@ class InlineQueryResultContact(BaseModel): id: str phone_number: str first_name: str - last_name: Optional[str] = None - vcard: Optional[str] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None - thumbnail_url: Optional[str] = None - thumbnail_width: Optional[int] = None - thumbnail_height: Optional[int] = None + last_name: str | None = None + vcard: str | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None + thumbnail_url: str | None = None + thumbnail_width: int | None = None + thumbnail_height: int | None = None class InlineQueryResultGame(BaseModel): type: Literal["game"] = "game" id: str game_short_name: str - reply_markup: Optional[InlineKeyboardMarkup] = None + reply_markup: InlineKeyboardMarkup | None = None class InlineQueryResultDocument(BaseModel): type: Literal["document"] = "document" id: str title: str - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None document_url: str mime_type: str - description: Optional[str] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None - thumbnail_url: Optional[str] = None - thumbnail_width: Optional[int] = None - thumbnail_height: Optional[int] = None + description: str | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None + thumbnail_url: str | None = None + thumbnail_width: int | None = None + thumbnail_height: int | None = None class InlineQueryResultGif(BaseModel): type: Literal["gif"] = "gif" id: str gif_url: str - gif_width: Optional[int] = None - gif_height: Optional[int] = None - gif_duration: Optional[int] = None + gif_width: int | None = None + gif_height: int | None = None + gif_duration: int | None = None thumbnail_url: str - thumbnail_mime_type: Optional[str] = None - title: Optional[str] = None - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - show_caption_above_media: Optional[bool] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + thumbnail_mime_type: str | None = None + title: str | None = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + show_caption_above_media: bool | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None class InlineQueryResultLocation(BaseModel): @@ -1719,33 +1719,33 @@ class InlineQueryResultLocation(BaseModel): latitude: float longitude: float title: str - horizontal_accuracy: Optional[float] = None - live_period: Optional[int] = None - heading: Optional[int] = None - proximity_alert_radius: Optional[int] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None - thumbnail_url: Optional[str] = None - thumbnail_width: Optional[int] = None - thumbnail_height: Optional[int] = None + horizontal_accuracy: float | None = None + live_period: int | None = None + heading: int | None = None + proximity_alert_radius: int | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None + thumbnail_url: str | None = None + thumbnail_width: int | None = None + thumbnail_height: int | None = None class InlineQueryResultMpeg4Gif(BaseModel): type: Literal["mpeg4_gif"] = "mpeg4_gif" id: str mpeg4_url: str - mpeg4_width: Optional[int] = None - mpeg4_height: Optional[int] = None - mpeg4_duration: Optional[int] = None + mpeg4_width: int | None = None + mpeg4_height: int | None = None + mpeg4_duration: int | None = None thumbnail_url: str - thumbnail_mime_type: Optional[str] = None - title: Optional[str] = None - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - show_caption_above_media: Optional[bool] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + thumbnail_mime_type: str | None = None + title: str | None = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + show_caption_above_media: bool | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None class InlineQueryResultPhoto(BaseModel): @@ -1753,16 +1753,16 @@ class InlineQueryResultPhoto(BaseModel): id: str photo_url: str thumbnail_url: str - photo_width: Optional[int] = None - photo_height: Optional[int] = None - title: Optional[str] = None - description: Optional[str] = None - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - show_caption_above_media: Optional[bool] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + photo_width: int | None = None + photo_height: int | None = None + title: str | None = None + description: str | None = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + show_caption_above_media: bool | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None class InlineQueryResultVenue(BaseModel): @@ -1772,15 +1772,15 @@ class InlineQueryResultVenue(BaseModel): longitude: float title: str address: str - foursquare_id: Optional[str] = None - foursquare_type: Optional[str] = None - google_place_id: Optional[str] = None - google_place_type: Optional[str] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None - thumbnail_url: Optional[str] = None - thumbnail_width: Optional[int] = None - thumbnail_height: Optional[int] = None + foursquare_id: str | None = None + foursquare_type: str | None = None + google_place_id: str | None = None + google_place_type: str | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None + thumbnail_url: str | None = None + thumbnail_width: int | None = None + thumbnail_height: int | None = None class InlineQueryResultVideo(BaseModel): @@ -1790,16 +1790,16 @@ class InlineQueryResultVideo(BaseModel): mime_type: str thumbnail_url: str title: str - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - show_caption_above_media: Optional[bool] = None - video_width: Optional[int] = None - video_height: Optional[int] = None - video_duration: Optional[int] = None - description: Optional[str] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + show_caption_above_media: bool | None = None + video_width: int | None = None + video_height: int | None = None + video_duration: int | None = None + description: str | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None class InlineQueryResultVoice(BaseModel): @@ -1807,12 +1807,12 @@ class InlineQueryResultVoice(BaseModel): id: str voice_url: str title: str - caption: Optional[str] = None - parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None - caption_entities: Optional[list[MessageEntity]] = None - voice_duration: Optional[int] = None - reply_markup: Optional[InlineKeyboardMarkup] = None - input_message_content: Optional[InputMessageContent] = None + caption: str | None = None + parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None + caption_entities: list[MessageEntity] | None = None + voice_duration: int | None = None + reply_markup: InlineKeyboardMarkup | None = None + input_message_content: InputMessageContent | None = None InlineQueryResult = Union[ @@ -1840,7 +1840,7 @@ class InlineQueryResultVoice(BaseModel): class SentWebAppMessage(BaseModel): - inline_message_id: Optional[str] = None + inline_message_id: str | None = None class ShippingOption(BaseModel): @@ -1873,14 +1873,14 @@ class RevenueWithdrawalStateFailed(BaseModel): class TransactionPartnerUser(BaseModel): type: str user: User - invoice_payload: Optional[str] = None - paid_media: Optional[list[PaidMedia]] = None - paid_media_payload: Optional[str] = None + invoice_payload: str | None = None + paid_media: list[PaidMedia] | None = None + paid_media_payload: str | None = None class TransactionPartnerFragment(BaseModel): type: str - withdrawal_state: Optional[RevenueWithdrawalState] = None + withdrawal_state: RevenueWithdrawalState | None = None class TransactionPartnerTelegramAds(BaseModel): @@ -1909,8 +1909,8 @@ class StarTransaction(BaseModel): id: str amount: int date: int - source: Optional[TransactionPartner] = None - receiver: Optional[TransactionPartner] = None + source: TransactionPartner | None = None + receiver: TransactionPartner | None = None class StarTransactions(BaseModel): From 8b9768e759d3701ac8fa3aa2dea1236fe5fa009d Mon Sep 17 00:00:00 2001 From: shoucandanghehe Date: Thu, 4 Jun 2026 21:56:21 +0800 Subject: [PATCH 3/6] :bug: fix Telegram polling timeout compatibility --- nonebot/adapters/telegram/adapter.py | 14 ++++++++++---- nonebot/adapters/telegram/event.py | 15 +++++++++++---- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/nonebot/adapters/telegram/adapter.py b/nonebot/adapters/telegram/adapter.py index 5ee3875..70be3a4 100644 --- a/nonebot/adapters/telegram/adapter.py +++ b/nonebot/adapters/telegram/adapter.py @@ -39,7 +39,7 @@ class Adapter(BaseAdapter): def __init__(self, driver: Driver, **kwargs: Any): super().__init__(driver, **kwargs) self.adapter_config = AdapterConfig(**self.config.model_dump()) - self.tasks: list[asyncio.Task] = [] + self.tasks: set[asyncio.Task] = set() self.setup() @classmethod @@ -98,11 +98,13 @@ async def poll(self, bot: Bot): if update_offset is not None: for update in updates: update_offset = update.update_id + 1 - asyncio.create_task( + task = asyncio.create_task( self.__handle_update( bot, update.model_dump(by_alias=True, exclude_none=True) ) ) + self.tasks.add(task) + task.add_done_callback(self.tasks.discard) elif updates: update_offset = updates[0].update_id except Exception as e: @@ -112,7 +114,9 @@ async def poll(self, bot: Bot): def setup_polling(self, bot: Bot): @self.on_ready async def _(): - self.tasks.append(asyncio.create_task(self.poll(bot))) + task = asyncio.create_task(self.poll(bot)) + self.tasks.add(task) + task.add_done_callback(self.tasks.discard) @self.driver.on_shutdown async def _(): @@ -128,7 +132,9 @@ async def handle_http(self, request: Request) -> Response: if bot.secret_token == token: if request.content: update: dict = json.loads(request.content) - asyncio.create_task(self.__handle_update(bot, update)) + task = asyncio.create_task(self.__handle_update(bot, update)) + self.tasks.add(task) + task.add_done_callback(self.tasks.discard) return Response(204) return Response(401) diff --git a/nonebot/adapters/telegram/event.py b/nonebot/adapters/telegram/event.py index 59f12fb..fa85a49 100644 --- a/nonebot/adapters/telegram/event.py +++ b/nonebot/adapters/telegram/event.py @@ -37,7 +37,7 @@ class EventWithChat(Protocol): class Event(BaseEvent): - telegram_model: Update = Field(default=None) + telegram_model: Update | None = Field(default=None) @classmethod def __parse_event(cls, obj: dict) -> "Event": @@ -362,7 +362,7 @@ def get_event_description(self) -> str: class GroupEditedMessageEvent(EditedMessageEvent): - from_: User = Field(default=None, alias="from") + from_: User | None = Field(default=None, alias="from") sender_chat: Chat | None = None @classmethod @@ -380,14 +380,17 @@ def get_event_name(self) -> str: @override def get_user_id(self) -> str: + assert self.from_ is not None return str(self.from_.id) @override def get_session_id(self) -> str: + assert self.from_ is not None return f"group_{self.chat.id}_{self.from_.id}" @override def get_event_description(self) -> str: + assert self.from_ is not None return ( f"EditedMessage {self.message_id} from {self.from_.id}" f"@[Chat {self.chat.id}]: {self.get_message_description()}" @@ -403,10 +406,12 @@ def get_event_name(self) -> str: @override def get_session_id(self) -> str: + assert self.from_ is not None return f"group_{self.chat.id}_thread{self.message_thread_id}_{self.from_.id}" @override def get_event_description(self) -> str: + assert self.from_ is not None return ( f"EditedMessage {self.message_id} from {self.from_.id}@[Chat {self.chat.id}" f" Thread {self.message_thread_id}]: {self.get_message_description()}" @@ -470,7 +475,7 @@ class PinnedMessageEvent(NoticeEvent): sender_chat: Chat | None = None chat: Chat date: int - pinned_message: MessageEvent = Field(default=None) + pinned_message: MessageEvent | None = Field(default=None) @classmethod def __parse_event(cls, obj: dict): @@ -485,10 +490,12 @@ def get_event_name(self) -> str: @override def get_message(self) -> Message: + assert self.pinned_message is not None return self.pinned_message.get_message() @override def get_event_description(self) -> str: + assert self.pinned_message is not None return ( f"PinnedMessage {self.pinned_message.message_id} " f"@[Chat {self.pinned_message.chat.id}]: {self.get_message_description()}" @@ -705,7 +712,7 @@ def get_event_description(self) -> str: class CallbackQueryEvent(InlineEvent, CallbackQuery): - chat: Chat = Field(default=None) + chat: Chat | None = Field(default=None) @override def get_event_name(self) -> str: From 2229864c493f1ce7e27f31d5255affc7d32b6bf9 Mon Sep 17 00:00:00 2001 From: shoucandanghehe Date: Thu, 4 Jun 2026 22:08:10 +0800 Subject: [PATCH 4/6] :bug: keep Telegram polling timeout fix focused --- nonebot/adapters/telegram/adapter.py | 8 +- nonebot/adapters/telegram/api.py | 1224 +++++++++++----------- nonebot/adapters/telegram/bot.py | 30 +- nonebot/adapters/telegram/config.py | 6 +- nonebot/adapters/telegram/event.py | 70 +- nonebot/adapters/telegram/exception.py | 6 +- nonebot/adapters/telegram/message.py | 70 +- nonebot/adapters/telegram/model.py | 1318 ++++++++++++------------ pyproject.toml | 6 +- 9 files changed, 1390 insertions(+), 1348 deletions(-) diff --git a/nonebot/adapters/telegram/adapter.py b/nonebot/adapters/telegram/adapter.py index 70be3a4..3efbae6 100644 --- a/nonebot/adapters/telegram/adapter.py +++ b/nonebot/adapters/telegram/adapter.py @@ -1,8 +1,8 @@ import json import asyncio -from typing import Any, cast from collections.abc import Iterable from typing_extensions import override +from typing import Any, Union, Optional, cast import anyio from pydantic.main import BaseModel @@ -169,7 +169,7 @@ async def _call_api(self, bot: Bot, api: str, **data) -> Any: request_timeout = UNSET if api == "getUpdates": timeout = data.get("timeout") - if not isinstance(timeout, bool) and isinstance(timeout, int | float): + if not isinstance(timeout, bool) and isinstance(timeout, (int, float)): # Telegram timeout is server-side long polling; the HTTP read # timeout must be slightly longer. request_timeout = Timeout( @@ -183,7 +183,7 @@ async def _call_api(self, bot: Bot, api: str, **data) -> Any: files: dict[str, tuple[str, bytes]] = {} bytes_upload_count = 0 - async def process_input_file(file: InputFile | str) -> str | None: + async def process_input_file(file: Union[InputFile, str]) -> Optional[str]: """处理传过来的文件,如果文件被添加到 files 列表则返回文件名""" nonlocal bytes_upload_count filename = None @@ -232,7 +232,7 @@ async def process_input_file(file: InputFile | str) -> str | None: ): type = api[4:].lower() for key in (type, "thumbnail"): - value = cast(str | bytes | None, data.pop(key, None)) + value = cast(Optional[Union[str, bytes]], data.pop(key, None)) if value: filename = await process_input_file(value) data[key] = f"attach://{filename}" if filename else value diff --git a/nonebot/adapters/telegram/api.py b/nonebot/adapters/telegram/api.py index fe598ee..263b3e8 100644 --- a/nonebot/adapters/telegram/api.py +++ b/nonebot/adapters/telegram/api.py @@ -1,4 +1,4 @@ -from typing import Literal +from typing import Union, Literal, Optional from .model import ( File, @@ -57,25 +57,25 @@ class API: async def get_updates( self, - offset: int | None = None, - limit: int | None = None, - timeout: int | None = None, - allowed_updates: list[str] | None = None, + offset: Optional[int] = None, + limit: Optional[int] = None, + timeout: Optional[int] = None, + allowed_updates: Optional[list[str]] = None, ) -> list[Update]: ... async def set_webhook( self, url: str, - certificate: InputFile | None = None, - ip_address: str | None = None, - max_connections: int | None = None, - allowed_updates: list[str] | None = None, - drop_pending_updates: bool | None = None, - secret_token: str | None = None, + certificate: Optional[InputFile] = None, + ip_address: Optional[str] = None, + max_connections: Optional[int] = None, + allowed_updates: Optional[list[str]] = None, + drop_pending_updates: Optional[bool] = None, + secret_token: Optional[str] = None, ) -> Literal[True]: ... async def delete_webhook( - self, drop_pending_updates: bool | None = None + self, drop_pending_updates: Optional[bool] = None ) -> Literal[True]: ... async def get_webhook_info(self) -> WebhookInfo: ... @@ -95,433 +95,450 @@ async def close(self) -> Literal[True]: ... async def send_message( self, - chat_id: int | str, + chat_id: Union[int, str], text: str, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, - entities: list[MessageEntity] | None = None, - link_preview_options: LinkPreviewOptions | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, + entities: Optional[list[MessageEntity]] = None, + link_preview_options: Optional[LinkPreviewOptions] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def forward_message( self, - chat_id: int | str, - from_chat_id: int | str, + chat_id: Union[int, str], + from_chat_id: Union[int, str], message_id: int, - message_thread_id: int | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, + message_thread_id: Optional[int] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, ) -> Message: ... async def forward_messages( self, - chat_id: int | str, - from_chat_id: int | str, + chat_id: Union[int, str], + from_chat_id: Union[int, str], message_ids: list[int], - message_thread_id: int | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, + message_thread_id: Optional[int] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, ) -> list[MessageId]: ... async def copy_message( self, - chat_id: int | str, - from_chat_id: int | str, + chat_id: Union[int, str], + from_chat_id: Union[int, str], message_id: int, - message_thread_id: int | None = None, - caption: str | None = None, - parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, - caption_entities: list[MessageEntity] | None = None, - show_caption_above_media: bool | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + message_thread_id: Optional[int] = None, + caption: Optional[str] = None, + parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, + caption_entities: Optional[list[MessageEntity]] = None, + show_caption_above_media: Optional[bool] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> MessageId: ... async def copy_messages( self, - chat_id: int | str, - from_chat_id: int | str, + chat_id: Union[int, str], + from_chat_id: Union[int, str], message_ids: list[int], - message_thread_id: int | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - remove_caption: bool | None = None, + message_thread_id: Optional[int] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + remove_caption: Optional[bool] = None, ) -> list[MessageId]: ... async def send_photo( self, - chat_id: int | str, - photo: str | InputFile, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - caption: str | None = None, - parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, - caption_entities: list[MessageEntity] | None = None, - show_caption_above_media: bool | None = None, - has_spoiler: bool | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + chat_id: Union[int, str], + photo: Union[str, InputFile], + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + caption: Optional[str] = None, + parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, + caption_entities: Optional[list[MessageEntity]] = None, + show_caption_above_media: Optional[bool] = None, + has_spoiler: Optional[bool] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def send_audio( self, - chat_id: int | str, - audio: str | InputFile, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - caption: str | None = None, - parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, - caption_entities: list[MessageEntity] | None = None, - duration: int | None = None, - performer: str | None = None, - title: str | None = None, - thumbnail: str | InputFile | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + chat_id: Union[int, str], + audio: Union[str, InputFile], + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + caption: Optional[str] = None, + parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, + caption_entities: Optional[list[MessageEntity]] = None, + duration: Optional[int] = None, + performer: Optional[str] = None, + title: Optional[str] = None, + thumbnail: Optional[Union[str, InputFile]] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def send_document( self, - chat_id: int | str, - document: str | InputFile, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - thumbnail: str | InputFile | None = None, - caption: str | None = None, - parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, - caption_entities: list[MessageEntity] | None = None, - disable_content_type_detection: bool | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + chat_id: Union[int, str], + document: Union[str, InputFile], + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + thumbnail: Optional[Union[str, InputFile]] = None, + caption: Optional[str] = None, + parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, + caption_entities: Optional[list[MessageEntity]] = None, + disable_content_type_detection: Optional[bool] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def send_video( self, - chat_id: int | str, - video: str | InputFile, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - duration: int | None = None, - width: int | None = None, - height: int | None = None, - thumbnail: str | InputFile | None = None, - caption: str | None = None, - parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, - caption_entities: list[MessageEntity] | None = None, - show_caption_above_media: bool | None = None, - has_spoiler: bool | None = None, - supports_streaming: bool | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + chat_id: Union[int, str], + video: Union[str, InputFile], + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + duration: Optional[int] = None, + width: Optional[int] = None, + height: Optional[int] = None, + thumbnail: Optional[Union[str, InputFile]] = None, + caption: Optional[str] = None, + parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, + caption_entities: Optional[list[MessageEntity]] = None, + show_caption_above_media: Optional[bool] = None, + has_spoiler: Optional[bool] = None, + supports_streaming: Optional[bool] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def send_animation( self, - chat_id: int | str, - animation: str | InputFile, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - duration: int | None = None, - width: int | None = None, - height: int | None = None, - thumbnail: str | InputFile | None = None, - caption: str | None = None, - parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, - caption_entities: list[MessageEntity] | None = None, - show_caption_above_media: bool | None = None, - has_spoiler: bool | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + chat_id: Union[int, str], + animation: Union[str, InputFile], + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + duration: Optional[int] = None, + width: Optional[int] = None, + height: Optional[int] = None, + thumbnail: Optional[Union[str, InputFile]] = None, + caption: Optional[str] = None, + parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, + caption_entities: Optional[list[MessageEntity]] = None, + show_caption_above_media: Optional[bool] = None, + has_spoiler: Optional[bool] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def send_voice( self, - chat_id: int | str, - voice: str | InputFile, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - caption: str | None = None, - parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, - caption_entities: list[MessageEntity] | None = None, - duration: int | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + chat_id: Union[int, str], + voice: Union[str, InputFile], + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + caption: Optional[str] = None, + parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, + caption_entities: Optional[list[MessageEntity]] = None, + duration: Optional[int] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def send_video_note( self, - chat_id: int | str, - video_note: str | InputFile, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - duration: int | None = None, - length: int | None = None, - thumbnail: str | InputFile | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + chat_id: Union[int, str], + video_note: Union[str, InputFile], + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + duration: Optional[int] = None, + length: Optional[int] = None, + thumbnail: Optional[Union[str, InputFile]] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def send_paid_media( self, - chat_id: int | str, + chat_id: Union[int, str], star_count: int, media: list[InputPaidMedia], - business_connection_id: str | None = None, - payload: str | None = None, - caption: str | None = None, - parse_mode: str | None = None, - caption_entities: list[MessageEntity] | None = None, - show_caption_above_media: bool | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + business_connection_id: Optional[str] = None, + payload: Optional[str] = None, + caption: Optional[str] = None, + parse_mode: Optional[str] = None, + caption_entities: Optional[list[MessageEntity]] = None, + show_caption_above_media: Optional[bool] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def send_media_group( self, - chat_id: int | str, + chat_id: Union[int, str], media: list[ - InputMediaAudio | InputMediaDocument | InputMediaPhoto | InputMediaVideo + Union[InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo] ], - business_connection_id: str | None = None, - message_thread_id: int | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, ) -> list[Message]: ... async def send_location( self, - chat_id: int | str, + chat_id: Union[int, str], latitude: float, longitude: float, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - horizontal_accuracy: float | None = None, - live_period: int | None = None, - heading: int | None = None, - proximity_alert_radius: int | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + horizontal_accuracy: Optional[float] = None, + live_period: Optional[int] = None, + heading: Optional[int] = None, + proximity_alert_radius: Optional[int] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def send_venue( self, - chat_id: int | str, + chat_id: Union[int, str], latitude: float, longitude: float, title: str, address: str, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - foursquare_id: str | None = None, - foursquare_type: str | None = None, - google_place_id: str | None = None, - google_place_type: str | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + foursquare_id: Optional[str] = None, + foursquare_type: Optional[str] = None, + google_place_id: Optional[str] = None, + google_place_type: Optional[str] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def send_contact( self, - chat_id: int | str, + chat_id: Union[int, str], phone_number: str, first_name: str, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - last_name: str | None = None, - vcard: str | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + last_name: Optional[str] = None, + vcard: Optional[str] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def send_poll( self, - chat_id: int | str, + chat_id: Union[int, str], question: str, options: list[InputPollOption], - business_connection_id: str | None = None, - message_thread_id: int | None = None, - question_parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, - question_entities: list[MessageEntity] | None = None, - is_anonymous: bool | None = None, - type: Literal["quiz", "regular"] | None = None, - allows_multiple_answers: bool | None = None, - correct_option_id: int | None = None, - explanation: str | None = None, - explanation_parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, - explanation_entities: list[MessageEntity] | None = None, - open_period: int | None = None, - close_date: int | None = None, - is_closed: bool | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + question_parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, + question_entities: Optional[list[MessageEntity]] = None, + is_anonymous: Optional[bool] = None, + type: Optional[Literal["quiz", "regular"]] = None, + allows_multiple_answers: Optional[bool] = None, + correct_option_id: Optional[int] = None, + explanation: Optional[str] = None, + explanation_parse_mode: Optional[ + Literal["MarkdownV2", "Markdown", "HTML"] + ] = None, + explanation_entities: Optional[list[MessageEntity]] = None, + open_period: Optional[int] = None, + close_date: Optional[int] = None, + is_closed: Optional[bool] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def send_dice( self, - chat_id: int | str, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - emoji: Literal["🎲", "🎯", "🏀", "⚽", "🎳", "🎰"] | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + chat_id: Union[int, str], + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + emoji: Optional[Literal["🎲", "🎯", "🏀", "⚽", "🎳", "🎰"]] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def send_chat_action( self, - chat_id: int | str, + chat_id: Union[int, str], action: Literal[ "typing", "upload_photo", @@ -535,237 +552,255 @@ async def send_chat_action( "record_video_note", "upload_video_note", ], - business_connection_id: str | None = None, - message_thread_id: int | None = None, + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, ) -> Literal[True]: ... async def set_message_reaction( self, - chat_id: int | str, + chat_id: Union[int, str], message_id: int, - reaction: list[ReactionType] | None = None, - is_big: bool | None = None, + reaction: Optional[list[ReactionType]] = None, + is_big: Optional[bool] = None, ) -> Literal[True]: ... async def get_user_profile_photos( - self, user_id: int, offset: int | None = None, limit: int | None = None + self, user_id: int, offset: Optional[int] = None, limit: Optional[int] = None ) -> UserProfilePhotos: ... async def get_file(self, file_id: str) -> File: ... async def ban_chat_member( self, - chat_id: int | str, + chat_id: Union[int, str], user_id: int, - until_date: int | None = None, - revoke_messages: bool | None = None, + until_date: Optional[int] = None, + revoke_messages: Optional[bool] = None, ) -> Literal[True]: ... async def unban_chat_member( self, - chat_id: int | str, + chat_id: Union[int, str], user_id: int, - only_if_banned: bool | None = None, + only_if_banned: Optional[bool] = None, ) -> Literal[True]: ... async def restrict_chat_member( self, - chat_id: int | str, + chat_id: Union[int, str], user_id: int, permissions: ChatPermissions, - use_independent_chat_permissions: bool | None = None, - until_date: int | None = None, + use_independent_chat_permissions: Optional[bool] = None, + until_date: Optional[int] = None, ) -> Literal[True]: ... async def promote_chat_member( self, - chat_id: int | str, + chat_id: Union[int, str], user_id: int, - is_anonymous: bool | None = None, - can_manage_chat: bool | None = None, - can_delete_messages: bool | None = None, - can_manage_video_chats: bool | None = None, - can_restrict_members: bool | None = None, - can_promote_members: bool | None = None, - can_change_info: bool | None = None, - can_invite_users: bool | None = None, - can_post_stories: bool | None = None, - can_edit_stories: bool | None = None, - can_delete_stories: bool | None = None, - can_post_messages: bool | None = None, - can_edit_messages: bool | None = None, - can_pin_messages: bool | None = None, - can_manage_topics: bool | None = None, + is_anonymous: Optional[bool] = None, + can_manage_chat: Optional[bool] = None, + can_delete_messages: Optional[bool] = None, + can_manage_video_chats: Optional[bool] = None, + can_restrict_members: Optional[bool] = None, + can_promote_members: Optional[bool] = None, + can_change_info: Optional[bool] = None, + can_invite_users: Optional[bool] = None, + can_post_stories: Optional[bool] = None, + can_edit_stories: Optional[bool] = None, + can_delete_stories: Optional[bool] = None, + can_post_messages: Optional[bool] = None, + can_edit_messages: Optional[bool] = None, + can_pin_messages: Optional[bool] = None, + can_manage_topics: Optional[bool] = None, ) -> Literal[True]: ... async def set_chat_administrator_custom_title( - self, chat_id: int | str, user_id: int, custom_title: str + self, chat_id: Union[int, str], user_id: int, custom_title: str ) -> Literal[True]: ... async def ban_chat_sender_chat( - self, chat_id: int | str, sender_chat_id: int + self, chat_id: Union[int, str], sender_chat_id: int ) -> Literal[True]: ... async def unban_chat_sender_chat( - self, chat_id: int | str, sender_chat_id: int + self, chat_id: Union[int, str], sender_chat_id: int ) -> Literal[True]: ... async def set_chat_permissions( self, - chat_id: int | str, + chat_id: Union[int, str], permissions: ChatPermissions, - use_independent_chat_permissions: bool | None = None, + use_independent_chat_permissions: Optional[bool] = None, ) -> Literal[True]: ... - async def export_chat_invite_link(self, chat_id: int | str) -> str: ... + async def export_chat_invite_link(self, chat_id: Union[int, str]) -> str: ... async def create_chat_invite_link( self, - chat_id: int | str, - name: str | None = None, - expire_date: int | None = None, - member_limit: int | None = None, - creates_join_request: bool | None = None, + chat_id: Union[int, str], + name: Optional[str] = None, + expire_date: Optional[int] = None, + member_limit: Optional[int] = None, + creates_join_request: Optional[bool] = None, ) -> ChatInviteLink: ... async def edit_chat_invite_link( self, - chat_id: int | str, + chat_id: Union[int, str], invite_link: str, - name: str | None = None, - expire_date: int | None = None, - member_limit: int | None = None, - creates_join_request: bool | None = None, + name: Optional[str] = None, + expire_date: Optional[int] = None, + member_limit: Optional[int] = None, + creates_join_request: Optional[bool] = None, ) -> ChatInviteLink: ... async def create_chat_subscription_invite_link( self, - chat_id: int | str, + chat_id: Union[int, str], subscription_period: int, subscription_price: int, - name: str | None = None, + name: Optional[str] = None, ) -> ChatInviteLink: ... async def edit_chat_subscription_invite_link( - self, chat_id: int | str, invite_link: str, name: str | None = None + self, chat_id: Union[int, str], invite_link: str, name: Optional[str] = None ) -> ChatInviteLink: ... async def revoke_chat_invite_link( - self, chat_id: int | str, invite_link: str + self, chat_id: Union[int, str], invite_link: str ) -> ChatInviteLink: ... async def approve_chat_join_request( - self, chat_id: int | str, user_id: int + self, chat_id: Union[int, str], user_id: int ) -> Literal[True]: ... async def decline_chat_join_request( - self, chat_id: int | str, user_id: int + self, chat_id: Union[int, str], user_id: int ) -> Literal[True]: ... async def set_chat_photo( - self, chat_id: int | str, photo: InputFile + self, chat_id: Union[int, str], photo: InputFile ) -> Literal[True]: ... - async def delete_chat_photo(self, chat_id: int | str) -> Literal[True]: ... + async def delete_chat_photo(self, chat_id: Union[int, str]) -> Literal[True]: ... - async def set_chat_title(self, chat_id: int | str, title: str) -> Literal[True]: ... + async def set_chat_title( + self, chat_id: Union[int, str], title: str + ) -> Literal[True]: ... async def set_chat_description( - self, chat_id: int | str, description: str | None = None + self, chat_id: Union[int, str], description: Optional[str] = None ) -> Literal[True]: ... async def pin_chat_message( self, - chat_id: int | str, + chat_id: Union[int, str], message_id: int, - business_connection_id: str | None = None, - disable_notification: bool | None = None, + business_connection_id: Optional[str] = None, + disable_notification: Optional[bool] = None, ) -> Literal[True]: ... async def unpin_chat_message( self, - chat_id: int | str, - business_connection_id: str | None = None, - message_id: int | None = None, + chat_id: Union[int, str], + business_connection_id: Optional[str] = None, + message_id: Optional[int] = None, ) -> Literal[True]: ... - async def unpin_all_chat_messages(self, chat_id: int | str) -> Literal[True]: ... + async def unpin_all_chat_messages( + self, chat_id: Union[int, str] + ) -> Literal[True]: ... - async def leave_chat(self, chat_id: int | str) -> Literal[True]: ... + async def leave_chat(self, chat_id: Union[int, str]) -> Literal[True]: ... - async def get_chat(self, chat_id: int | str) -> ChatFullInfo: ... + async def get_chat(self, chat_id: Union[int, str]) -> ChatFullInfo: ... - async def get_chat_administrators(self, chat_id: int | str) -> list[ChatMember]: ... + async def get_chat_administrators( + self, chat_id: Union[int, str] + ) -> list[ChatMember]: ... - async def get_chat_member_count(self, chat_id: int | str) -> int: ... + async def get_chat_member_count(self, chat_id: Union[int, str]) -> int: ... - async def get_chat_member(self, chat_id: int | str, user_id: int) -> ChatMember: ... + async def get_chat_member( + self, chat_id: Union[int, str], user_id: int + ) -> ChatMember: ... async def set_chat_sticker_set( - self, chat_id: int | str, sticker_set_name: str + self, chat_id: Union[int, str], sticker_set_name: str ) -> Literal[True]: ... - async def delete_chat_sticker_set(self, chat_id: int | str) -> Literal[True]: ... + async def delete_chat_sticker_set( + self, chat_id: Union[int, str] + ) -> Literal[True]: ... async def get_forum_topic_icon_stickers(self) -> list[Sticker]: ... async def create_forum_topic( self, - chat_id: int | str, + chat_id: Union[int, str], name: str, - icon_color: int | None = None, - icon_custom_emoji_id: str | None = None, + icon_color: Optional[int] = None, + icon_custom_emoji_id: Optional[str] = None, ) -> ForumTopic: ... async def edit_forum_topic( self, - chat_id: int | str, + chat_id: Union[int, str], message_thread_id: int, - name: str | None = None, - icon_custom_emoji_id: str | None = None, + name: Optional[str] = None, + icon_custom_emoji_id: Optional[str] = None, ) -> Literal[True]: ... async def close_forum_topic( - self, chat_id: int | str, message_thread_id: int + self, chat_id: Union[int, str], message_thread_id: int ) -> Literal[True]: ... async def reopen_forum_topic( - self, chat_id: int | str, message_thread_id: int + self, chat_id: Union[int, str], message_thread_id: int ) -> Literal[True]: ... async def delete_forum_topic( - self, chat_id: int | str, message_thread_id: int + self, chat_id: Union[int, str], message_thread_id: int ) -> Literal[True]: ... async def unpin_all_forum_topic_messages( - self, chat_id: int | str, message_thread_id: int + self, chat_id: Union[int, str], message_thread_id: int ) -> Literal[True]: ... async def edit_general_forum_topic( - self, chat_id: int | str, name: str + self, chat_id: Union[int, str], name: str ) -> Literal[True]: ... - async def close_general_forum_topic(self, chat_id: int | str) -> Literal[True]: ... + async def close_general_forum_topic( + self, chat_id: Union[int, str] + ) -> Literal[True]: ... - async def reopen_general_forum_topic(self, chat_id: int | str) -> Literal[True]: ... + async def reopen_general_forum_topic( + self, chat_id: Union[int, str] + ) -> Literal[True]: ... - async def hide_general_forum_topic(self, chat_id: int | str) -> Literal[True]: ... + async def hide_general_forum_topic( + self, chat_id: Union[int, str] + ) -> Literal[True]: ... - async def unhide_general_forum_topic(self, chat_id: int | str) -> Literal[True]: ... + async def unhide_general_forum_topic( + self, chat_id: Union[int, str] + ) -> Literal[True]: ... async def unpin_all_general_forum_topic_messages( - self, chat_id: int | str + self, chat_id: Union[int, str] ) -> Literal[True]: ... async def answer_callback_query( self, callback_query_id: str, - text: str | None = None, - show_alert: bool | None = None, - url: str | None = None, - cache_time: int | None = None, + text: Optional[str] = None, + show_alert: Optional[bool] = None, + url: Optional[str] = None, + cache_time: Optional[int] = None, ) -> Literal[True]: ... async def get_user_chat_boosts( - self, chat_id: int | str, user_id: int + self, chat_id: Union[int, str], user_id: int ) -> UserChatBoosts: ... async def get_business_connection( self, business_connection_id: str @@ -774,166 +809,169 @@ async def get_business_connection( async def set_my_commands( self, commands: list[BotCommand], - scope: BotCommandScope | None = None, - language_code: str | None = None, + scope: Optional[BotCommandScope] = None, + language_code: Optional[str] = None, ) -> Literal[True]: ... async def delete_my_commands( self, - scope: BotCommandScope | None = None, - language_code: str | None = None, + scope: Optional[BotCommandScope] = None, + language_code: Optional[str] = None, ) -> Literal[True]: ... async def get_my_commands( self, - scope: BotCommandScope | None = None, - language_code: str | None = None, + scope: Optional[BotCommandScope] = None, + language_code: Optional[str] = None, ) -> list[BotCommand]: ... async def set_my_name( - self, name: str | None = None, language_code: str | None = None + self, name: Optional[str] = None, language_code: Optional[str] = None ) -> Literal[True]: ... - async def get_my_name(self, language_code: str | None = None) -> BotName: ... + async def get_my_name(self, language_code: Optional[str] = None) -> BotName: ... async def set_my_description( - self, description: str | None = None, language_code: str | None = None + self, description: Optional[str] = None, language_code: Optional[str] = None ) -> Literal[True]: ... async def get_my_description( - self, language_code: str | None = None + self, language_code: Optional[str] = None ) -> BotDescription: ... async def set_my_short_description( self, - short_description: str | None = None, - language_code: str | None = None, + short_description: Optional[str] = None, + language_code: Optional[str] = None, ) -> Literal[True]: ... async def get_my_short_description( - self, language_code: str | None = None + self, language_code: Optional[str] = None ) -> BotShortDescription: ... async def set_chat_menu_button( - self, chat_id: int | None = None, menu_button: MenuButton | None = None + self, chat_id: Optional[int] = None, menu_button: Optional[MenuButton] = None ) -> Literal[True]: ... - async def get_chat_menu_button(self, chat_id: int | None = None) -> MenuButton: ... + async def get_chat_menu_button( + self, chat_id: Optional[int] = None + ) -> MenuButton: ... async def set_my_default_administrator_rights( self, - rights: ChatAdministratorRights | None = None, - for_channels: bool | None = None, + rights: Optional[ChatAdministratorRights] = None, + for_channels: Optional[bool] = None, ) -> Literal[True]: ... async def get_my_default_administrator_rights( - self, for_channels: bool | None = None + self, for_channels: Optional[bool] = None ) -> ChatAdministratorRights: ... async def edit_message_text( self, text: str, - business_connection_id: str | None = None, - chat_id: int | str | None = None, - message_id: int | None = None, - inline_message_id: str | None = None, - parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, - entities: list[MessageEntity] | None = None, - link_preview_options: LinkPreviewOptions | None = None, - reply_markup: InlineKeyboardMarkup | None = None, - ) -> Message | Literal[True]: ... + business_connection_id: Optional[str] = None, + chat_id: Optional[Union[int, str]] = None, + message_id: Optional[int] = None, + inline_message_id: Optional[str] = None, + parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, + entities: Optional[list[MessageEntity]] = None, + link_preview_options: Optional[LinkPreviewOptions] = None, + reply_markup: Optional[InlineKeyboardMarkup] = None, + ) -> Union[Message, Literal[True]]: ... async def edit_message_caption( self, - business_connection_id: str | None = None, - chat_id: int | str | None = None, - message_id: int | None = None, - inline_message_id: str | None = None, - caption: str | None = None, - parse_mode: Literal["MarkdownV2", "Markdown", "HTML"] | None = None, - caption_entities: list[MessageEntity] | None = None, - show_caption_above_media: bool | None = None, - reply_markup: InlineKeyboardMarkup | None = None, - ) -> Message | Literal[True]: ... + business_connection_id: Optional[str] = None, + chat_id: Optional[Union[int, str]] = None, + message_id: Optional[int] = None, + inline_message_id: Optional[str] = None, + caption: Optional[str] = None, + parse_mode: Optional[Literal["MarkdownV2", "Markdown", "HTML"]] = None, + caption_entities: Optional[list[MessageEntity]] = None, + show_caption_above_media: Optional[bool] = None, + reply_markup: Optional[InlineKeyboardMarkup] = None, + ) -> Union[Message, Literal[True]]: ... async def edit_message_media( self, media: InputMedia, - business_connection_id: str | None = None, - chat_id: int | str | None = None, - message_id: int | None = None, - inline_message_id: str | None = None, - reply_markup: InlineKeyboardMarkup | None = None, - ) -> Message | Literal[True]: ... + business_connection_id: Optional[str] = None, + chat_id: Optional[Union[int, str]] = None, + message_id: Optional[int] = None, + inline_message_id: Optional[str] = None, + reply_markup: Optional[InlineKeyboardMarkup] = None, + ) -> Union[Message, Literal[True]]: ... async def edit_message_live_location( self, latitude: float, longitude: float, - business_connection_id: str | None = None, - chat_id: int | str | None = None, - message_id: int | None = None, - inline_message_id: str | None = None, - live_period: int | None = None, - horizontal_accuracy: float | None = None, - heading: int | None = None, - proximity_alert_radius: int | None = None, - reply_markup: InlineKeyboardMarkup | None = None, - ) -> Message | Literal[True]: ... + business_connection_id: Optional[str] = None, + chat_id: Optional[Union[int, str]] = None, + message_id: Optional[int] = None, + inline_message_id: Optional[str] = None, + live_period: Optional[int] = None, + horizontal_accuracy: Optional[float] = None, + heading: Optional[int] = None, + proximity_alert_radius: Optional[int] = None, + reply_markup: Optional[InlineKeyboardMarkup] = None, + ) -> Union[Message, Literal[True]]: ... async def stop_message_live_location( self, - business_connection_id: str | None = None, - chat_id: int | str | None = None, - message_id: int | None = None, - inline_message_id: str | None = None, - reply_markup: InlineKeyboardMarkup | None = None, - ) -> Message | Literal[True]: ... + business_connection_id: Optional[str] = None, + chat_id: Optional[Union[int, str]] = None, + message_id: Optional[int] = None, + inline_message_id: Optional[str] = None, + reply_markup: Optional[InlineKeyboardMarkup] = None, + ) -> Union[Message, Literal[True]]: ... async def edit_message_reply_markup( self, - business_connection_id: str | None = None, - chat_id: int | str | None = None, - message_id: int | None = None, - inline_message_id: str | None = None, - reply_markup: InlineKeyboardMarkup | None = None, - ) -> Message | Literal[True]: ... + business_connection_id: Optional[str] = None, + chat_id: Optional[Union[int, str]] = None, + message_id: Optional[int] = None, + inline_message_id: Optional[str] = None, + reply_markup: Optional[InlineKeyboardMarkup] = None, + ) -> Union[Message, Literal[True]]: ... async def stop_poll( self, - chat_id: int | str, + chat_id: Union[int, str], message_id: int, - business_connection_id: str | None = None, - reply_markup: InlineKeyboardMarkup | None = None, + business_connection_id: Optional[str] = None, + reply_markup: Optional[InlineKeyboardMarkup] = None, ) -> Poll: ... async def delete_message( - self, chat_id: int | str, message_id: int + self, chat_id: Union[int, str], message_id: int ) -> Literal[True]: ... async def delete_messages( - self, chat_id: int | str, message_ids: list[int] + self, chat_id: Union[int, str], message_ids: list[int] ) -> Literal[True]: ... async def send_sticker( self, - chat_id: int | str, - sticker: str | InputFile, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - emoji: str | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: ( - InlineKeyboardMarkup - | ReplyKeyboardMarkup - | ReplyKeyboardRemove - | ForceReply - | None - ) = None, + chat_id: Union[int, str], + sticker: Union[str, InputFile], + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + emoji: Optional[str] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[ + Union[ + InlineKeyboardMarkup, + ReplyKeyboardMarkup, + ReplyKeyboardRemove, + ForceReply, + ] + ] = None, ) -> Message: ... async def get_sticker_set(self, name: str) -> StickerSet: ... @@ -955,8 +993,8 @@ async def create_new_sticker_set( name: str, title: str, stickers: list[InputSticker], - sticker_type: str | None = None, - needs_repainting: bool | None = None, + sticker_type: Optional[str] = None, + needs_repainting: Optional[bool] = None, ) -> Literal[True]: ... async def add_sticker_to_set( @@ -980,11 +1018,11 @@ async def set_sticker_emoji_list( ) -> Literal[True]: ... async def set_sticker_keywords( - self, sticker: str, keywords: list[str] | None = None + self, sticker: str, keywords: Optional[list[str]] = None ) -> Literal[True]: ... async def set_sticker_mask_position( - self, sticker: str, mask_position: MaskPosition | None = None + self, sticker: str, mask_position: Optional[MaskPosition] = None ) -> Literal[True]: ... async def set_sticker_set_title(self, name: str, title: str) -> Literal[True]: ... @@ -994,11 +1032,11 @@ async def set_sticker_set_thumbnail( name: str, user_id: int, format: Literal["static", "animated", "video"], - thumbnail: str | InputFile | None = None, + thumbnail: Optional[Union[str, InputFile]] = None, ) -> Literal[True]: ... async def set_custom_emoji_sticker_set_thumbnail( - self, name: str, custom_emoji_id: str | None = None + self, name: str, custom_emoji_id: Optional[str] = None ) -> Literal[True]: ... async def delete_sticker_set(self, name: str) -> Literal[True]: ... @@ -1007,10 +1045,10 @@ async def answer_inline_query( self, inline_query_id: str, results: list[InlineQueryResult], - cache_time: int | None = None, - is_personal: bool | None = None, - next_offset: str | None = None, - button: InlineQueryResultsButton | None = None, + cache_time: Optional[int] = None, + is_personal: Optional[bool] = None, + next_offset: Optional[str] = None, + button: Optional[InlineQueryResultsButton] = None, ) -> Literal[True]: ... async def answer_web_app_query( @@ -1019,35 +1057,35 @@ async def answer_web_app_query( async def send_invoice( self, - chat_id: int | str, + chat_id: Union[int, str], title: str, description: str, payload: str, currency: str, prices: list[LabeledPrice], - message_thread_id: int | None = None, - provider_token: str | None = None, - max_tip_amount: int | None = None, - suggested_tip_amounts: list[int] | None = None, - start_parameter: str | None = None, - provider_data: str | None = None, - photo_url: str | None = None, - photo_size: int | None = None, - photo_width: int | None = None, - photo_height: int | None = None, - need_name: bool | None = None, - need_phone_number: bool | None = None, - need_email: bool | None = None, - need_shipping_address: bool | None = None, - send_phone_number_to_provider: bool | None = None, - send_email_to_provider: bool | None = None, - is_flexible: bool | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: InlineKeyboardMarkup | None = None, + message_thread_id: Optional[int] = None, + provider_token: Optional[str] = None, + max_tip_amount: Optional[int] = None, + suggested_tip_amounts: Optional[list[int]] = None, + start_parameter: Optional[str] = None, + provider_data: Optional[str] = None, + photo_url: Optional[str] = None, + photo_size: Optional[int] = None, + photo_width: Optional[int] = None, + photo_height: Optional[int] = None, + need_name: Optional[bool] = None, + need_phone_number: Optional[bool] = None, + need_email: Optional[bool] = None, + need_shipping_address: Optional[bool] = None, + send_phone_number_to_provider: Optional[bool] = None, + send_email_to_provider: Optional[bool] = None, + is_flexible: Optional[bool] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[InlineKeyboardMarkup] = None, ) -> Message: ... async def create_invoice_link( @@ -1057,36 +1095,36 @@ async def create_invoice_link( payload: str, currency: str, prices: list[LabeledPrice], - provider_token: str | None = None, - max_tip_amount: int | None = None, - suggested_tip_amounts: list[int] | None = None, - provider_data: str | None = None, - photo_url: str | None = None, - photo_size: int | None = None, - photo_width: int | None = None, - photo_height: int | None = None, - need_name: bool | None = None, - need_phone_number: bool | None = None, - need_email: bool | None = None, - need_shipping_address: bool | None = None, - send_phone_number_to_provider: bool | None = None, - send_email_to_provider: bool | None = None, - is_flexible: bool | None = None, + provider_token: Optional[str] = None, + max_tip_amount: Optional[int] = None, + suggested_tip_amounts: Optional[list[int]] = None, + provider_data: Optional[str] = None, + photo_url: Optional[str] = None, + photo_size: Optional[int] = None, + photo_width: Optional[int] = None, + photo_height: Optional[int] = None, + need_name: Optional[bool] = None, + need_phone_number: Optional[bool] = None, + need_email: Optional[bool] = None, + need_shipping_address: Optional[bool] = None, + send_phone_number_to_provider: Optional[bool] = None, + send_email_to_provider: Optional[bool] = None, + is_flexible: Optional[bool] = None, ) -> str: ... async def answer_shipping_query( self, shipping_query_id: str, ok: bool, - shipping_options: list[ShippingOption] | None = None, - error_message: str | None = None, + shipping_options: Optional[list[ShippingOption]] = None, + error_message: Optional[str] = None, ) -> Literal[True]: ... async def answer_pre_checkout_query( - self, pre_checkout_query_id: str, ok: bool, error_message: str | None = None + self, pre_checkout_query_id: str, ok: bool, error_message: Optional[str] = None ) -> Literal[True]: ... async def get_star_transactions( - self, offset: int | None = None, limit: int | None = None + self, offset: Optional[int] = None, limit: Optional[int] = None ) -> StarTransaction: ... async def refund_star_payment( self, user_id: int, telegram_payment_charge_id: str @@ -1100,31 +1138,31 @@ async def send_game( self, chat_id: int, game_short_name: str, - business_connection_id: str | None = None, - message_thread_id: int | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - allow_paid_broadcast: bool | None = None, - message_effect_id: str | None = None, - reply_parameters: ReplyParameters | None = None, - reply_markup: InlineKeyboardMarkup | None = None, + business_connection_id: Optional[str] = None, + message_thread_id: Optional[int] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + allow_paid_broadcast: Optional[bool] = None, + message_effect_id: Optional[str] = None, + reply_parameters: Optional[ReplyParameters] = None, + reply_markup: Optional[InlineKeyboardMarkup] = None, ) -> Message: ... async def set_game_score( self, user_id: int, score: int, - force: bool | None = None, - disable_edit_message: bool | None = None, - chat_id: int | None = None, - message_id: int | None = None, - inline_message_id: str | None = None, - ) -> Message | Literal[True]: ... + force: Optional[bool] = None, + disable_edit_message: Optional[bool] = None, + chat_id: Optional[int] = None, + message_id: Optional[int] = None, + inline_message_id: Optional[str] = None, + ) -> Union[Message, Literal[True]]: ... async def get_game_high_scores( self, user_id: int, - chat_id: int | None = None, - message_id: int | None = None, - inline_message_id: str | None = None, + chat_id: Optional[int] = None, + message_id: Optional[int] = None, + inline_message_id: Optional[str] = None, ) -> list[GameHighScore]: ... diff --git a/nonebot/adapters/telegram/bot.py b/nonebot/adapters/telegram/bot.py index c1404a8..da528d9 100644 --- a/nonebot/adapters/telegram/bot.py +++ b/nonebot/adapters/telegram/bot.py @@ -1,8 +1,8 @@ import inspect from uuid import uuid4 -from typing import Any, cast from functools import partial from typing_extensions import override +from typing import Any, Union, Optional, cast from pydantic import TypeAdapter from nonebot.message import handle_event @@ -34,13 +34,13 @@ def __init__( adapter: "Adapter", self_id: str, *, - config: BotConfig | None = None, + config: Optional[BotConfig] = None, ): if not config: raise ValueError("config is required") super().__init__(adapter, self_id) - self.username: str | None = None + self.username: Optional[str] = None self.bot_config = config self.secret_token = uuid4().hex @@ -104,7 +104,7 @@ async def call_api(self, api: str, *args: Any, **kargs: Any) -> Any: ) return await super().call_api(api, **kargs) - def __getattribute__(self, __name: str) -> Any: + def __getattribute__(self, __name: str, /) -> Any: if not __name.startswith("__") and hasattr(API, __name): return partial(self.call_api, __name) return object.__getattribute__(self, __name) @@ -112,13 +112,13 @@ def __getattribute__(self, __name: str) -> Any: # TODO 重构 async def send_to( self, - chat_id: int | str, - message: str | Message | MessageSegment, - message_thread_id: int | None = None, - disable_notification: bool | None = None, - protect_content: bool | None = None, - reply_to_message_id: int | None = None, # Deprecated - allow_sending_without_reply: bool | None = None, # Deprecated + chat_id: Union[int, str], + message: Union[str, Message, MessageSegment], + message_thread_id: Optional[int] = None, + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, + reply_to_message_id: Optional[int] = None, # Deprecated + allow_sending_without_reply: Optional[bool] = None, # Deprecated media_group_caption_index: int = 0, # 非 Telegram 原生参数 **kwargs, ): @@ -273,9 +273,9 @@ async def send_to( async def send( self, event: Event, - message: str | Message | MessageSegment, - disable_notification: bool | None = None, - protect_content: bool | None = None, + message: Union[str, Message, MessageSegment], + disable_notification: Optional[bool] = None, + protect_content: Optional[bool] = None, **kwargs, ) -> Any: if not isinstance(event, EventWithChat): @@ -289,7 +289,7 @@ async def send( ) message_thread_id = cast( - int | None, + Optional[int], getattr(event, "message_thread_id", None), ) diff --git a/nonebot/adapters/telegram/config.py b/nonebot/adapters/telegram/config.py index 64eae69..307fb41 100644 --- a/nonebot/adapters/telegram/config.py +++ b/nonebot/adapters/telegram/config.py @@ -1,3 +1,5 @@ +from typing import Optional + from pydantic import Field, BaseModel, ConfigDict @@ -28,9 +30,9 @@ class AdapterConfig(BaseModel): - ``telegram_webhook_url``: 自定义 webhook url """ - proxy: str | None = Field(default=None, alias="telegram_proxy") + proxy: Optional[str] = Field(default=None, alias="telegram_proxy") telegram_bots: list["BotConfig"] = [] - telegram_webhook_url: str | None = None + telegram_webhook_url: Optional[str] = None model_config: ConfigDict = ConfigDict( extra="ignore", populate_by_name=True, diff --git a/nonebot/adapters/telegram/event.py b/nonebot/adapters/telegram/event.py index fa85a49..86025ba 100644 --- a/nonebot/adapters/telegram/event.py +++ b/nonebot/adapters/telegram/event.py @@ -37,7 +37,7 @@ class EventWithChat(Protocol): class Event(BaseEvent): - telegram_model: Update | None = Field(default=None) + telegram_model: Optional[Update] = Field(default=None) @classmethod def __parse_event(cls, obj: dict) -> "Event": @@ -129,16 +129,16 @@ class MessageEvent(Event): message_id: int date: int chat: Chat - forward_from: User | None = None - forward_from_chat: Chat | None = None - forward_from_message_id: int | None = None - forward_signature: str | None = None - forward_sender_name: str | None = None - forward_date: int | None = None - via_bot: User | None = None - has_protected_content: Literal[True] | None = None - media_group_id: str | None = None - author_signature: str | None = None + forward_from: Optional[User] = None + forward_from_chat: Optional[Chat] = None + forward_from_message_id: Optional[int] = None + forward_signature: Optional[str] = None + forward_sender_name: Optional[str] = None + forward_date: Optional[int] = None + via_bot: Optional[User] = None + has_protected_content: Optional[Literal[True]] = None + media_group_id: Optional[str] = None + author_signature: Optional[str] = None reply_to_message: Optional["MessageEvent"] = None message: Message = Message() original_message: Message = Message() @@ -227,7 +227,7 @@ def __parse_event(cls, obj: dict) -> "Event": return event from_: User = Field(alias="from") - sender_chat: Chat | None = None + sender_chat: Optional[Chat] = None @override def get_event_name(self) -> str: @@ -269,7 +269,7 @@ def get_event_description(self) -> str: class ChannelPostEvent(MessageEvent): - sender_chat: Chat | None = None + sender_chat: Optional[Chat] = None @override def get_event_name(self) -> str: @@ -284,10 +284,10 @@ class EditedMessageEvent(Event): message_id: int date: int chat: Chat - via_bot: User | None = None + via_bot: Optional[User] = None edit_date: int - media_group_id: str | None = None - author_signature: str | None = None + media_group_id: Optional[str] = None + author_signature: Optional[str] = None reply_to_message: Optional["MessageEvent"] = None message: Message = Message() @@ -335,7 +335,7 @@ def get_event_description(self) -> str: class PrivateEditedMessageEvent(EditedMessageEvent): from_: User = Field(alias="from") - sender_chat: Chat | None = None + sender_chat: Optional[Chat] = None @override def get_event_name(self) -> str: @@ -362,8 +362,8 @@ def get_event_description(self) -> str: class GroupEditedMessageEvent(EditedMessageEvent): - from_: User | None = Field(default=None, alias="from") - sender_chat: Chat | None = None + from_: Optional[User] = Field(default=None, alias="from") + sender_chat: Optional[Chat] = None @classmethod def __parse_event(cls, obj: dict) -> "Event": @@ -419,7 +419,7 @@ def get_event_description(self) -> str: class EditedChannelPostEvent(EditedMessageEvent): - sender_chat: Chat | None = None + sender_chat: Optional[Chat] = None @override def get_event_name(self) -> str: @@ -471,11 +471,11 @@ def get_event_name(self) -> str: class PinnedMessageEvent(NoticeEvent): message_id: int - from_: User | None = Field(alias="from") - sender_chat: Chat | None = None + from_: Optional[User] = Field(alias="from") + sender_chat: Optional[Chat] = None chat: Chat date: int - pinned_message: MessageEvent | None = Field(default=None) + pinned_message: Optional[MessageEvent] = Field(default=None) @classmethod def __parse_event(cls, obj: dict): @@ -504,7 +504,7 @@ def get_event_description(self) -> str: class NewChatMemberEvent(NoticeEvent): message_id: int - from_: User | None = Field(default=None, alias="from") + from_: Optional[User] = Field(default=None, alias="from") chat: Chat date: int new_chat_members: list[User] @@ -516,7 +516,7 @@ def get_event_name(self) -> str: class LeftChatMemberEvent(NoticeEvent): message_id: int - from_: User | None = Field(default=None, alias="from") + from_: Optional[User] = Field(default=None, alias="from") chat: Chat date: int left_chat_member: User @@ -546,7 +546,7 @@ def get_event_name(self) -> str: class NewChatTitleEvent(NoticeEvent): date: int - from_: User | None = Field(default=None, alias="from") + from_: Optional[User] = Field(default=None, alias="from") chat: Chat new_chat_title: str @@ -557,7 +557,7 @@ def get_event_name(self) -> str: class NewChatPhotoEvent(NoticeEvent): date: int - from_: User | None = Field(default=None, alias="from") + from_: Optional[User] = Field(default=None, alias="from") chat: Chat new_chat_photo: list[PhotoSize] @@ -568,7 +568,7 @@ def get_event_name(self) -> str: class DeleteChatPhotoEvent(NoticeEvent): date: int - from_: User | None = Field(default=None, alias="from") + from_: Optional[User] = Field(default=None, alias="from") chat: Chat delete_chat_photo: Literal[True] @@ -579,7 +579,7 @@ def get_event_name(self) -> str: class ForumTopicCreatedEvent(NoticeEvent): message_thread_id: int - from_: User | None = Field(default=None, alias="from") + from_: Optional[User] = Field(default=None, alias="from") chat: Chat date: int forum_topic_created: ForumTopicCreated @@ -591,7 +591,7 @@ def get_event_name(self) -> str: class ForumTopicEditedEvent(NoticeEvent): message_thread_id: int - from_: User | None = Field(default=None, alias="from") + from_: Optional[User] = Field(default=None, alias="from") chat: Chat date: int forum_topic_edited: ForumTopicEdited @@ -603,7 +603,7 @@ def get_event_name(self) -> str: class ForumTopicClosedEvent(NoticeEvent): message_thread_id: int - from_: User | None = Field(default=None, alias="from") + from_: Optional[User] = Field(default=None, alias="from") chat: Chat date: int forum_topic_closed: ForumTopicClosed @@ -615,7 +615,7 @@ def get_event_name(self) -> str: class ForumTopicReopenedEvent(NoticeEvent): message_thread_id: int - from_: User | None = Field(default=None, alias="from") + from_: Optional[User] = Field(default=None, alias="from") chat: Chat date: int forum_topic_reopened: ForumTopicReopened @@ -626,7 +626,7 @@ def get_event_name(self) -> str: class GeneralForumTopicHiddenEvent(NoticeEvent): - from_: User | None = Field(default=None, alias="from") + from_: Optional[User] = Field(default=None, alias="from") chat: Chat date: int general_forum_topic_hidden: GeneralForumTopicHidden @@ -637,7 +637,7 @@ def get_event_name(self) -> str: class GeneralForumTopicUnhiddenEvent(NoticeEvent): - from_: User | None = Field(default=None, alias="from") + from_: Optional[User] = Field(default=None, alias="from") chat: Chat date: int general_forum_topic_unhidden: GeneralForumTopicUnhidden @@ -712,7 +712,7 @@ def get_event_description(self) -> str: class CallbackQueryEvent(InlineEvent, CallbackQuery): - chat: Chat | None = Field(default=None) + chat: Optional[Chat] = Field(default=None) @override def get_event_name(self) -> str: diff --git a/nonebot/adapters/telegram/exception.py b/nonebot/adapters/telegram/exception.py index d74eb72..06a8721 100644 --- a/nonebot/adapters/telegram/exception.py +++ b/nonebot/adapters/telegram/exception.py @@ -1,3 +1,5 @@ +from typing import Optional + from nonebot.exception import AdapterException from nonebot.exception import ActionFailed as BaseActionFailed from nonebot.exception import NetworkError as BaseNetworkError @@ -20,7 +22,7 @@ class ActionFailed(BaseActionFailed, TelegramAdapterException): API 请求返回错误信息。 """ - def __init__(self, description: str | None = None): + def __init__(self, description: Optional[str] = None): super().__init__() self.description = description @@ -37,7 +39,7 @@ class NetworkError(BaseNetworkError, TelegramAdapterException): 网络错误。 """ - def __init__(self, msg: str | None = None): + def __init__(self, msg: Optional[str] = None): super().__init__() self.msg = msg diff --git a/nonebot/adapters/telegram/message.py b/nonebot/adapters/telegram/message.py index c4ff092..4a3fcb3 100644 --- a/nonebot/adapters/telegram/message.py +++ b/nonebot/adapters/telegram/message.py @@ -1,6 +1,6 @@ from collections.abc import Iterable from typing_extensions import override -from typing import Any, Literal, TypeVar +from typing import Any, Union, Literal, TypeVar, Optional from nonebot.adapters import Message as BaseMessage from nonebot.adapters import MessageSegment as BaseMessageSegment @@ -50,10 +50,10 @@ def is_text(self) -> bool: def location( latitude: float, longitude: float, - horizontal_accuracy: float | None = None, - live_period: int | None = None, - heading: int | None = None, - proximity_alert_radius: int | None = None, + horizontal_accuracy: Optional[float] = None, + live_period: Optional[int] = None, + heading: Optional[int] = None, + proximity_alert_radius: Optional[int] = None, ) -> "MessageSegment": return MessageSegment( "location", @@ -73,10 +73,10 @@ def venue( longitude: float, title: str, address: str, - foursquare_id: str | None = None, - foursquare_type: str | None = None, - google_place_id: str | None = None, - google_place_type: str | None = None, + foursquare_id: Optional[str] = None, + foursquare_type: Optional[str] = None, + google_place_id: Optional[str] = None, + google_place_type: Optional[str] = None, ) -> "MessageSegment": return MessageSegment( "venue", @@ -96,13 +96,13 @@ def venue( def poll( question: str, options: list[str], - is_anonymous: bool | None = None, - type: str | None = None, - allows_multiple_answers: bool | None = None, - correct_option_id: int | None = None, - explanation: str | None = None, - open_period: int | None = None, - close_date: int | None = None, + is_anonymous: Optional[bool] = None, + type: Optional[str] = None, + allows_multiple_answers: Optional[bool] = None, + correct_option_id: Optional[int] = None, + explanation: Optional[str] = None, + open_period: Optional[int] = None, + close_date: Optional[int] = None, ) -> "MessageSegment": return MessageSegment( "poll", @@ -166,10 +166,10 @@ class Reply(MessageSegment): @staticmethod def reply( message_id: int, - chat_id: int | str | None = None, - allow_sending_without_reply: bool | None = None, - quote: str | None = None, - quote_position: int | None = None, + chat_id: Optional[Union[int, str]] = None, + allow_sending_without_reply: Optional[bool] = None, + quote: Optional[str] = None, + quote_position: Optional[int] = None, ): return Reply( "reply", @@ -353,19 +353,19 @@ def build_telegram_entities(entities: list["Entity"]) -> list[MessageEntity]: class File(MessageSegment): @staticmethod def photo( - file: str | bytes | tuple[str, bytes], has_spoiler: bool | None = None + file: Union[str, bytes, tuple[str, bytes]], has_spoiler: Optional[bool] = None ) -> "MessageSegment": return File("photo", {"file": file, "has_spoiler": has_spoiler}) @staticmethod - def voice(file: str | bytes | tuple[str, bytes]) -> "MessageSegment": + def voice(file: Union[str, bytes, tuple[str, bytes]]) -> "MessageSegment": return File("voice", {"file": file}) @staticmethod def animation( - file: str | bytes | tuple[str, bytes], - thumbnail: None | str | bytes = None, - has_spoiler: bool | None = None, + file: Union[str, bytes, tuple[str, bytes]], + thumbnail: Union[None, str, bytes] = None, + has_spoiler: Optional[bool] = None, ) -> "MessageSegment": return File( "animation", @@ -374,23 +374,23 @@ def animation( @staticmethod def audio( - file: str | bytes | tuple[str, bytes], - thumbnail: None | str | bytes = None, + file: Union[str, bytes, tuple[str, bytes]], + thumbnail: Union[None, str, bytes] = None, ) -> "MessageSegment": return File("audio", {"file": file, "thumbnail": thumbnail}) @staticmethod def document( - file: str | bytes | tuple[str, bytes], - thumbnail: None | str | bytes = None, + file: Union[str, bytes, tuple[str, bytes]], + thumbnail: Union[None, str, bytes] = None, ) -> "MessageSegment": return File("document", {"file": file, "thumbnail": thumbnail}) @staticmethod def video( - file: str | bytes | tuple[str, bytes], - thumbnail: None | str | bytes = None, - has_spoiler: bool | None = None, + file: Union[str, bytes, tuple[str, bytes]], + thumbnail: Union[None, str, bytes] = None, + has_spoiler: Optional[bool] = None, ) -> "MessageSegment": return File( "video", @@ -400,13 +400,13 @@ def video( class UnCombinFile(File): @staticmethod - def sticker(file: str | bytes | tuple[str, bytes]) -> "MessageSegment": + def sticker(file: Union[str, bytes, tuple[str, bytes]]) -> "MessageSegment": return File("sticker", {"file": file}) @staticmethod def video_note( - file: str | bytes | tuple[str, bytes], - thumbnail: None | str | bytes = None, + file: Union[str, bytes, tuple[str, bytes]], + thumbnail: Union[None, str, bytes] = None, ) -> "MessageSegment": """ 不支持 URL diff --git a/nonebot/adapters/telegram/model.py b/nonebot/adapters/telegram/model.py index 7a41a8a..1541d9f 100644 --- a/nonebot/adapters/telegram/model.py +++ b/nonebot/adapters/telegram/model.py @@ -7,26 +7,26 @@ class User(BaseModel): id: int is_bot: bool first_name: str - last_name: str | None = None - username: str | None = None - language_code: str | None = None - is_premium: Literal[True] | None = None - added_to_attachment_menu: Literal[True] | None = None - can_join_groups: bool | None = None - can_read_all_group_messages: bool | None = None - supports_inline_queries: bool | None = None - can_connect_to_business: bool | None = None - has_main_web_app: bool | None = None + last_name: Optional[str] = None + username: Optional[str] = None + language_code: Optional[str] = None + is_premium: Optional[Literal[True]] = None + added_to_attachment_menu: Optional[Literal[True]] = None + can_join_groups: Optional[bool] = None + can_read_all_group_messages: Optional[bool] = None + supports_inline_queries: Optional[bool] = None + can_connect_to_business: Optional[bool] = None + has_main_web_app: Optional[bool] = None class Chat(BaseModel): id: int type: Literal["private", "group", "supergroup", "channel"] - title: str | None = None - username: str | None = None - first_name: str | None = None - last_name: str | None = None - is_forum: Literal[True] | None = None + title: Optional[str] = None + username: Optional[str] = None + first_name: Optional[str] = None + last_name: Optional[str] = None + is_forum: Optional[Literal[True]] = None class MessageOriginUser(BaseModel): @@ -45,7 +45,7 @@ class MessageOriginChat(BaseModel): type: Literal["chat"] = "chat" date: int sender_chat: Chat - author_signature: str | None = None + author_signature: Optional[str] = None class MessageOriginChannel(BaseModel): @@ -53,7 +53,7 @@ class MessageOriginChannel(BaseModel): date: int chat: Chat message_id: int - author_signature: str | None = None + author_signature: Optional[str] = None MessageOrigin = Union[ @@ -62,11 +62,11 @@ class MessageOriginChannel(BaseModel): class LinkPreviewOptions(BaseModel): - is_disabled: bool | None = None - url: str | None = None - prefer_small_media: bool | None = None - prefer_large_media: bool | None = None - show_above_text: bool | None = None + is_disabled: Optional[bool] = None + url: Optional[str] = None + prefer_small_media: Optional[bool] = None + prefer_large_media: Optional[bool] = None + show_above_text: Optional[bool] = None class PhotoSize(BaseModel): @@ -74,7 +74,7 @@ class PhotoSize(BaseModel): file_unique_id: str width: int height: int - file_size: int | None = None + file_size: Optional[int] = None class Animation(BaseModel): @@ -83,38 +83,38 @@ class Animation(BaseModel): width: int height: int duration: int - thumbnail: PhotoSize | None = None - file_name: str | None = None - mime_type: str | None = None - file_size: int | None = None + thumbnail: Optional[PhotoSize] = None + file_name: Optional[str] = None + mime_type: Optional[str] = None + file_size: Optional[int] = None class Audio(BaseModel): file_id: str file_unique_id: str duration: int - performer: str | None = None - title: str | None = None - file_name: str | None = None - mime_type: str | None = None - file_size: int | None = None - thumbnail: PhotoSize | None = None + performer: Optional[str] = None + title: Optional[str] = None + file_name: Optional[str] = None + mime_type: Optional[str] = None + file_size: Optional[int] = None + thumbnail: Optional[PhotoSize] = None class Document(BaseModel): file_id: str file_unique_id: str - thumbnail: PhotoSize | None = None - file_name: str | None = None - mime_type: str | None = None - file_size: int | None = None + thumbnail: Optional[PhotoSize] = None + file_name: Optional[str] = None + mime_type: Optional[str] = None + file_size: Optional[int] = None class PaidMediaPreview(BaseModel): type: Literal["preview"] = "preview" - width: int | None = None - height: int | None = None - duration: int | None = None + width: Optional[int] = None + height: Optional[int] = None + duration: Optional[int] = None class PaidMediaPhoto(BaseModel): @@ -128,10 +128,10 @@ class Video(BaseModel): width: int height: int duration: int - thumbnail: PhotoSize | None = None - file_name: str | None = None - mime_type: str | None = None - file_size: int | None = None + thumbnail: Optional[PhotoSize] = None + file_name: Optional[str] = None + mime_type: Optional[str] = None + file_size: Optional[int] = None class PaidMediaVideo(BaseModel): @@ -150,8 +150,8 @@ class PaidMediaInfo(BaseModel): class File(BaseModel): file_id: str file_unique_id: str - file_size: int | None = None - file_path: str | None = None + file_size: Optional[int] = None + file_path: Optional[str] = None class MaskPosition(BaseModel): @@ -169,14 +169,14 @@ class Sticker(BaseModel): height: int is_animated: bool is_video: bool - thumbnail: PhotoSize | None = None - emoji: str | None = None - set_name: str | None = None - premium_animation: File | None = None - mask_position: MaskPosition | None = None - custom_emoji_id: str | None = None - needs_repainting: Literal[True] | None = None - file_size: int | None = None + thumbnail: Optional[PhotoSize] = None + emoji: Optional[str] = None + set_name: Optional[str] = None + premium_animation: Optional[File] = None + mask_position: Optional[MaskPosition] = None + custom_emoji_id: Optional[str] = None + needs_repainting: Optional[Literal[True]] = None + file_size: Optional[int] = None class Story(BaseModel): @@ -189,24 +189,24 @@ class VideoNote(BaseModel): file_unique_id: str length: int duration: int - thumbnail: PhotoSize | None = None - file_size: int | None = None + thumbnail: Optional[PhotoSize] = None + file_size: Optional[int] = None class Voice(BaseModel): file_id: str file_unique_id: str duration: int - mime_type: str | None = None - file_size: int | None = None + mime_type: Optional[str] = None + file_size: Optional[int] = None class Contact(BaseModel): phone_number: str first_name: str - last_name: str | None = None - user_id: int | None = None - vcard: str | None = None + last_name: Optional[str] = None + user_id: Optional[int] = None + vcard: Optional[str] = None class Dice(BaseModel): @@ -238,31 +238,31 @@ class MessageEntity(BaseModel): ] offset: int length: int - url: str | None = None - user: User | None = None - language: str | None = None - custom_emoji_id: str | None = None + url: Optional[str] = None + user: Optional[User] = None + language: Optional[str] = None + custom_emoji_id: Optional[str] = None class Game(BaseModel): title: str description: str photo: list[PhotoSize] - text: str | None = None - text_entities: list[MessageEntity] | None = None - animation: Animation | None = None + text: Optional[str] = None + text_entities: Optional[list[MessageEntity]] = None + animation: Optional[Animation] = None class Giveaway(BaseModel): chats: list[Chat] winners_selection_date: int winner_count: int - only_new_members: Literal[True] | None = None - has_public_winners: Literal[True] | None = None - prize_description: str | None = None - country_codes: list[str] | None = None - prize_star_count: int | None = None - premium_subscription_month_count: int | None = None + only_new_members: Optional[Literal[True]] = None + has_public_winners: Optional[Literal[True]] = None + prize_description: Optional[str] = None + country_codes: Optional[list[str]] = None + prize_star_count: Optional[int] = None + premium_subscription_month_count: Optional[int] = None class GiveawayWinners(BaseModel): @@ -271,13 +271,13 @@ class GiveawayWinners(BaseModel): winners_selection_date: int winner_count: int winners: list[User] - additional_chat_count: int | None = None - prize_star_count: int | None = None - premium_subscription_month_count: int | None = None - unclaimed_prize_count: int | None = None - only_new_members: Literal[True] | None = None - was_refunded: Literal[True] | None = None - prize_description: str | None = None + additional_chat_count: Optional[int] = None + prize_star_count: Optional[int] = None + premium_subscription_month_count: Optional[int] = None + unclaimed_prize_count: Optional[int] = None + only_new_members: Optional[Literal[True]] = None + was_refunded: Optional[Literal[True]] = None + prize_description: Optional[str] = None class Invoice(BaseModel): @@ -291,77 +291,77 @@ class Invoice(BaseModel): class Location(BaseModel): latitude: float longitude: float - horizontal_accuracy: float | None = None - live_period: int | None = None - heading: int | None = None - proximity_alert_radius: int | None = None + horizontal_accuracy: Optional[float] = None + live_period: Optional[int] = None + heading: Optional[int] = None + proximity_alert_radius: Optional[int] = None class PollOption(BaseModel): text: str - text_entities: list[MessageEntity] | None = None + text_entities: Optional[list[MessageEntity]] = None voter_count: int class Poll(BaseModel): id: str question: str - question_entities: list[MessageEntity] | None = None + question_entities: Optional[list[MessageEntity]] = None options: list[PollOption] total_voter_count: int is_closed: bool is_anonymous: bool type: Literal["regular", "quiz"] allows_multiple_answers: bool - correct_option_id: int | None = None - explanation: str | None = None - explanation_entities: list[MessageEntity] | None = None - open_period: int | None = None - close_date: int | None = None + correct_option_id: Optional[int] = None + explanation: Optional[str] = None + explanation_entities: Optional[list[MessageEntity]] = None + open_period: Optional[int] = None + close_date: Optional[int] = None class Venue(BaseModel): location: Location title: str address: str - foursquare_id: str | None = None - foursquare_type: str | None = None - google_place_id: str | None = None - google_place_type: str | None = None + foursquare_id: Optional[str] = None + foursquare_type: Optional[str] = None + google_place_id: Optional[str] = None + google_place_type: Optional[str] = None class ExternalReplyInfo(BaseModel): origin: MessageOrigin - chat: Chat | None = None - message_id: int | None = None - link_preview_options: LinkPreviewOptions | None = None - animation: Animation | None = None - audio: Audio | None = None - document: Document | None = None - paid_media: PaidMediaInfo | None = None - photo: list[PhotoSize] | None = None - sticker: Sticker | None = None - story: Story | None = None - video: Video | None = None - video_note: VideoNote | None = None - voice: Voice | None = None - has_media_spoiler: Literal[True] | None = None - contact: Contact | None = None - dice: Dice | None = None - game: Game | None = None - giveaway: Giveaway | None = None - giveaway_winners: GiveawayWinners | None = None - invoice: Invoice | None = None - location: Location | None = None - poll: Poll | None = None - venue: Venue | None = None + chat: Optional[Chat] = None + message_id: Optional[int] = None + link_preview_options: Optional[LinkPreviewOptions] = None + animation: Optional[Animation] = None + audio: Optional[Audio] = None + document: Optional[Document] = None + paid_media: Optional[PaidMediaInfo] = None + photo: Optional[list[PhotoSize]] = None + sticker: Optional[Sticker] = None + story: Optional[Story] = None + video: Optional[Video] = None + video_note: Optional[VideoNote] = None + voice: Optional[Voice] = None + has_media_spoiler: Optional[Literal[True]] = None + contact: Optional[Contact] = None + dice: Optional[Dice] = None + game: Optional[Game] = None + giveaway: Optional[Giveaway] = None + giveaway_winners: Optional[GiveawayWinners] = None + invoice: Optional[Invoice] = None + location: Optional[Location] = None + poll: Optional[Poll] = None + venue: Optional[Venue] = None class TextQuote(BaseModel): text: str - entities: list[MessageEntity] | None = None + entities: Optional[list[MessageEntity]] = None position: int - is_manual: Literal[True] | None = None + is_manual: Optional[Literal[True]] = None class MessageAutoDeleteTimerChanged(BaseModel): @@ -387,18 +387,18 @@ class ShippingAddress(BaseModel): class OrderInfo(BaseModel): - name: str | None = None - phone_number: str | None = None - email: str | None = None - shipping_address: ShippingAddress | None = None + name: Optional[str] = None + phone_number: Optional[str] = None + email: Optional[str] = None + shipping_address: Optional[ShippingAddress] = None class SuccessfulPayment(BaseModel): currency: str total_amount: int invoice_payload: str - shipping_option_id: str | None = None - order_info: OrderInfo | None = None + shipping_option_id: Optional[str] = None + order_info: Optional[OrderInfo] = None telegram_payment_charge_id: str provider_payment_charge_id: str @@ -408,15 +408,15 @@ class RefundedPayment(BaseModel): total_amount: int invoice_payload: str telegram_payment_charge_id: str - provider_payment_charge_id: str | None = None + provider_payment_charge_id: Optional[str] = None class SharedUser(BaseModel): user_id: int - first_name: str | None = None - last_name: str | None = None - username: str | None = None - photo: list[PhotoSize] | None = None + first_name: Optional[str] = None + last_name: Optional[str] = None + username: Optional[str] = None + photo: Optional[list[PhotoSize]] = None class UsersShared(BaseModel): @@ -427,15 +427,15 @@ class UsersShared(BaseModel): class ChatShared(BaseModel): request_id: int chat_id: int - title: str | None = None - username: str | None = None - photo: list[PhotoSize] | None = None + title: Optional[str] = None + username: Optional[str] = None + photo: Optional[list[PhotoSize]] = None class WriteAccessAllowed(BaseModel): - from_request: bool | None = None - web_app_name: str | None = None - from_attachment_menu: bool | None = None + from_request: Optional[bool] = None + web_app_name: Optional[str] = None + from_attachment_menu: Optional[bool] = None class PassportFile(BaseModel): @@ -461,14 +461,14 @@ class EncryptedPassportElement(BaseModel): "phone_number", "email", ] - data: str | None = None - phone_number: str | None = None - email: str | None = None - files: list[PassportFile] | None = None - front_side: PassportFile | None = None - reverse_side: PassportFile | None = None - selfie: PassportFile | None = None - translation: list[PassportFile] | None = None + data: Optional[str] = None + phone_number: Optional[str] = None + email: Optional[str] = None + files: Optional[list[PassportFile]] = None + front_side: Optional[PassportFile] = None + reverse_side: Optional[PassportFile] = None + selfie: Optional[PassportFile] = None + translation: Optional[list[PassportFile]] = None hash: str @@ -525,8 +525,8 @@ class BackgroundTypeWallpaper(BaseModel): type: Literal["wallpaper"] = "wallpaper" document: Document dark_theme_dimming: int - is_blurred: Literal[True] | None = None - is_moving: Literal[True] | None = None + is_blurred: Optional[Literal[True]] = None + is_moving: Optional[Literal[True]] = None class BackgroundTypePattern(BaseModel): @@ -534,8 +534,8 @@ class BackgroundTypePattern(BaseModel): document: Document fill: BackgroundFill intensity: int - is_inverted: Literal[True] | None = None - is_moving: Literal[True] | None = None + is_inverted: Optional[Literal[True]] = None + is_moving: Optional[Literal[True]] = None class BackgroundTypeChatTheme(BaseModel): @@ -558,12 +558,12 @@ class ChatBackground(BaseModel): class ForumTopicCreated(BaseModel): name: str icon_color: int - icon_custom_emoji_id: str | None = None + icon_custom_emoji_id: Optional[str] = None class ForumTopicEdited(BaseModel): - name: str | None = None - icon_custom_emoji_id: str | None = None + name: Optional[str] = None + icon_custom_emoji_id: Optional[str] = None class ForumTopicClosed(BaseModel): @@ -583,14 +583,14 @@ class GeneralForumTopicUnhidden(BaseModel): class GiveawayCreated(BaseModel): - prize_star_count: int | None = None + prize_star_count: Optional[int] = None class GiveawayCompleted(BaseModel): winner_count: int - unclaimed_prize_count: int | None = None + unclaimed_prize_count: Optional[int] = None giveaway_message: Optional["Message"] = None - is_star_giveaway: Literal[True] | None = None + is_star_giveaway: Optional[Literal[True]] = None class VideoChatScheduled(BaseModel): @@ -620,17 +620,17 @@ class WebAppInfo(BaseModel): class LoginUrl(BaseModel): url: str - forward_text: str | None = None - bot_username: str | None = None - request_write_access: bool | None = None + forward_text: Optional[str] = None + bot_username: Optional[str] = None + request_write_access: Optional[bool] = None class SwitchInlineQueryChosenChat(BaseModel): - query: str | None = None - allow_user_chats: bool | None = None - allow_bot_chats: bool | None = None - allow_group_chats: bool | None = None - allow_channel_chats: bool | None = None + query: Optional[str] = None + allow_user_chats: Optional[bool] = None + allow_bot_chats: Optional[bool] = None + allow_group_chats: Optional[bool] = None + allow_channel_chats: Optional[bool] = None class CopyTextButton(BaseModel): @@ -643,16 +643,16 @@ class CallbackGame(BaseModel): class InlineKeyboardButton(BaseModel): text: str - url: str | None = None - callback_data: str | None = None - web_app: WebAppInfo | None = None - login_url: LoginUrl | None = None - switch_inline_query: str | None = None - switch_inline_query_current_chat: str | None = None - switch_inline_query_chosen_chat: SwitchInlineQueryChosenChat | None = None - copy_text: CopyTextButton | None = None - callback_game: CallbackGame | None = None - pay: bool | None = None + url: Optional[str] = None + callback_data: Optional[str] = None + web_app: Optional[WebAppInfo] = None + login_url: Optional[LoginUrl] = None + switch_inline_query: Optional[str] = None + switch_inline_query_current_chat: Optional[str] = None + switch_inline_query_chosen_chat: Optional[SwitchInlineQueryChosenChat] = None + copy_text: Optional[CopyTextButton] = None + callback_game: Optional[CallbackGame] = None + pay: Optional[bool] = None class InlineKeyboardMarkup(BaseModel): @@ -661,90 +661,90 @@ class InlineKeyboardMarkup(BaseModel): class Message(BaseModel): message_id: int - message_thread_id: int | None = None - from_: User | None = Field(default=None, alias="from") - sender_chat: Chat | None = None - sender_boost_count: int | None = None - sender_business_bot: User | None = None + message_thread_id: Optional[int] = None + from_: Optional[User] = Field(default=None, alias="from") + sender_chat: Optional[Chat] = None + sender_boost_count: Optional[int] = None + sender_business_bot: Optional[User] = None date: int - business_connection_id: str | None = None + business_connection_id: Optional[str] = None chat: Chat - forward_origin: MessageOrigin | None = None - is_topic_message: Literal[True] | None = None - is_automatic_forward: Literal[True] | None = None + forward_origin: Optional[MessageOrigin] = None + is_topic_message: Optional[Literal[True]] = None + is_automatic_forward: Optional[Literal[True]] = None reply_to_message: Optional["Message"] = None - external_reply: ExternalReplyInfo | None = None - quote: TextQuote | None = None - reply_to_story: Story | None = None - via_bot: User | None = None - edit_date: int | None = None - has_protected_content: Literal[True] | None = None - is_from_offline: Literal[True] | None = None - media_group_id: str | None = None - author_signature: str | None = None - text: str | None = None - entities: list[MessageEntity] | None = None - link_preview_options: LinkPreviewOptions | None = None - effect_id: str | None = None - animation: Animation | None = None - audio: Audio | None = None - document: Document | None = None - paid_media: PaidMediaInfo | None = None - photo: list[PhotoSize] | None = None - sticker: Sticker | None = None - story: Story | None = None - video: Video | None = None - video_note: VideoNote | None = None - voice: Voice | None = None - caption: str | None = None - caption_entities: list[MessageEntity] | None = None - show_caption_above_media: Literal[True] | None = None - has_media_spoiler: Literal[True] | None = None - contact: Contact | None = None - dice: Dice | None = None - game: Game | None = None - poll: Poll | None = None - venue: Venue | None = None - location: Location | None = None - new_chat_members: list[User] | None = None - left_chat_member: User | None = None - new_chat_title: str | None = None - new_chat_photo: list[PhotoSize] | None = None - delete_chat_photo: Literal[True] | None = None - group_chat_created: Literal[True] | None = None - supergroup_chat_created: Literal[True] | None = None - channel_chat_created: Literal[True] | None = None - message_auto_delete_timer_changed: MessageAutoDeleteTimerChanged | None = None - migrate_to_chat_id: int | None = None - migrate_from_chat_id: int | None = None - pinned_message: MaybeInaccessibleMessage | None = None - invoice: Invoice | None = None - successful_payment: SuccessfulPayment | None = None - refunded_payment: RefundedPayment | None = None - users_shared: UsersShared | None = None - chat_shared: ChatShared | None = None - connected_website: str | None = None - write_access_allowed: WriteAccessAllowed | None = None - passport_data: PassportData | None = None - proximity_alert_triggered: ProximityAlertTriggered | None = None - boost_added: ChatBoostAdded | None = None - chat_background_set: ChatBackground | None = None - forum_topic_created: ForumTopicCreated | None = None - forum_topic_edited: ForumTopicEdited | None = None - forum_topic_closed: ForumTopicClosed | None = None - forum_topic_reopened: ForumTopicReopened | None = None - general_forum_topic_hidden: GeneralForumTopicHidden | None = None - general_forum_topic_unhidden: GeneralForumTopicUnhidden | None = None - giveaway_created: GiveawayCreated | None = None - giveaway: Giveaway | None = None - giveaway_winners: GiveawayWinners | None = None - giveaway_completed: GiveawayCompleted | None = None - video_chat_scheduled: VideoChatScheduled | None = None - video_chat_started: VideoChatStarted | None = None - video_chat_ended: VideoChatEnded | None = None - video_chat_participants_invited: VideoChatParticipantsInvited | None = None - web_app_data: WebAppData | None = None - reply_markup: InlineKeyboardMarkup | None = None + external_reply: Optional[ExternalReplyInfo] = None + quote: Optional[TextQuote] = None + reply_to_story: Optional[Story] = None + via_bot: Optional[User] = None + edit_date: Optional[int] = None + has_protected_content: Optional[Literal[True]] = None + is_from_offline: Optional[Literal[True]] = None + media_group_id: Optional[str] = None + author_signature: Optional[str] = None + text: Optional[str] = None + entities: Optional[list[MessageEntity]] = None + link_preview_options: Optional[LinkPreviewOptions] = None + effect_id: Optional[str] = None + animation: Optional[Animation] = None + audio: Optional[Audio] = None + document: Optional[Document] = None + paid_media: Optional[PaidMediaInfo] = None + photo: Optional[list[PhotoSize]] = None + sticker: Optional[Sticker] = None + story: Optional[Story] = None + video: Optional[Video] = None + video_note: Optional[VideoNote] = None + voice: Optional[Voice] = None + caption: Optional[str] = None + caption_entities: Optional[list[MessageEntity]] = None + show_caption_above_media: Optional[Literal[True]] = None + has_media_spoiler: Optional[Literal[True]] = None + contact: Optional[Contact] = None + dice: Optional[Dice] = None + game: Optional[Game] = None + poll: Optional[Poll] = None + venue: Optional[Venue] = None + location: Optional[Location] = None + new_chat_members: Optional[list[User]] = None + left_chat_member: Optional[User] = None + new_chat_title: Optional[str] = None + new_chat_photo: Optional[list[PhotoSize]] = None + delete_chat_photo: Optional[Literal[True]] = None + group_chat_created: Optional[Literal[True]] = None + supergroup_chat_created: Optional[Literal[True]] = None + channel_chat_created: Optional[Literal[True]] = None + message_auto_delete_timer_changed: Optional[MessageAutoDeleteTimerChanged] = None + migrate_to_chat_id: Optional[int] = None + migrate_from_chat_id: Optional[int] = None + pinned_message: Optional[MaybeInaccessibleMessage] = None + invoice: Optional[Invoice] = None + successful_payment: Optional[SuccessfulPayment] = None + refunded_payment: Optional[RefundedPayment] = None + users_shared: Optional[UsersShared] = None + chat_shared: Optional[ChatShared] = None + connected_website: Optional[str] = None + write_access_allowed: Optional[WriteAccessAllowed] = None + passport_data: Optional[PassportData] = None + proximity_alert_triggered: Optional[ProximityAlertTriggered] = None + boost_added: Optional[ChatBoostAdded] = None + chat_background_set: Optional[ChatBackground] = None + forum_topic_created: Optional[ForumTopicCreated] = None + forum_topic_edited: Optional[ForumTopicEdited] = None + forum_topic_closed: Optional[ForumTopicClosed] = None + forum_topic_reopened: Optional[ForumTopicReopened] = None + general_forum_topic_hidden: Optional[GeneralForumTopicHidden] = None + general_forum_topic_unhidden: Optional[GeneralForumTopicUnhidden] = None + giveaway_created: Optional[GiveawayCreated] = None + giveaway: Optional[Giveaway] = None + giveaway_winners: Optional[GiveawayWinners] = None + giveaway_completed: Optional[GiveawayCompleted] = None + video_chat_scheduled: Optional[VideoChatScheduled] = None + video_chat_started: Optional[VideoChatStarted] = None + video_chat_ended: Optional[VideoChatEnded] = None + video_chat_participants_invited: Optional[VideoChatParticipantsInvited] = None + web_app_data: Optional[WebAppData] = None + reply_markup: Optional[InlineKeyboardMarkup] = None class BusinessConnection(BaseModel): @@ -782,8 +782,8 @@ class ReactionTypePaid(BaseModel): class MessageReactionUpdated(BaseModel): chat: Chat message_id: int - user: User | None = None - actor_chat: Chat | None = None + user: Optional[User] = None + actor_chat: Optional[Chat] = None date: int old_reaction: list[ReactionType] new_reaction: list[ReactionType] @@ -806,28 +806,28 @@ class InlineQuery(BaseModel): from_: User = Field(alias="from") query: str offset: str - chat_type: Literal["sender", "private", "group", "supergroup", "channel"] | None = ( - None - ) - location: Location | None = None + chat_type: Optional[ + Literal["sender", "private", "group", "supergroup", "channel"] + ] = None + location: Optional[Location] = None class ChosenInlineResult(BaseModel): result_id: str from_: User = Field(alias="from") - location: Location | None = None - inline_message_id: str | None = None + location: Optional[Location] = None + inline_message_id: Optional[str] = None query: str class CallbackQuery(BaseModel): id: str from_: User = Field(alias="from") - message: MaybeInaccessibleMessage | None = None - inline_message_id: str | None = None + message: Optional[MaybeInaccessibleMessage] = None + inline_message_id: Optional[str] = None chat_instance: str - data: str | None = None - game_short_name: str | None = None + data: Optional[str] = None + game_short_name: Optional[str] = None class ShippingQuery(BaseModel): @@ -843,8 +843,8 @@ class PreCheckoutQuery(BaseModel): currency: str total_amount: int invoice_payload: str - shipping_option_id: str | None = None - order_info: OrderInfo | None = None + shipping_option_id: Optional[str] = None + order_info: Optional[OrderInfo] = None class PaidMediaPurchased(BaseModel): @@ -854,8 +854,8 @@ class PaidMediaPurchased(BaseModel): class PollAnswer(BaseModel): poll_id: str - voter_chat: Chat | None = None - user: User | None = None + voter_chat: Optional[Chat] = None + user: Optional[User] = None option_ids: list[int] @@ -863,7 +863,7 @@ class ChatMemberOwner(BaseModel): status: Literal["creator"] = "creator" user: User is_anonymous: bool - custom_title: str | None = None + custom_title: Optional[str] = None class ChatMemberAdministrator(BaseModel): @@ -881,17 +881,17 @@ class ChatMemberAdministrator(BaseModel): can_post_stories: bool can_edit_stories: bool can_delete_stories: bool - can_post_messages: bool | None = None - can_edit_messages: bool | None = None - can_pin_messages: bool | None = None - can_manage_topics: bool | None = None - custom_title: str | None = None + can_post_messages: Optional[bool] = None + can_edit_messages: Optional[bool] = None + can_pin_messages: Optional[bool] = None + can_manage_topics: Optional[bool] = None + custom_title: Optional[str] = None class ChatMemberMember(BaseModel): status: Literal["member"] = "member" user: User - until_date: int | None = None + until_date: Optional[int] = None class ChatMemberRestricted(BaseModel): @@ -942,12 +942,12 @@ class ChatInviteLink(BaseModel): creates_join_request: bool is_primary: bool is_revoked: bool - name: str | None = None - expire_date: int | None = None - member_limit: int | None = None - pending_join_request_count: int | None = None - subscription_period: int | None = None - subscription_price: int | None = None + name: Optional[str] = None + expire_date: Optional[int] = None + member_limit: Optional[int] = None + pending_join_request_count: Optional[int] = None + subscription_period: Optional[int] = None + subscription_price: Optional[int] = None class ChatMemberUpdated(BaseModel): @@ -956,9 +956,9 @@ class ChatMemberUpdated(BaseModel): date: int old_chat_member: ChatMember new_chat_member: ChatMember - invite_link: ChatInviteLink | None = None - via_join_request: bool | None = None - via_chat_folder_invite_link: bool | None = None + invite_link: Optional[ChatInviteLink] = None + via_join_request: Optional[bool] = None + via_chat_folder_invite_link: Optional[bool] = None class ChatJoinRequest(BaseModel): @@ -966,8 +966,8 @@ class ChatJoinRequest(BaseModel): from_: User = Field(alias="from") user_chat_id: int date: int - bio: str | None = None - invite_link: ChatInviteLink | None = None + bio: Optional[str] = None + invite_link: Optional[ChatInviteLink] = None class ChatBoostSourcePremium(BaseModel): @@ -983,9 +983,9 @@ class ChatBoostSourceGiftCode(BaseModel): class ChatBoostSourceGiveaway(BaseModel): source: Literal["giveaway"] = "giveaway" giveaway_message_id: int - user: User | None = None - prize_star_count: int | None = None - is_unclaimed: Literal[True] | None = None + user: Optional[User] = None + prize_star_count: Optional[int] = None + is_unclaimed: Optional[Literal[True]] = None ChatBoostSource = Union[ @@ -1014,41 +1014,41 @@ class ChatBoostRemoved(BaseModel): class Update(BaseModel): update_id: int - message: Message | None = None - edited_message: Message | None = None - channel_post: Message | None = None - edited_channel_post: Message | None = None - business_connection: BusinessConnection | None = None - business_message: Message | None = None - edited_business_message: Message | None = None - deleted_business_messages: BusinessMessagesDeleted | None = None - message_reaction: MessageReactionUpdated | None = None - message_reaction_count: MessageReactionCountUpdated | None = None - inline_query: InlineQuery | None = None - chosen_inline_result: ChosenInlineResult | None = None - callback_query: CallbackQuery | None = None - shipping_query: ShippingQuery | None = None - pre_checkout_query: PreCheckoutQuery | None = None - purchased_paid_media: PaidMediaPurchased | None = None - poll: Poll | None = None - poll_answer: PollAnswer | None = None - my_chat_member: ChatMemberUpdated | None = None - chat_member: ChatMemberUpdated | None = None - chat_join_request: ChatJoinRequest | None = None - chat_boost: ChatBoostUpdated | None = None - removed_chat_boost: ChatBoostRemoved | None = None + message: Optional[Message] = None + edited_message: Optional[Message] = None + channel_post: Optional[Message] = None + edited_channel_post: Optional[Message] = None + business_connection: Optional[BusinessConnection] = None + business_message: Optional[Message] = None + edited_business_message: Optional[Message] = None + deleted_business_messages: Optional[BusinessMessagesDeleted] = None + message_reaction: Optional[MessageReactionUpdated] = None + message_reaction_count: Optional[MessageReactionCountUpdated] = None + inline_query: Optional[InlineQuery] = None + chosen_inline_result: Optional[ChosenInlineResult] = None + callback_query: Optional[CallbackQuery] = None + shipping_query: Optional[ShippingQuery] = None + pre_checkout_query: Optional[PreCheckoutQuery] = None + purchased_paid_media: Optional[PaidMediaPurchased] = None + poll: Optional[Poll] = None + poll_answer: Optional[PollAnswer] = None + my_chat_member: Optional[ChatMemberUpdated] = None + chat_member: Optional[ChatMemberUpdated] = None + chat_join_request: Optional[ChatJoinRequest] = None + chat_boost: Optional[ChatBoostUpdated] = None + removed_chat_boost: Optional[ChatBoostRemoved] = None class WebhookInfo(BaseModel): url: str has_custom_certificate: bool pending_update_count: int - ip_address: str | None = None - last_error_date: int | None = None - last_error_message: str | None = None - last_synchronization_error_date: int | None = None - max_connections: int | None = None - allowed_updates: list[str] | None = None + ip_address: Optional[str] = None + last_error_date: Optional[int] = None + last_error_message: Optional[str] = None + last_synchronization_error_date: Optional[int] = None + max_connections: Optional[int] = None + allowed_updates: Optional[list[str]] = None class ChatPhoto(BaseModel): @@ -1061,18 +1061,18 @@ class ChatPhoto(BaseModel): class Birthdate(BaseModel): day: int month: int - year: int | None = None + year: Optional[int] = None class BusinessIntro(BaseModel): - title: str | None = None - message: str | None = None - sticker: Sticker | None = None + title: Optional[str] = None + message: Optional[str] = None + sticker: Optional[Sticker] = None class BusinessLocation(BaseModel): address: str - location: Location | None = None + location: Optional[Location] = None class BusinessOpeningHoursInterval(BaseModel): @@ -1086,20 +1086,20 @@ class BusinessOpeningHours(BaseModel): class ChatPermissions(BaseModel): - can_send_messages: bool | None = None - can_send_audios: bool | None = None - can_send_documents: bool | None = None - can_send_photos: bool | None = None - can_send_videos: bool | None = None - can_send_video_notes: bool | None = None - can_send_voice_notes: bool | None = None - can_send_polls: bool | None = None - can_send_other_messages: bool | None = None - can_add_web_page_previews: bool | None = None - can_change_info: bool | None = None - can_invite_users: bool | None = None - can_pin_messages: bool | None = None - can_manage_topics: bool | None = None + can_send_messages: Optional[bool] = None + can_send_audios: Optional[bool] = None + can_send_documents: Optional[bool] = None + can_send_photos: Optional[bool] = None + can_send_videos: Optional[bool] = None + can_send_video_notes: Optional[bool] = None + can_send_voice_notes: Optional[bool] = None + can_send_polls: Optional[bool] = None + can_send_other_messages: Optional[bool] = None + can_add_web_page_previews: Optional[bool] = None + can_change_info: Optional[bool] = None + can_invite_users: Optional[bool] = None + can_pin_messages: Optional[bool] = None + can_manage_topics: Optional[bool] = None class ChatLocation(BaseModel): @@ -1110,48 +1110,48 @@ class ChatLocation(BaseModel): class ChatFullInfo(BaseModel): id: int type: Literal["private", "group", "supergroup", "channel"] - title: str | None = None - username: str | None = None - first_name: str | None = None - last_name: str | None = None - is_forum: Literal[True] | None = None + title: Optional[str] = None + username: Optional[str] = None + first_name: Optional[str] = None + last_name: Optional[str] = None + is_forum: Optional[Literal[True]] = None accent_color_id: int max_reaction_count: int - photo: ChatPhoto | None = None - active_usernames: list[str] | None = None - birthdate: Birthdate | None = None - business_intro: BusinessIntro | None = None - business_location: BusinessLocation | None = None - business_opening_hours: BusinessOpeningHours | None = None - personal_chat: Chat | None = None - available_reactions: list[ReactionType] | None = None - background_custom_emoji_id: str | None = None - profile_accent_color_id: int | None = None - profile_background_custom_emoji_id: str | None = None - emoji_status_custom_emoji_id: str | None = None - emoji_status_expiration_date: int | None = None - bio: str | None = None - has_private_forwards: Literal[True] | None = None - has_restricted_voice_and_video_messages: Literal[True] | None = None - join_to_send_messages: Literal[True] | None = None - join_by_request: Literal[True] | None = None - description: str | None = None - invite_link: str | None = None + photo: Optional[ChatPhoto] = None + active_usernames: Optional[list[str]] = None + birthdate: Optional[Birthdate] = None + business_intro: Optional[BusinessIntro] = None + business_location: Optional[BusinessLocation] = None + business_opening_hours: Optional[BusinessOpeningHours] = None + personal_chat: Optional[Chat] = None + available_reactions: Optional[list[ReactionType]] = None + background_custom_emoji_id: Optional[str] = None + profile_accent_color_id: Optional[int] = None + profile_background_custom_emoji_id: Optional[str] = None + emoji_status_custom_emoji_id: Optional[str] = None + emoji_status_expiration_date: Optional[int] = None + bio: Optional[str] = None + has_private_forwards: Optional[Literal[True]] = None + has_restricted_voice_and_video_messages: Optional[Literal[True]] = None + join_to_send_messages: Optional[Literal[True]] = None + join_by_request: Optional[Literal[True]] = None + description: Optional[str] = None + invite_link: Optional[str] = None pinned_message: Optional["Message"] = None - permissions: ChatPermissions | None = None - can_send_paid_media: Literal[True] | None = None - slow_mode_delay: int | None = None - unrestrict_boost_count: int | None = None - message_auto_delete_time: int | None = None - has_aggressive_anti_spam_enabled: Literal[True] | None = None - has_hidden_members: Literal[True] | None = None - has_protected_content: Literal[True] | None = None - has_visible_history: Literal[True] | None = None - sticker_set_name: str | None = None - can_set_sticker_set: Literal[True] | None = None - custom_emoji_sticker_set_name: str | None = None - linked_chat_id: int | None = None - location: ChatLocation | None = None + permissions: Optional[ChatPermissions] = None + can_send_paid_media: Optional[Literal[True]] = None + slow_mode_delay: Optional[int] = None + unrestrict_boost_count: Optional[int] = None + message_auto_delete_time: Optional[int] = None + has_aggressive_anti_spam_enabled: Optional[Literal[True]] = None + has_hidden_members: Optional[Literal[True]] = None + has_protected_content: Optional[Literal[True]] = None + has_visible_history: Optional[Literal[True]] = None + sticker_set_name: Optional[str] = None + can_set_sticker_set: Optional[Literal[True]] = None + custom_emoji_sticker_set_name: Optional[str] = None + linked_chat_id: Optional[int] = None + location: Optional[ChatLocation] = None class MessageId(BaseModel): @@ -1160,18 +1160,18 @@ class MessageId(BaseModel): class ReplyParameters(BaseModel): message_id: int - chat_id: int | str | None = None - allow_sending_without_reply: bool | None = None - quote: str | None = None - quote_parse_mode: Literal["MarkdownV2", "HTML"] | None = None - quote_entities: list[MessageEntity] | None = None - quote_position: int | None = None + chat_id: Optional[Union[int, str]] = None + allow_sending_without_reply: Optional[bool] = None + quote: Optional[str] = None + quote_parse_mode: Optional[Literal["MarkdownV2", "HTML"]] = None + quote_entities: Optional[list[MessageEntity]] = None + quote_position: Optional[int] = None class InputPollOption(BaseModel): text: str - text_parse_mode: str | None = None - text_entities: list[MessageEntity] | None = None + text_parse_mode: Optional[str] = None + text_entities: Optional[list[MessageEntity]] = None class UserProfilePhotos(BaseModel): @@ -1181,12 +1181,12 @@ class UserProfilePhotos(BaseModel): class KeyboardButtonRequestUsers(BaseModel): request_id: int - user_is_bot: bool | None = None - user_is_premium: bool | None = None - max_quantity: int | None = None - request_name: bool | None = None - request_username: bool | None = None - request_photo: bool | None = None + user_is_bot: Optional[bool] = None + user_is_premium: Optional[bool] = None + max_quantity: Optional[int] = None + request_name: Optional[bool] = None + request_username: Optional[bool] = None + request_photo: Optional[bool] = None class ChatAdministratorRights(BaseModel): @@ -1201,65 +1201,65 @@ class ChatAdministratorRights(BaseModel): can_post_stories: bool can_edit_stories: bool can_delete_stories: bool - can_post_messages: bool | None = None - can_edit_messages: bool | None = None - can_pin_messages: bool | None = None - can_manage_topics: bool | None = None + can_post_messages: Optional[bool] = None + can_edit_messages: Optional[bool] = None + can_pin_messages: Optional[bool] = None + can_manage_topics: Optional[bool] = None class KeyboardButtonRequestChat(BaseModel): request_id: int chat_is_channel: bool - chat_is_forum: bool | None = None - chat_has_username: bool | None = None - chat_is_created: bool | None = None - user_administrator_rights: ChatAdministratorRights | None = None - bot_administrator_rights: ChatAdministratorRights | None = None - bot_is_member: bool | None = None - request_title: bool | None = None - request_username: bool | None = None - request_photo: bool | None = None + chat_is_forum: Optional[bool] = None + chat_has_username: Optional[bool] = None + chat_is_created: Optional[bool] = None + user_administrator_rights: Optional[ChatAdministratorRights] = None + bot_administrator_rights: Optional[ChatAdministratorRights] = None + bot_is_member: Optional[bool] = None + request_title: Optional[bool] = None + request_username: Optional[bool] = None + request_photo: Optional[bool] = None class KeyboardButtonPollType(BaseModel): - type: str | None = None + type: Optional[str] = None class KeyboardButton(BaseModel): text: str - request_users: KeyboardButtonRequestUsers | None = None - request_chat: KeyboardButtonRequestChat | None = None - request_contact: bool | None = None - request_location: bool | None = None - request_poll: KeyboardButtonPollType | None = None - web_app: WebAppInfo | None = None + request_users: Optional[KeyboardButtonRequestUsers] = None + request_chat: Optional[KeyboardButtonRequestChat] = None + request_contact: Optional[bool] = None + request_location: Optional[bool] = None + request_poll: Optional[KeyboardButtonPollType] = None + web_app: Optional[WebAppInfo] = None class ReplyKeyboardMarkup(BaseModel): keyboard: list[list[KeyboardButton]] - is_persistent: bool | None = None - resize_keyboard: bool | None = None - one_time_keyboard: bool | None = None - input_field_placeholder: str | None = None - selective: bool | None = None + is_persistent: Optional[bool] = None + resize_keyboard: Optional[bool] = None + one_time_keyboard: Optional[bool] = None + input_field_placeholder: Optional[str] = None + selective: Optional[bool] = None class ReplyKeyboardRemove(BaseModel): remove_keyboard: Literal[True] - selective: bool | None = None + selective: Optional[bool] = None class ForceReply(BaseModel): force_reply: Literal[True] - input_field_placeholder: str | None = None - selective: bool | None = None + input_field_placeholder: Optional[str] = None + selective: Optional[bool] = None class ForumTopic(BaseModel): message_thread_id: int name: str icon_color: int - icon_custom_emoji_id: str | None = None + icon_custom_emoji_id: Optional[str] = None class BotCommand(BaseModel): @@ -1285,17 +1285,17 @@ class BotCommandScopeAllChatAdministrators(BaseModel): class BotCommandScopeChat(BaseModel): type: Literal["chat"] = "chat" - chat_id: int | str + chat_id: Union[int, str] class BotCommandScopeChatAdministrators(BaseModel): type: Literal["chat_administrators"] = "chat_administrators" - chat_id: int | str + chat_id: Union[int, str] class BotCommandScopeChatMember(BaseModel): type: Literal["chat_member"] = "chat_member" - chat_id: int | str + chat_id: Union[int, str] user_id: int @@ -1344,8 +1344,8 @@ class UserChatBoosts(BaseModel): class ResponseParameters(BaseModel): - migrate_to_chat_id: int | None = None - retry_after: int | None = None + migrate_to_chat_id: Optional[int] = None + retry_after: Optional[int] = None InputFile = Union[bytes, tuple[str, bytes]] @@ -1353,62 +1353,62 @@ class ResponseParameters(BaseModel): class InputMediaAnimation(BaseModel): type: Literal["animation"] = "animation" - media: str | InputFile - thumbnail: str | InputFile | None = None - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - width: int | None = None - height: int | None = None - duration: int | None = None - has_spoiler: bool | None = None + media: Union[str, InputFile] + thumbnail: Optional[Union[str, InputFile]] = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + width: Optional[int] = None + height: Optional[int] = None + duration: Optional[int] = None + has_spoiler: Optional[bool] = None class InputMediaDocument(BaseModel): type: Literal["document"] = "document" - media: str | InputFile - thumbnail: str | InputFile | None = None - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - disable_content_type_detection: bool | None = None + media: Union[str, InputFile] + thumbnail: Optional[Union[str, InputFile]] = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + disable_content_type_detection: Optional[bool] = None class InputMediaAudio(BaseModel): type: Literal["audio"] = "audio" - media: str | InputFile - thumbnail: str | InputFile | None = None - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - duration: int | None = None - performer: str | None = None - title: str | None = None + media: Union[str, InputFile] + thumbnail: Optional[Union[str, InputFile]] = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + duration: Optional[int] = None + performer: Optional[str] = None + title: Optional[str] = None class InputMediaPhoto(BaseModel): type: Literal["photo"] = "photo" - media: str | InputFile - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - show_caption_above_media: bool | None = None - has_spoiler: bool | None = None + media: Union[str, InputFile] + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + show_caption_above_media: Optional[bool] = None + has_spoiler: Optional[bool] = None class InputMediaVideo(BaseModel): type: Literal["video"] = "video" - media: str | InputFile - thumbnail: str | InputFile | None = None - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - show_caption_above_media: bool | None = None - width: int | None = None - height: int | None = None - duration: int | None = None - supports_streaming: bool | None = None - has_spoiler: bool | None = None + media: Union[str, InputFile] + thumbnail: Optional[Union[str, InputFile]] = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + show_caption_above_media: Optional[bool] = None + width: Optional[int] = None + height: Optional[int] = None + duration: Optional[int] = None + supports_streaming: Optional[bool] = None + has_spoiler: Optional[bool] = None InputMedia = Union[ @@ -1422,17 +1422,17 @@ class InputMediaVideo(BaseModel): class InputPaidMediaPhoto(BaseModel): type: Literal["photo"] = "photo" - media: str | InputFile + media: Union[str, InputFile] class InputPaidMediaVideo(BaseModel): type: Literal["video"] = "video" - media: str | InputFile - thumbnail: str | InputFile | None = None - width: int | None = None - height: int | None = None - duration: int | None = None - supports_streaming: bool | None = None + media: Union[str, InputFile] + thumbnail: Optional[Union[str, InputFile]] = None + width: Optional[int] = None + height: Optional[int] = None + duration: Optional[int] = None + supports_streaming: Optional[bool] = None InputPaidMedia = Union[InputPaidMediaPhoto, InputPaidMediaVideo] @@ -1443,37 +1443,37 @@ class StickerSet(BaseModel): title: str sticker_type: Literal["regular", "mask", "custom_emoji"] stickers: list[Sticker] - thumbnail: PhotoSize | None = None + thumbnail: Optional[PhotoSize] = None class InputSticker(BaseModel): - sticker: str | InputFile + sticker: Union[str, InputFile] format: Literal["static", "animated", "video"] emoji_list: list[str] - mask_position: MaskPosition | None = None - keywords: list[str] | None = None + mask_position: Optional[MaskPosition] = None + keywords: Optional[list[str]] = None class InlineQueryResultsButton(BaseModel): text: str - web_app: WebAppInfo | None = None - start_parameter: str | None = None + web_app: Optional[WebAppInfo] = None + start_parameter: Optional[str] = None class InputTextMessageContent(BaseModel): message_text: str - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - entities: list[MessageEntity] | None = None - link_preview_options: LinkPreviewOptions | None = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + entities: Optional[list[MessageEntity]] = None + link_preview_options: Optional[LinkPreviewOptions] = None class InputLocationMessageContent(BaseModel): latitude: float longitude: float - horizontal_accuracy: float | None = None - live_period: int | None = None - heading: int | None = None - proximity_alert_radius: int | None = None + horizontal_accuracy: Optional[float] = None + live_period: Optional[int] = None + heading: Optional[int] = None + proximity_alert_radius: Optional[int] = None class InputVenueMessageContent(BaseModel): @@ -1481,17 +1481,17 @@ class InputVenueMessageContent(BaseModel): longitude: float title: str address: str - foursquare_id: str | None = None - foursquare_type: str | None = None - google_place_id: str | None = None - google_place_type: str | None = None + foursquare_id: Optional[str] = None + foursquare_type: Optional[str] = None + google_place_id: Optional[str] = None + google_place_type: Optional[str] = None class InputContactMessageContent(BaseModel): phone_number: str first_name: str - last_name: str | None = None - vcard: str | None = None + last_name: Optional[str] = None + vcard: Optional[str] = None class LabeledPrice(BaseModel): @@ -1503,23 +1503,23 @@ class InputInvoiceMessageContent(BaseModel): title: str description: str payload: str - provider_token: str | None = None + provider_token: Optional[str] = None currency: str prices: list[LabeledPrice] - max_tip_amount: int | None = None - suggested_tip_amounts: list[int] | None = None - provider_data: str | None = None - photo_url: str | None = None - photo_size: int | None = None - photo_width: int | None = None - photo_height: int | None = None - need_name: bool | None = None - need_phone_number: bool | None = None - need_email: bool | None = None - need_shipping_address: bool | None = None - send_phone_number_to_provider: bool | None = None - send_email_to_provider: bool | None = None - is_flexible: bool | None = None + max_tip_amount: Optional[int] = None + suggested_tip_amounts: Optional[list[int]] = None + provider_data: Optional[str] = None + photo_url: Optional[str] = None + photo_size: Optional[int] = None + photo_width: Optional[int] = None + photo_height: Optional[int] = None + need_name: Optional[bool] = None + need_phone_number: Optional[bool] = None + need_email: Optional[bool] = None + need_shipping_address: Optional[bool] = None + send_phone_number_to_provider: Optional[bool] = None + send_email_to_provider: Optional[bool] = None + is_flexible: Optional[bool] = None InputMessageContent = Union[ @@ -1535,11 +1535,11 @@ class InlineQueryResultCachedAudio(BaseModel): type: Literal["audio"] = "audio" id: str audio_file_id: str - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None class InlineQueryResultCachedDocument(BaseModel): @@ -1547,60 +1547,60 @@ class InlineQueryResultCachedDocument(BaseModel): id: str title: str document_file_id: str - description: str | None = None - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + description: Optional[str] = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None class InlineQueryResultCachedGif(BaseModel): type: Literal["gif"] = "gif" id: str gif_file_id: str - title: str | None = None - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - show_caption_above_media: bool | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + title: Optional[str] = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + show_caption_above_media: Optional[bool] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None class InlineQueryResultCachedMpeg4Gif(BaseModel): type: Literal["mpeg4_gif"] = "mpeg4_gif" id: str mpeg4_file_id: str - title: str | None = None - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - show_caption_above_media: bool | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + title: Optional[str] = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + show_caption_above_media: Optional[bool] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None class InlineQueryResultCachedPhoto(BaseModel): type: Literal["photo"] = "photo" id: str photo_file_id: str - title: str | None = None - description: str | None = None - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - show_caption_above_media: bool | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + title: Optional[str] = None + description: Optional[str] = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + show_caption_above_media: Optional[bool] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None class InlineQueryResultCachedSticker(BaseModel): type: Literal["sticker"] = "sticker" id: str sticker_file_id: str - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None class InlineQueryResultCachedVideo(BaseModel): @@ -1608,13 +1608,13 @@ class InlineQueryResultCachedVideo(BaseModel): id: str video_file_id: str title: str - description: str | None = None - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - show_caption_above_media: bool | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + description: Optional[str] = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + show_caption_above_media: Optional[bool] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None class InlineQueryResultCachedVoice(BaseModel): @@ -1622,11 +1622,11 @@ class InlineQueryResultCachedVoice(BaseModel): id: str voice_file_id: str title: str - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None class InlineQueryResultArticle(BaseModel): @@ -1634,13 +1634,13 @@ class InlineQueryResultArticle(BaseModel): id: str title: str input_message_content: InputMessageContent - reply_markup: InlineKeyboardMarkup | None = None - url: str | None = None - hide_url: bool | None = None - description: str | None = None - thumbnail_url: str | None = None - thumbnail_width: int | None = None - thumbnail_height: int | None = None + reply_markup: Optional[InlineKeyboardMarkup] = None + url: Optional[str] = None + hide_url: Optional[bool] = None + description: Optional[str] = None + thumbnail_url: Optional[str] = None + thumbnail_width: Optional[int] = None + thumbnail_height: Optional[int] = None class InlineQueryResultAudio(BaseModel): @@ -1648,13 +1648,13 @@ class InlineQueryResultAudio(BaseModel): id: str audio_url: str title: str - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - performer: str | None = None - audio_duration: int | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + performer: Optional[str] = None + audio_duration: Optional[int] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None class InlineQueryResultContact(BaseModel): @@ -1662,55 +1662,55 @@ class InlineQueryResultContact(BaseModel): id: str phone_number: str first_name: str - last_name: str | None = None - vcard: str | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None - thumbnail_url: str | None = None - thumbnail_width: int | None = None - thumbnail_height: int | None = None + last_name: Optional[str] = None + vcard: Optional[str] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None + thumbnail_url: Optional[str] = None + thumbnail_width: Optional[int] = None + thumbnail_height: Optional[int] = None class InlineQueryResultGame(BaseModel): type: Literal["game"] = "game" id: str game_short_name: str - reply_markup: InlineKeyboardMarkup | None = None + reply_markup: Optional[InlineKeyboardMarkup] = None class InlineQueryResultDocument(BaseModel): type: Literal["document"] = "document" id: str title: str - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None document_url: str mime_type: str - description: str | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None - thumbnail_url: str | None = None - thumbnail_width: int | None = None - thumbnail_height: int | None = None + description: Optional[str] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None + thumbnail_url: Optional[str] = None + thumbnail_width: Optional[int] = None + thumbnail_height: Optional[int] = None class InlineQueryResultGif(BaseModel): type: Literal["gif"] = "gif" id: str gif_url: str - gif_width: int | None = None - gif_height: int | None = None - gif_duration: int | None = None + gif_width: Optional[int] = None + gif_height: Optional[int] = None + gif_duration: Optional[int] = None thumbnail_url: str - thumbnail_mime_type: str | None = None - title: str | None = None - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - show_caption_above_media: bool | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + thumbnail_mime_type: Optional[str] = None + title: Optional[str] = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + show_caption_above_media: Optional[bool] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None class InlineQueryResultLocation(BaseModel): @@ -1719,33 +1719,33 @@ class InlineQueryResultLocation(BaseModel): latitude: float longitude: float title: str - horizontal_accuracy: float | None = None - live_period: int | None = None - heading: int | None = None - proximity_alert_radius: int | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None - thumbnail_url: str | None = None - thumbnail_width: int | None = None - thumbnail_height: int | None = None + horizontal_accuracy: Optional[float] = None + live_period: Optional[int] = None + heading: Optional[int] = None + proximity_alert_radius: Optional[int] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None + thumbnail_url: Optional[str] = None + thumbnail_width: Optional[int] = None + thumbnail_height: Optional[int] = None class InlineQueryResultMpeg4Gif(BaseModel): type: Literal["mpeg4_gif"] = "mpeg4_gif" id: str mpeg4_url: str - mpeg4_width: int | None = None - mpeg4_height: int | None = None - mpeg4_duration: int | None = None + mpeg4_width: Optional[int] = None + mpeg4_height: Optional[int] = None + mpeg4_duration: Optional[int] = None thumbnail_url: str - thumbnail_mime_type: str | None = None - title: str | None = None - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - show_caption_above_media: bool | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + thumbnail_mime_type: Optional[str] = None + title: Optional[str] = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + show_caption_above_media: Optional[bool] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None class InlineQueryResultPhoto(BaseModel): @@ -1753,16 +1753,16 @@ class InlineQueryResultPhoto(BaseModel): id: str photo_url: str thumbnail_url: str - photo_width: int | None = None - photo_height: int | None = None - title: str | None = None - description: str | None = None - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - show_caption_above_media: bool | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + photo_width: Optional[int] = None + photo_height: Optional[int] = None + title: Optional[str] = None + description: Optional[str] = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + show_caption_above_media: Optional[bool] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None class InlineQueryResultVenue(BaseModel): @@ -1772,15 +1772,15 @@ class InlineQueryResultVenue(BaseModel): longitude: float title: str address: str - foursquare_id: str | None = None - foursquare_type: str | None = None - google_place_id: str | None = None - google_place_type: str | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None - thumbnail_url: str | None = None - thumbnail_width: int | None = None - thumbnail_height: int | None = None + foursquare_id: Optional[str] = None + foursquare_type: Optional[str] = None + google_place_id: Optional[str] = None + google_place_type: Optional[str] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None + thumbnail_url: Optional[str] = None + thumbnail_width: Optional[int] = None + thumbnail_height: Optional[int] = None class InlineQueryResultVideo(BaseModel): @@ -1790,16 +1790,16 @@ class InlineQueryResultVideo(BaseModel): mime_type: str thumbnail_url: str title: str - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - show_caption_above_media: bool | None = None - video_width: int | None = None - video_height: int | None = None - video_duration: int | None = None - description: str | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + show_caption_above_media: Optional[bool] = None + video_width: Optional[int] = None + video_height: Optional[int] = None + video_duration: Optional[int] = None + description: Optional[str] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None class InlineQueryResultVoice(BaseModel): @@ -1807,12 +1807,12 @@ class InlineQueryResultVoice(BaseModel): id: str voice_url: str title: str - caption: str | None = None - parse_mode: Literal["MarkdownV2", "Markdown" "HTML"] | None = None - caption_entities: list[MessageEntity] | None = None - voice_duration: int | None = None - reply_markup: InlineKeyboardMarkup | None = None - input_message_content: InputMessageContent | None = None + caption: Optional[str] = None + parse_mode: Optional[Literal["MarkdownV2", "Markdown" "HTML"]] = None + caption_entities: Optional[list[MessageEntity]] = None + voice_duration: Optional[int] = None + reply_markup: Optional[InlineKeyboardMarkup] = None + input_message_content: Optional[InputMessageContent] = None InlineQueryResult = Union[ @@ -1840,7 +1840,7 @@ class InlineQueryResultVoice(BaseModel): class SentWebAppMessage(BaseModel): - inline_message_id: str | None = None + inline_message_id: Optional[str] = None class ShippingOption(BaseModel): @@ -1873,14 +1873,14 @@ class RevenueWithdrawalStateFailed(BaseModel): class TransactionPartnerUser(BaseModel): type: str user: User - invoice_payload: str | None = None - paid_media: list[PaidMedia] | None = None - paid_media_payload: str | None = None + invoice_payload: Optional[str] = None + paid_media: Optional[list[PaidMedia]] = None + paid_media_payload: Optional[str] = None class TransactionPartnerFragment(BaseModel): type: str - withdrawal_state: RevenueWithdrawalState | None = None + withdrawal_state: Optional[RevenueWithdrawalState] = None class TransactionPartnerTelegramAds(BaseModel): @@ -1909,8 +1909,8 @@ class StarTransaction(BaseModel): id: str amount: int date: int - source: TransactionPartner | None = None - receiver: TransactionPartner | None = None + source: Optional[TransactionPartner] = None + receiver: Optional[TransactionPartner] = None class StarTransactions(BaseModel): diff --git a/pyproject.toml b/pyproject.toml index d658162..da0ed47 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,7 @@ tests = [ [tool.black] line-length = 88 -target-version = ["py310", "py311", "py312"] +target-version = ["py39", "py310", "py311", "py312"] include = '\.pyi?$' extend-exclude = ''' ''' @@ -61,7 +61,7 @@ extra_standard_library = ["typing_extensions"] [tool.ruff] line-length = 88 -target-version = "py310" +target-version = "py39" [tool.ruff.lint] select = [ @@ -96,7 +96,7 @@ addopts = "--cov nonebot/adapters/telegram --cov-report term-missing" [tool.pyright] reportShadowedImports = false -pythonVersion = "3.10" +pythonVersion = "3.9" pythonPlatform = "All" typeCheckingMode = "basic" ignore = ["./example", "./tests"] From 3ca9bd5af50d5bcaf1f4324ce970c36bd6d46882 Mon Sep 17 00:00:00 2001 From: shoucandanghehe Date: Fri, 5 Jun 2026 19:27:20 +0800 Subject: [PATCH 5/6] :bug: avoid close timeout for polling requests --- nonebot/adapters/telegram/adapter.py | 1 - tests/test_bot.py | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/nonebot/adapters/telegram/adapter.py b/nonebot/adapters/telegram/adapter.py index 3efbae6..1e770b7 100644 --- a/nonebot/adapters/telegram/adapter.py +++ b/nonebot/adapters/telegram/adapter.py @@ -176,7 +176,6 @@ async def _call_api(self, bot: Bot, api: str, **data) -> Any: total=DEFAULT_TIMEOUT.total, connect=DEFAULT_TIMEOUT.connect, read=float(timeout) + 5, - close=DEFAULT_TIMEOUT.close, ) # 分离文件到 files diff --git a/tests/test_bot.py b/tests/test_bot.py index 0270389..cfca7d7 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -13,6 +13,7 @@ @pytest.mark.asyncio async def test_get_updates_sets_driver_read_timeout(app: App): + from nonebot.utils import UNSET from nonebot.drivers import DEFAULT_TIMEOUT, Timeout, Response import nonebot @@ -45,6 +46,7 @@ async def request(setup): assert timeout.read == 35.0 assert timeout.connect == DEFAULT_TIMEOUT.connect assert timeout.total == DEFAULT_TIMEOUT.total + assert timeout.close is UNSET @pytest.mark.asyncio From 31c251467be079aa396005faf628dfcd54972823 Mon Sep 17 00:00:00 2001 From: shoucandanghehe Date: Fri, 5 Jun 2026 19:28:42 +0800 Subject: [PATCH 6/6] :bug: keep polling timeout test behavioral --- tests/test_bot.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_bot.py b/tests/test_bot.py index cfca7d7..0270389 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -13,7 +13,6 @@ @pytest.mark.asyncio async def test_get_updates_sets_driver_read_timeout(app: App): - from nonebot.utils import UNSET from nonebot.drivers import DEFAULT_TIMEOUT, Timeout, Response import nonebot @@ -46,7 +45,6 @@ async def request(setup): assert timeout.read == 35.0 assert timeout.connect == DEFAULT_TIMEOUT.connect assert timeout.total == DEFAULT_TIMEOUT.total - assert timeout.close is UNSET @pytest.mark.asyncio