Compare commits

...

38 Commits

Author SHA1 Message Date
Hinrich Mahler 680dc2b6b8 Bump Version to v20.8 2024-02-08 18:36:28 +01:00
Bibo-Joshi 04d86deb58 Documentation Improvements (#4002, #4079, #4104)
Co-authored-by: Poolitzer <github@poolitzer.eu>
Co-authored-by: Kenji Tagawa <61639117+kenjitagawa@users.noreply.github.com>
Co-authored-by: Kenji Tagawa <kenji@tagawa.ca>
Co-authored-by: Alexandre Rodrigues Batista <40678306+xTudoS@users.noreply.github.com>
2024-02-08 17:58:33 +01:00
Aditya Yadav 03d2359061 API 7.0 (#4034, #4038)
Co-authored-by: poolitzer <github@poolitzer.eu>
Co-authored-by: Hinrich Mahler <22366557+Bibo-Joshi@users.noreply.github.com>
Co-authored-by: Harshil <37377066+harshil21@users.noreply.github.com>
Co-authored-by: aelkheir <arelkheir@gmail.com>
Co-authored-by: aelkheir <90580077+aelkheir@users.noreply.github.com>
2024-02-08 17:12:00 +01:00
Bibo-Joshi 29866e2139 Add Bot.do_api_request (#4084) 2024-02-07 22:35:09 +01:00
pre-commit-ci[bot] 7e9537ece2 pre-commit autoupdate (#4101)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Harshil <37377066+harshil21@users.noreply.github.com>
2024-02-07 22:20:21 +01:00
Bibo-Joshi baa01596c3 Drop Usage of DeepSource (#4100) 2024-02-07 20:45:57 +01:00
Harshil c23eb8ec08 Bump black and ruff (#4089)
Co-authored-by: Hinrich Mahler <22366557+Bibo-Joshi@users.noreply.github.com>
2024-02-05 19:24:00 +01:00
Harshil 6ae7add722 Migrate From setup.cfg to pyproject.toml Where Possible (#4088) 2024-02-05 17:28:47 +01:00
dependabot[bot] f3bda29e51 Bump furo from 2023.9.10 to 2024.1.29 (#4094)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-03 16:49:41 +01:00
dependabot[bot] fe0421a822 Bump codecov/codecov-action from 3 to 4 (#4091)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Hinrich Mahler <22366557+Bibo-Joshi@users.noreply.github.com>
2024-02-02 23:56:59 +01:00
dependabot[bot] 0325a024d6 Bump EndBug/add-and-commit from 9.1.3 to 9.1.4 (#4090)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-02 23:00:37 +01:00
Bibo-Joshi 2f65fcc292 Deprecate filters.CHAT (#4083) 2024-01-29 13:13:41 +01:00
Harshil 2d63c57ed6 Bump ruff and Remove sort-all (#4075) 2024-01-24 20:53:36 +01:00
Bibo-Joshi b73dc5728e Add Missing Conversions of type to Corresponding Enum from telegram.constants (#4067) 2024-01-17 21:32:37 +01:00
Lucas Molinari f452c132fa Move Handler Files to _handlers Subdirectory (#4064) 2024-01-15 20:15:33 +01:00
dependabot[bot] ebf7f3be12 Bump pytest from 7.4.3 to 7.4.4 (#4056)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-14 17:27:57 +01:00
Bibo-Joshi dc284a1a73 Introduce sort-all Hook for pre-commit (#4052) 2024-01-08 18:35:32 +01:00
dependabot[bot] 979988add1 Bump test-summary/action from 2.1 to 2.2 (#4044)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <dependabot[bot]@users.noreply.github.com>
Co-authored-by: Hinrich Mahler <22366557+Bibo-Joshi@users.noreply.github.com>
2024-01-03 21:43:41 +01:00
Bibo-Joshi 1ae759ff5c Use Recommended pre-commit Mirror for black (#4051) 2024-01-03 21:42:56 +01:00
dependabot[bot] 1ab91370ac Bump actions/stale from 8 to 9 (#4046)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-03 17:07:57 +01:00
dependabot[bot] 29d073871a Bump srvaroa/labeler from 1.8.0 to 1.10.0 (#4048)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <dependabot[bot]@users.noreply.github.com>
Co-authored-by: Bibo-Joshi <22366557+Bibo-Joshi@users.noreply.github.com>
2024-01-03 16:53:21 +01:00
dependabot[bot] d03b4ec688 Bump actions/setup-python from 4 to 5 (#4047)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-03 16:43:35 +01:00
dependabot[bot] 07d9dc7a44 Bump actions/upload-artifact from 3 to 4 (#4045)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-03 16:41:03 +01:00
aelkheir f3479cd170 Add Parameter pattern to PreCheckoutQueryHandler and filters.SuccessfulPayment (#4005) 2024-01-02 18:35:38 +01:00
pre-commit-ci[bot] 7fcfad41a5 pre-commit autoupdate (#4043)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2024-01-01 22:49:24 +01:00
Palaptin c33c541cbe Fix Type Hint for filters Parameter of MessageHandler (#4039) 2024-01-01 15:58:50 +01:00
Bibo-Joshi 57c2f6e01e Improve Type Completeness & Corresponding Workflow (#4035) 2023-12-29 22:48:45 +01:00
dependabot[bot] a52c91996e Update httpx requirement from ~=0.25.2 to ~=0.26.0 (#4024)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <dependabot[bot]@users.noreply.github.com>
Co-authored-by: Hinrich Mahler <22366557+Bibo-Joshi@users.noreply.github.com>
2023-12-29 22:32:07 +01:00
Poolitzer 2345bfbb53 Add Support for Unix Sockets to Updater.start_webhook (#3986)
Co-authored-by: Bibo-Joshi <22366557+Bibo-Joshi@users.noreply.github.com>
2023-12-14 21:37:00 +01:00
Bibo-Joshi cc45f49a4f Add AsyncContextManager as Parent Class to BaseUpdateProcessor (#4001) 2023-12-13 20:22:10 +01:00
Aditya Yadav fd6a0fe899 Add Docstring to Dunder Methods (#3929) 2023-12-10 20:17:11 +01:00
Poolitzer 67b0706116 Improve Error Handling in Built-In Webhook Handler (#3987) 2023-12-09 17:35:23 +01:00
dependabot[bot] 592c6cc6d3 Update tornado requirement from ~=6.3.3 to ~=6.4 (#3992)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <dependabot[bot]@users.noreply.github.com>
Co-authored-by: Bibo-Joshi <22366557+Bibo-Joshi@users.noreply.github.com>
2023-12-09 13:13:20 +01:00
Poolitzer 1fc46360ff Remove Unused DEFAULT_20 (#3997) 2023-12-09 13:12:39 +01:00
pre-commit-ci[bot] 4ad94cc7f7 pre-commit autoupdate (#3996)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Dmitry Kolomatskiy <58207913+lemontree210@users.noreply.github.com>
2023-12-09 13:11:45 +01:00
dependabot[bot] c6a9fbb5c7 Bump dessant/lock-threads from 4.0.1 to 5.0.1 (#3994)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Hinrich Mahler <22366557+Bibo-Joshi@users.noreply.github.com>
2023-12-04 17:58:15 +01:00
dependabot[bot] af8729769b Bump srvaroa/labeler from 1.7.0 to 1.8.0 (#3993)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-04 17:45:47 +01:00
Bibo-Joshi f93f827e33 Documentation Improvements (#3919)
Co-authored-by: Poolitzer <github@poolitzer.eu>
2023-11-27 19:11:25 +01:00
284 changed files with 15861 additions and 2397 deletions
-20
View File
@@ -1,20 +0,0 @@
version = 1
test_patterns = ["tests/**"]
exclude_patterns = [
"tests/**",
"docs/**",
"setup.py",
"setup-raw.py"
]
[[analyzers]]
name = "python"
enabled = true
[analyzers.meta]
runtime_version = "3.x.x"
max_line_length = 99
skip_doc_coverage = ["module", "magic", "init", "nonpublic"]
cyclomatic_complexity_threshold = "high"
+1 -1
View File
@@ -31,7 +31,7 @@ jobs:
exclude: CHANGES.rst
- name: Commit & Push Changes to PR
uses: EndBug/add-and-commit@v9.1.3
uses: EndBug/add-and-commit@v9.1.4
with:
message: 'Update version number in other files'
committer_name: GitHub Actions
+1 -1
View File
@@ -16,7 +16,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
+2 -2
View File
@@ -21,7 +21,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
@@ -35,7 +35,7 @@ jobs:
- name: Build docs
run: sphinx-build docs/source docs/build/html -W --keep-going -j auto
- name: Upload docs
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: HTML Docs
retention-days: 7
+1 -1
View File
@@ -11,7 +11,7 @@ jobs:
pull-requests: write # for srvaroa/labeler to add labels in PR
runs-on: ubuntu-latest
steps:
- uses: srvaroa/labeler@v1.7.0
- uses: srvaroa/labeler@v1.10.0
# Config file at .github/labeler.yml
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
+3 -1
View File
@@ -8,10 +8,12 @@ jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v4.0.1
- uses: dessant/lock-threads@v5.0.1
with:
github-token: ${{ github.token }}
issue-inactive-days: '7'
issue-lock-reason: ''
pr-inactive-days: '7'
pr-lock-reason: ''
# Don't lock Discussions
process-only: 'issues, prs'
+1 -1
View File
@@ -7,7 +7,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v8
- uses: actions/stale@v9
with:
# PRs never get stale
days-before-stale: 3
+2 -2
View File
@@ -22,7 +22,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
@@ -41,7 +41,7 @@ jobs:
- name: Test Summary
id: test_summary
uses: test-summary/action@v2.1
uses: test-summary/action@v2.2
if: always() # always run, even if tests fail
with:
paths: .test_report_official.xml
+9 -1
View File
@@ -15,7 +15,7 @@ jobs:
- uses: actions/checkout@v4
- run: git fetch --depth=1 # https://github.com/actions/checkout/issues/329#issuecomment-674881489
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: 3.9
cache: 'pip'
@@ -50,6 +50,14 @@ jobs:
json.load(open("pr.json", "rb"))["typeCompleteness"]["completenessScore"]
)
base_text = f"This PR changes type completeness from {round(base, 3)} to {round(pr, 3)}."
if base == 0:
text = f"Something is broken in the workflow. Reported type completeness is 0. 💥"
set_summary(text)
print(Path("pr.readable").read_text(encoding="utf-8"))
error(text)
exit(1)
if pr < (base - 0.001):
text = f"{base_text} ❌"
set_summary(text)
+6 -3
View File
@@ -3,9 +3,11 @@ on:
pull_request:
branches:
- master
push:
branches:
- master
schedule:
# Run monday and friday morning at 03:07 - odd time to spread load on GitHub Actions
- cron: '7 3 * * 1,5'
@@ -22,7 +24,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
@@ -79,7 +81,7 @@ jobs:
- name: Test Summary
id: test_summary
uses: test-summary/action@v2.1
uses: test-summary/action@v2.2
if: always() # always run, even if tests fail
with:
paths: |
@@ -87,8 +89,9 @@ jobs:
.test_report_optionals.xml
- name: Submit coverage
uses: codecov/codecov-action@v3
uses: codecov/codecov-action@v4
with:
env_vars: OS,PYTHON
name: ${{ matrix.os }}-${{ matrix.python-version }}
fail_ci_if_error: true
token: ${{ secrets.CODECOV_TOKEN }}
+24 -30
View File
@@ -1,41 +1,47 @@
# Make sure that the additional_dependencies here match requirements.txt
# Make sure that the additional_dependencies here match requirements(-opts).txt
ci:
autofix_prs: false
autoupdate_schedule: monthly
repos:
- repo: https://github.com/psf/black
rev: 23.10.1
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: 'v0.2.1'
hooks:
- id: ruff
name: ruff
files: ^(telegram|examples|tests)/.*\.py$
additional_dependencies:
- httpx~=0.26.0
- tornado~=6.4
- APScheduler~=3.10.4
- cachetools~=5.3.2
- aiolimiter~=1.1.0
- repo: https://github.com/psf/black-pre-commit-mirror
rev: 24.1.1
hooks:
- id: black
args:
- --diff
- --check
- repo: https://github.com/PyCQA/flake8
rev: 6.1.0
rev: 7.0.0
hooks:
- id: flake8
- repo: https://github.com/PyCQA/pylint
rev: v3.0.1
rev: v3.0.3
hooks:
- id: pylint
files: ^(telegram|examples)/.*\.py$
args:
- --rcfile=setup.cfg
# run pylint across multiple cpu cores to speed it up-
# https://pylint.pycqa.org/en/latest/user_guide/run.html?#parallel-execution to know more
- --jobs=0
additional_dependencies:
- httpx~=0.25.2
- tornado~=6.3.3
- httpx~=0.26.0
- tornado~=6.4
- APScheduler~=3.10.4
- cachetools~=5.3.2
- aiolimiter~=1.1.0
- . # this basically does `pip install -e .`
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.6.1
rev: v1.8.0
hooks:
- id: mypy
name: mypy-ptb
@@ -44,8 +50,8 @@ repos:
- types-pytz
- types-cryptography
- types-cachetools
- httpx~=0.25.2
- tornado~=6.3.3
- httpx~=0.26.0
- tornado~=6.4
- APScheduler~=3.10.4
- cachetools~=5.3.2
- aiolimiter~=1.1.0
@@ -57,7 +63,7 @@ repos:
- --no-strict-optional
- --follow-imports=silent
additional_dependencies:
- tornado~=6.3.3
- tornado~=6.4
- APScheduler~=3.10.4
- cachetools~=5.3.2
- . # this basically does `pip install -e .`
@@ -69,22 +75,10 @@ repos:
args:
- --py38-plus
- repo: https://github.com/pycqa/isort
rev: 5.12.0
rev: 5.13.2
hooks:
- id: isort
name: isort
args:
- --diff
- --check
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: 'v0.1.5'
hooks:
- id: ruff
name: ruff
files: ^(telegram|examples|tests)/.*\.py$
additional_dependencies:
- httpx~=0.25.2
- tornado~=6.3.3
- APScheduler~=3.10.4
- cachetools~=5.3.2
- aiolimiter~=1.1.0
+1
View File
@@ -12,6 +12,7 @@ sphinx:
# Optionally build your docs in additional formats such as PDF
formats:
- pdf
- htmlzip
# Optionally set the version of Python and requirements required to build your docs
python:
+3
View File
@@ -25,6 +25,7 @@ The following wonderful people contributed directly or indirectly to this projec
- `Abshar <https://github.com/abxhr>`_
- `Alateas <https://github.com/alateas>`_
- `Ales Dokshanin <https://github.com/alesdokshanin>`_
- `Alexandre <https://github.com/xTudoS>`_
- `Alizia <https://github.com/thefunkycat>`_
- `Ambro17 <https://github.com/Ambro17>`_
- `Andrej Zhilenkov <https://github.com/Andrej730>`_
@@ -69,6 +70,7 @@ The following wonderful people contributed directly or indirectly to this projec
- `Joscha Götzer <https://github.com/Rostgnom>`_
- `jossalgon <https://github.com/jossalgon>`_
- `JRoot3D <https://github.com/JRoot3D>`_
- `kenjitagawa <https://github.com/kenjitagawa>`_
- `kennethcheo <https://github.com/kennethcheo>`_
- `Kirill Vasin <https://github.com/vasinkd>`_
- `Kjwon15 <https://github.com/kjwon15>`_
@@ -76,6 +78,7 @@ The following wonderful people contributed directly or indirectly to this projec
- `Loo Zheng Yuan <https://github.com/loozhengyuan>`_
- `LRezende <https://github.com/lrezende>`_
- `Luca Bellanti <https://github.com/Trifase>`_
- `Lucas Molinari <https://github.com/lucasmolinari>`_
- `macrojames <https://github.com/macrojames>`_
- `Matheus Lemos <https://github.com/mlemosf>`_
- `Michael Dix <https://github.com/Eisberge>`_
+71 -2
View File
@@ -4,12 +4,81 @@
Changelog
=========
Version 20.6
Version 20.8
============
*Released 2024-02-08*
This is the technical changelog for version 20.8. More elaborate release notes can be found in the news channel `@pythontelegrambotchannel <https://t.me/pythontelegrambotchannel>`__.
Major Changes
-------------
- API 7.0 (:pr:`4034` closes :issue:`4033`, :pr:`4038` by `@aelkheir <https://github.com/aelkheir>`__)
Minor Changes
-------------
- Fix Type Hint for ``filters`` Parameter of ``MessageHandler`` (:pr:`4039` by `@Palaptin <https://github.com/Palaptin>`__)
- Deprecate ``filters.CHAT`` (:pr:`4083` closes :issue:`4062`)
- Improve Error Handling in Built-In Webhook Handler (:pr:`3987` closes :issue:`3979`)
New Features
------------
- Add Parameter ``pattern`` to ``PreCheckoutQueryHandler`` and ``filters.SuccessfulPayment`` (:pr:`4005` by `@aelkheir <https://github.com/aelkheir>`__ closes :issue:`3752`)
- Add Missing Conversions of ``type`` to Corresponding Enum from ``telegram.constants`` (:pr:`4067`)
- Add Support for Unix Sockets to ``Updater.start_webhook`` (:pr:`3986` closes :issue:`3978`)
- Add ``Bot.do_api_request`` (:pr:`4084` closes :issue:`4053`)
- Add ``AsyncContextManager`` as Parent Class to ``BaseUpdateProcessor`` (:pr:`4001`)
Documentation Improvements
--------------------------
- Documentation Improvements (:pr:`3919`)
- Add Docstring to Dunder Methods (:pr:`3929` closes :issue:`3926`)
- Documentation Improvements (:pr:`4002`, :pr:`4079` by `@kenjitagawa <https://github.com/kenjitagawa>`__, :pr:`4104` by `@xTudoS <https://github.com/xTudoS>`__)
Internal Changes
----------------
- Drop Usage of DeepSource (:pr:`4100`)
- Improve Type Completeness & Corresponding Workflow (:pr:`4035`)
- Bump ``ruff`` and Remove ``sort-all`` (:pr:`4075`)
- Move Handler Files to ``_handlers`` Subdirectory (:pr:`4064` by `@lucasmolinari <https://github.com/lucasmolinari>`__ closes :issue:`4060`)
- Introduce ``sort-all`` Hook for ``pre-commit`` (:pr:`4052`)
- Use Recommended ``pre-commit`` Mirror for ``black`` (:pr:`4051`)
- Remove Unused ``DEFAULT_20`` (:pr:`3997`)
- Migrate From ``setup.cfg`` to ``pyproject.toml`` Where Possible (:pr:`4088`)
Dependency Updates
------------------
- Bump ``black`` and ``ruff`` (:pr:`4089`)
- Bump ``srvaroa/labeler`` from 1.8.0 to 1.10.0 (:pr:`4048`)
- Update ``tornado`` requirement from ~=6.3.3 to ~=6.4 (:pr:`3992`)
- Bump ``actions/stale`` from 8 to 9 (:pr:`4046`)
- Bump ``actions/setup-python`` from 4 to 5 (:pr:`4047`)
- ``pre-commit`` autoupdate (:pr:`4101`)
- Bump ``actions/upload-artifact`` from 3 to 4 (:pr:`4045`)
- ``pre-commit`` autoupdate (:pr:`3996`)
- Bump ``furo`` from 2023.9.10 to 2024.1.29 (:pr:`4094`)
- ``pre-commit`` autoupdate (:pr:`4043`)
- Bump ``codecov/codecov-action`` from 3 to 4 (:pr:`4091`)
- Bump ``EndBug/add-and-commit`` from 9.1.3 to 9.1.4 (:pr:`4090`)
- Update ``httpx`` requirement from ~=0.25.2 to ~=0.26.0 (:pr:`4024`)
- Bump ``pytest`` from 7.4.3 to 7.4.4 (:pr:`4056`)
- Bump ``srvaroa/labeler`` from 1.7.0 to 1.8.0 (:pr:`3993`)
- Bump ``test-summary/action`` from 2.1 to 2.2 (:pr:`4044`)
- Bump ``dessant/lock-threads`` from 4.0.1 to 5.0.1 (:pr:`3994`)
Version 20.7
============
*Released 2023-11-27*
This is the technical changelog for version 20.6. More elaborate release notes can be found in the news channel `@pythontelegrambotchannel <https://t.me/pythontelegrambotchannel>`__.
This is the technical changelog for version 20.7. More elaborate release notes can be found in the news channel `@pythontelegrambotchannel <https://t.me/pythontelegrambotchannel>`__.
New Features
------------
+5 -5
View File
@@ -14,7 +14,7 @@
:target: https://pypi.org/project/python-telegram-bot/
:alt: Supported Python versions
.. image:: https://img.shields.io/badge/Bot%20API-6.9-blue?logo=telegram
.. image:: https://img.shields.io/badge/Bot%20API-7.0-blue?logo=telegram
:target: https://core.telegram.org/bots/api-changelog
:alt: Supported Bot API versions
@@ -30,7 +30,7 @@
:target: https://www.gnu.org/licenses/lgpl-3.0.html
:alt: LGPLv3 License
.. image:: https://github.com/python-telegram-bot/python-telegram-bot/workflows/Unit%20Tests/badge.svg
.. image:: https://github.com/python-telegram-bot/python-telegram-bot/actions/workflows/unit_tests.yml/badge.svg?branch=master
:target: https://github.com/python-telegram-bot/python-telegram-bot/
:alt: Github Actions workflow
@@ -93,7 +93,7 @@ Installing both ``python-telegram-bot`` and ``python-telegram-bot-raw`` in conju
Telegram API support
====================
All types and methods of the Telegram Bot API **6.9** are supported.
All types and methods of the Telegram Bot API **7.0** are supported.
Installing
==========
@@ -135,7 +135,7 @@ As these features are *optional*, the corresponding 3rd party dependencies are n
Instead, they are listed as optional dependencies.
This allows to avoid unnecessary dependency conflicts for users who don't need the optional features.
The only required dependency is `httpx ~= 0.25.2 <https://www.python-httpx.org>`_ for
The only required dependency is `httpx ~= 0.26.0 <https://www.python-httpx.org>`_ for
``telegram.request.HTTPXRequest``, the default networking backend.
``python-telegram-bot`` is most useful when used along with additional libraries.
@@ -152,7 +152,7 @@ PTB can be installed with optional dependencies:
* ``pip install "python-telegram-bot[socks]"`` installs `httpx[socks] <https://www.python-httpx.org/#dependencies>`_. Use this, if you want to work behind a Socks5 server.
* ``pip install "python-telegram-bot[http2]"`` installs `httpx[http2] <https://www.python-httpx.org/#dependencies>`_. Use this, if you want to use HTTP/2.
* ``pip install "python-telegram-bot[rate-limiter]"`` installs `aiolimiter~=1.1.0 <https://aiolimiter.readthedocs.io/en/stable/>`_. Use this, if you want to use ``telegram.ext.AIORateLimiter``.
* ``pip install "python-telegram-bot[webhooks]"`` installs the `tornado~=6.3.3 <https://www.tornadoweb.org/en/stable/>`_ library. Use this, if you want to use ``telegram.ext.Updater.start_webhook``/``telegram.ext.Application.run_webhook``.
* ``pip install "python-telegram-bot[webhooks]"`` installs the `tornado~=6.4 <https://www.tornadoweb.org/en/stable/>`_ library. Use this, if you want to use ``telegram.ext.Updater.start_webhook``/``telegram.ext.Application.run_webhook``.
* ``pip install "python-telegram-bot[callback-data]"`` installs the `cachetools~=5.3.2 <https://cachetools.readthedocs.io/en/latest/>`_ library. Use this, if you want to use `arbitrary callback_data <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Arbitrary-callback_data>`_.
* ``pip install "python-telegram-bot[job-queue]"`` installs the `APScheduler~=3.10.4 <https://apscheduler.readthedocs.io/en/3.x/>`_ library and enforces `pytz>=2018.6 <https://pypi.org/project/pytz/>`_, where ``pytz`` is a dependency of ``APScheduler``. Use this, if you want to use the ``telegram.ext.JobQueue``.
+4 -4
View File
@@ -14,7 +14,7 @@
:target: https://pypi.org/project/python-telegram-bot-raw/
:alt: Supported Python versions
.. image:: https://img.shields.io/badge/Bot%20API-6.9-blue?logo=telegram
.. image:: https://img.shields.io/badge/Bot%20API-7.0-blue?logo=telegram
:target: https://core.telegram.org/bots/api-changelog
:alt: Supported Bot API versions
@@ -30,7 +30,7 @@
:target: https://www.gnu.org/licenses/lgpl-3.0.html
:alt: LGPLv3 License
.. image:: https://github.com/python-telegram-bot/python-telegram-bot/workflows/Unit%20Tests/badge.svg
.. image:: https://github.com/python-telegram-bot/python-telegram-bot/actions/workflows/unit_tests.yml/badge.svg?branch=master
:target: https://github.com/python-telegram-bot/python-telegram-bot/
:alt: Github Actions workflow
@@ -89,7 +89,7 @@ Installing both ``python-telegram-bot`` and ``python-telegram-bot-raw`` in conju
Telegram API support
====================
All types and methods of the Telegram Bot API **6.9** are supported.
All types and methods of the Telegram Bot API **7.0** are supported.
Installing
==========
@@ -136,7 +136,7 @@ As these features are *optional*, the corresponding 3rd party dependencies are n
Instead, they are listed as optional dependencies.
This allows to avoid unnecessary dependency conflicts for users who don't need the optional features.
The only required dependency is `httpx ~= 0.25.2 <https://www.python-httpx.org>`_ for
The only required dependency is `httpx ~= 0.26.0 <https://www.python-httpx.org>`_ for
``telegram.request.HTTPXRequest``, the default networking backend.
``python-telegram-bot`` is most useful when used along with additional libraries.
+2 -1
View File
@@ -41,7 +41,8 @@ keyword_args = [
),
(
" api_kwargs (:obj:`dict`, optional): Arbitrary keyword arguments"
" to be passed to the Telegram API."
" to be passed to the Telegram API. See :meth:`~telegram.Bot.do_api_request` for"
" limitations."
),
"",
]
+1 -1
View File
@@ -36,7 +36,7 @@ LINE_NUMBERS = {}
def _git_branch() -> str:
"""Get's the current git sha if available or fall back to `master`"""
try:
output = subprocess.check_output( # skipcq: BAN-B607
output = subprocess.check_output(
["git", "describe", "--tags", "--always"], stderr=subprocess.STDOUT
)
return output.decode().strip()
+7
View File
@@ -15,6 +15,7 @@
#
# You should have received a copy of the GNU Lesser Public License
# along with this program. If not, see [http://www.gnu.org/licenses/].
import datetime
from enum import Enum
from docutils.nodes import Element
@@ -71,6 +72,12 @@ class TGConstXRefRole(PyXRefRole):
if isinstance(value, tuple) and target in (
"telegram.constants.BOT_API_VERSION_INFO",
"telegram.__version_info__",
):
return str(value), target
if (
isinstance(value, datetime.datetime)
and value == telegram.constants.ZERO_DATE
and target in ("telegram.constants.ZERO_DATE",)
):
return repr(value), target
sphinx_logger.warning(
+1 -2
View File
@@ -1,6 +1,5 @@
sphinx==7.2.6
sphinx-pypi-upload
furo==2023.9.10
furo==2024.1.29
git+https://github.com/harshil21/furo-sphinx-search@v0.2.0.1
sphinx-paramlinks==0.6.0
sphinxcontrib-mermaid==0.9.2
+5 -3
View File
@@ -21,9 +21,9 @@ author = "Leandro Toledo"
# built documents.
#
# The short X.Y version.
version = "20.7" # telegram.__version__[:3]
version = "20.8" # telegram.__version__[:3]
# The full version, including alpha/beta/rc tags.
release = "20.7" # telegram.__version__
release = "20.8" # telegram.__version__
# If your documentation needs a minimal Sphinx version, state it here.
needs_sphinx = "6.1.3"
@@ -80,7 +80,9 @@ autodoc_typehints = "none"
# Show docstring for special members
autodoc_default_options = {
"special-members": True,
"exclude-members": "__init__",
# For some reason, __weakref__ can not be ignored by using "inherited-members" in all cases
# so we list it here.
"exclude-members": "__init__, __weakref__",
}
# Fail on warnings & unresolved references etc
+12 -2
View File
@@ -49,8 +49,12 @@
- Used for sending voice messages
* - :meth:`~telegram.Bot.copy_message`
- Used for copying the contents of an arbitrary message
* - :meth:`~telegram.Bot.copy_messages`
- Used for copying the contents of an multiple arbitrary messages
* - :meth:`~telegram.Bot.forward_message`
- Used for forwarding messages
* - :meth:`~telegram.Bot.forward_messages`
- Used for forwarding multiple messages at once
.. raw:: html
@@ -76,6 +80,10 @@
- Used for answering a shipping query
* - :meth:`~telegram.Bot.answer_web_app_query`
- Used for answering a web app query
* - :meth:`~telegram.Bot.delete_message`
- Used for deleting messages.
* - :meth:`~telegram.Bot.delete_messages`
- Used for deleting multiple messages as once.
* - :meth:`~telegram.Bot.edit_message_caption`
- Used for editing captions
* - :meth:`~telegram.Bot.edit_message_media`
@@ -88,8 +96,8 @@
- Used for editing text messages
* - :meth:`~telegram.Bot.stop_poll`
- Used for stopping the running poll
* - :meth:`~telegram.Bot.delete_message`
- Used for deleting messages.
* - :meth:`~telegram.Bot.set_message_reaction`
- Used for setting reactions on messages
.. raw:: html
@@ -157,6 +165,8 @@
- Used for getting the number of members in a chat
* - :meth:`~telegram.Bot.get_chat_member`
- Used for getting a member of a chat
* - :meth:`~telegram.Bot.get_user_chat_boosts`
- Used for getting the list of boosts added to a chat
* - :meth:`~telegram.Bot.leave_chat`
- Used for leaving a chat
+31
View File
@@ -21,6 +21,13 @@ Available Types
telegram.callbackquery
telegram.chat
telegram.chatadministratorrights
telegram.chatboost
telegram.chatboostremoved
telegram.chatboostsource
telegram.chatboostsourcegiftcode
telegram.chatboostsourcegiveaway
telegram.chatboostsourcepremium
telegram.chatboostupdated
telegram.chatinvitelink
telegram.chatjoinrequest
telegram.chatlocation
@@ -38,6 +45,7 @@ Available Types
telegram.contact
telegram.dice
telegram.document
telegram.externalreplyinfo
telegram.file
telegram.forcereply
telegram.forumtopic
@@ -47,6 +55,11 @@ Available Types
telegram.forumtopicreopened
telegram.generalforumtopichidden
telegram.generalforumtopicunhidden
telegram.giveaway
telegram.giveawaycompleted
telegram.giveawaycreated
telegram.giveawaywinners
telegram.inaccessiblemessage
telegram.inlinekeyboardbutton
telegram.inlinekeyboardmarkup
telegram.inputfile
@@ -61,8 +74,11 @@ Available Types
telegram.keyboardbuttonpolltype
telegram.keyboardbuttonrequestchat
telegram.keyboardbuttonrequestuser
telegram.keyboardbuttonrequestusers
telegram.linkpreviewoptions
telegram.location
telegram.loginurl
telegram.maybeinaccessiblemessage
telegram.menubutton
telegram.menubuttoncommands
telegram.menubuttondefault
@@ -71,21 +87,36 @@ Available Types
telegram.messageautodeletetimerchanged
telegram.messageentity
telegram.messageid
telegram.messageorigin
telegram.messageoriginchannel
telegram.messageoriginchat
telegram.messageoriginhiddenuser
telegram.messageoriginuser
telegram.messagereactioncountupdated
telegram.messagereactionupdated
telegram.photosize
telegram.poll
telegram.pollanswer
telegram.polloption
telegram.proximityalerttriggered
telegram.reactioncount
telegram.reactiontype
telegram.reactiontypecustomemoji
telegram.reactiontypeemoji
telegram.replykeyboardmarkup
telegram.replykeyboardremove
telegram.replyparameters
telegram.sentwebappmessage
telegram.story
telegram.switchinlinequerychosenchat
telegram.telegramobject
telegram.textquote
telegram.update
telegram.user
telegram.userchatboosts
telegram.userprofilephotos
telegram.usershared
telegram.usersshared
telegram.venue
telegram.video
telegram.videochatended
-1
View File
@@ -4,4 +4,3 @@ Bot
.. autoclass:: telegram.Bot
:members:
:show-inheritance:
:special-members: __repr__, __reduce__, __deepcopy__
+8
View File
@@ -0,0 +1,8 @@
ChatBoost
=========
.. versionadded:: 20.8
.. autoclass:: telegram.ChatBoost
:members:
:show-inheritance:
@@ -0,0 +1,8 @@
ChatBoostRemoved
================
.. versionadded:: 20.8
.. autoclass:: telegram.ChatBoostRemoved
:members:
:show-inheritance:
+8
View File
@@ -0,0 +1,8 @@
ChatBoostSource
===============
.. versionadded:: 20.8
.. autoclass:: telegram.ChatBoostSource
:members:
:show-inheritance:
@@ -0,0 +1,8 @@
ChatBoostSourceGiftCode
=======================
.. versionadded:: 20.8
.. autoclass:: telegram.ChatBoostSourceGiftCode
:members:
:show-inheritance:
@@ -0,0 +1,8 @@
ChatBoostSourceGiveaway
=======================
.. versionadded:: 20.8
.. autoclass:: telegram.ChatBoostSourceGiveaway
:members:
:show-inheritance:
@@ -0,0 +1,8 @@
ChatBoostSourcePremium
======================
.. versionadded:: 20.8
.. autoclass:: telegram.ChatBoostSourcePremium
:members:
:show-inheritance:
@@ -0,0 +1,8 @@
ChatBoostUpdated
================
.. versionadded:: 20.8
.. autoclass:: telegram.ChatBoostUpdated
:members:
:show-inheritance:
+1
View File
@@ -4,3 +4,4 @@ telegram.constants Module
.. automodule:: telegram.constants
:members:
:show-inheritance:
:inherited-members: Enum, EnumMeta
-1
View File
@@ -4,4 +4,3 @@ Application
.. autoclass:: telegram.ext.Application
:members:
:show-inheritance:
:special-members: __repr__
-1
View File
@@ -4,4 +4,3 @@ BaseHandler
.. autoclass:: telegram.ext.BaseHandler
:members:
:show-inheritance:
:special-members: __repr__
@@ -0,0 +1,8 @@
ChatBoostHandler
================
.. versionadded:: 20.8
.. autoclass:: telegram.ext.ChatBoostHandler
:members:
:show-inheritance:
@@ -4,4 +4,3 @@ ConversationHandler
.. autoclass:: telegram.ext.ConversationHandler
:members:
:show-inheritance:
:special-members: __repr__
-1
View File
@@ -4,4 +4,3 @@ ExtBot
.. autoclass:: telegram.ext.ExtBot
:show-inheritance:
:members: insert_callback_data, defaults, rate_limiter, initialize, shutdown, callback_data_cache
:special-members: __repr__
+1 -1
View File
@@ -5,7 +5,7 @@ filters Module
The classes in `filters.py` are sorted alphabetically such that :bysource: still is readable
.. automodule:: telegram.ext.filters
:inherited-members: BaseFilter, MessageFilter, UpdateFilter
:inherited-members: BaseFilter, MessageFilter, UpdateFilter, object
:members:
:show-inheritance:
:member-order: bysource
@@ -6,6 +6,7 @@ Handlers
telegram.ext.basehandler
telegram.ext.callbackqueryhandler
telegram.ext.chatboosthandler
telegram.ext.chatjoinrequesthandler
telegram.ext.chatmemberhandler
telegram.ext.choseninlineresulthandler
@@ -14,6 +15,7 @@ Handlers
telegram.ext.filters
telegram.ext.inlinequeryhandler
telegram.ext.messagehandler
telegram.ext.messagereactionhandler
telegram.ext.pollanswerhandler
telegram.ext.pollhandler
telegram.ext.precheckoutqueryhandler
-1
View File
@@ -4,4 +4,3 @@ Job
.. autoclass:: telegram.ext.Job
:members:
:show-inheritance:
:special-members: __call__, __repr__
-1
View File
@@ -4,4 +4,3 @@ JobQueue
.. autoclass:: telegram.ext.JobQueue
:members:
:show-inheritance:
:special-members: __repr__
@@ -0,0 +1,6 @@
MessageReactionHandler
======================
.. autoclass:: telegram.ext.MessageReactionHandler
:members:
:show-inheritance:
-1
View File
@@ -4,4 +4,3 @@ Updater
.. autoclass:: telegram.ext.Updater
:members:
:show-inheritance:
:special-members: __repr__
@@ -0,0 +1,6 @@
ExternalReplyInfo
=================
.. autoclass:: telegram.ExternalReplyInfo
:members:
:show-inheritance:
+6
View File
@@ -0,0 +1,6 @@
Giveaway
========
.. autoclass:: telegram.Giveaway
:members:
:show-inheritance:
@@ -0,0 +1,6 @@
GiveawayCompleted
=================
.. autoclass:: telegram.GiveawayCompleted
:members:
:show-inheritance:
+6
View File
@@ -0,0 +1,6 @@
GiveawayCreated
===============
.. autoclass:: telegram.GiveawayCreated
:members:
:show-inheritance:
+6
View File
@@ -0,0 +1,6 @@
GiveawayWinners
===============
.. autoclass:: telegram.GiveawayWinners
:members:
:show-inheritance:
@@ -0,0 +1,6 @@
InaccessibleMessage
===================
.. autoclass:: telegram.InaccessibleMessage
:members:
:show-inheritance:
@@ -1,5 +1,5 @@
KeyboardButtonRequestUser
==================================
=========================
.. autoclass:: telegram.KeyboardButtonRequestUser
:members:
@@ -0,0 +1,6 @@
KeyboardButtonRequestUsers
==========================
.. autoclass:: telegram.KeyboardButtonRequestUsers
:members:
:show-inheritance:
@@ -0,0 +1,6 @@
LinkPreviewOptions
==================
.. autoclass:: telegram.LinkPreviewOptions
:members:
:show-inheritance:
@@ -0,0 +1,6 @@
MaybeInaccessibleMessage
========================
.. autoclass:: telegram.MaybeInaccessibleMessage
:members:
:show-inheritance:
+6
View File
@@ -0,0 +1,6 @@
MessageOrigin
=============
.. autoclass:: telegram.MessageOrigin
:members:
:show-inheritance:
@@ -0,0 +1,6 @@
MessageOriginChannel
====================
.. autoclass:: telegram.MessageOriginChannel
:members:
:show-inheritance:
@@ -0,0 +1,6 @@
MessageOriginChat
=================
.. autoclass:: telegram.MessageOriginChat
:members:
:show-inheritance:
@@ -0,0 +1,7 @@
MessageOriginHiddenUser
=======================
.. autoclass:: telegram.MessageOriginHiddenUser
:members:
:show-inheritance:
@@ -0,0 +1,6 @@
MessageOriginUser
=================
.. autoclass:: telegram.MessageOriginUser
:members:
:show-inheritance:
@@ -0,0 +1,6 @@
MessageReactionCountUpdated
===========================
.. autoclass:: telegram.MessageReactionCountUpdated
:members:
:show-inheritance:
@@ -0,0 +1,6 @@
MessageReactionUpdated
======================
.. autoclass:: telegram.MessageReactionUpdated
:members:
:show-inheritance:
+6
View File
@@ -0,0 +1,6 @@
ReactionCount
=============
.. autoclass:: telegram.ReactionCount
:members:
:show-inheritance:
+6
View File
@@ -0,0 +1,6 @@
ReactionType
============
.. autoclass:: telegram.ReactionType
:members:
:show-inheritance:
@@ -0,0 +1,6 @@
ReactionTypeCustomEmoji
=======================
.. autoclass:: telegram.ReactionTypeCustomEmoji
:members:
:show-inheritance:
@@ -0,0 +1,6 @@
ReactionTypeEmoji
=================
.. autoclass:: telegram.ReactionTypeEmoji
:members:
:show-inheritance:
+6
View File
@@ -0,0 +1,6 @@
ReplyParameters
===============
.. autoclass:: telegram.ReplyParameters
:members:
:show-inheritance:
-1
View File
@@ -4,4 +4,3 @@ TelegramObject
.. autoclass:: telegram.TelegramObject
:members:
:show-inheritance:
:special-members: __repr__, __getitem__, __eq__, __hash__, __setstate__, __getstate__, __deepcopy__, __setattr__, __delattr__
+6
View File
@@ -0,0 +1,6 @@
TextQuote
=========
.. autoclass:: telegram.TextQuote
:members:
:show-inheritance:
+8
View File
@@ -0,0 +1,8 @@
UserChatBoosts
==============
.. versionadded:: 20.8
.. autoclass:: telegram.UserChatBoosts
:members:
:show-inheritance:
+1 -1
View File
@@ -1,5 +1,5 @@
UserShared
===================
==========
.. autoclass:: telegram.UserShared
:members:
+6
View File
@@ -0,0 +1,6 @@
UsersShared
===========
.. autoclass:: telegram.UsersShared
:members:
:show-inheritance:
+15 -1
View File
@@ -62,4 +62,18 @@
.. |removed_thumb_wildcard_note| replace:: Removed the deprecated arguments and attributes ``thumb_*``.
.. |async_context_manager| replace:: Asynchronous context manager which
.. |async_context_manager| replace:: Asynchronous context manager which
.. |reply_parameters| replace:: Description of the message to reply to.
.. |rtm_aswr_deprecated| replace:: replacing this argument. PTB will automatically convert this argument to that one, but you should update your code to use the new argument.
.. |keyword_only_arg| replace:: In future versions, this argument will become a keyword-only argument.
.. |text_html| replace:: The return value of this property is a best-effort approach. Unfortunately, it can not be guaranteed that sending a message with the returned string will render in the same way as the original message produces the same :attr:`~telegram.Message.entities`/:attr:`~telegram.Message.caption_entities` as the original message. For example, Telegram recommends that entities of type :attr:`~telegram.MessageEntity.BLOCKQUOTE` and :attr:`~telegram.MessageEntity.PRE` *should* start and end on a new line, but does not enforce this and leaves rendering decisions up to the clients.
.. |text_markdown| replace:: |text_html| Moreover, markdown formatting is inherently less expressive than HTML, so some edge cases may not be coverable at all. For example, markdown formatting can not specify two consecutive block quotes without a blank line in between, but HTML can.
.. |reply_quote| replace:: If set to :obj:`True`, the reply is sent as an actual reply to this message. If ``reply_to_message_id`` is passed, this parameter will be ignored. Default: :obj:`True` in group chats and :obj:`False` in private chats.
.. |do_quote| replace:: If set to :obj:`True`, the replied message is quoted. For a dict, it must be the output of :meth:`~telegram.Message.build_reply_arguments` to specify exact ``reply_parameters``. If ``reply_to_message_id`` or ``reply_parameters`` are passed, this parameter will be ignored. Default: :obj:`True` in group chats and :obj:`False` in private chats.
+108 -3
View File
@@ -1,20 +1,125 @@
# BLACK:
[tool.black]
line-length = 99
target-version = ['py38', 'py39', 'py310', 'py311']
# ISORT:
[tool.isort] # black config
profile = "black"
line_length = 99
# RUFF:
[tool.ruff]
line-length = 99
target-version = "py38"
show-fixes = true
[tool.ruff.lint]
preview = true
explicit-preview-rules = true
ignore = ["PLR2004", "PLR0911", "PLR0912", "PLR0913", "PLR0915", "PERF203"]
select = ["E", "F", "I", "PL", "UP", "RUF", "PTH", "C4", "B", "PIE", "SIM", "RET", "RSE",
"G", "ISC", "PT", "ASYNC", "TCH", "SLOT", "PERF", "PYI", "FLY", "AIR"]
"G", "ISC", "PT", "ASYNC", "TCH", "SLOT", "PERF", "PYI", "FLY", "AIR", "RUF022",
"RUF023", "Q", "INP",]
# Add "FURB" after it's out of preview
[tool.ruff.per-file-ignores]
[tool.ruff.lint.per-file-ignores]
"tests/*.py" = ["B018"]
"tests/**.py" = ["RUF012"]
"tests/**.py" = ["RUF012", "ASYNC101"]
# PYLINT:
[tool.pylint."messages control"]
enable = ["useless-suppression"]
disable = ["duplicate-code", "too-many-arguments", "too-many-public-methods",
"too-few-public-methods", "broad-exception-caught", "too-many-instance-attributes",
"fixme", "missing-function-docstring", "missing-class-docstring", "too-many-locals",
"too-many-lines", "too-many-branches", "too-many-statements", "cyclic-import"
]
[tool.pylint.main]
# run pylint across multiple cpu cores to speed it up-
# https://pylint.pycqa.org/en/latest/user_guide/run.html?#parallel-execution to know more
jobs = 0
[tool.pylint.classes]
exclude-protected = ["_unfrozen"]
# PYTEST:
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "--no-success-flaky-report -rsxX"
filterwarnings = [
"error",
"ignore::DeprecationWarning",
'ignore:Tasks created via `Application\.create_task` while the application is not running',
"ignore::ResourceWarning",
# TODO: Write so good code that we don't need to ignore ResourceWarnings anymore
# Unfortunately due to https://github.com/pytest-dev/pytest/issues/8343 we can't have this here
# and instead do a trick directly in tests/conftest.py
# ignore::telegram.utils.deprecate.TelegramDeprecationWarning
]
markers = [
"dev", # If you want to test a specific test, use this
"no_req",
"req",
]
asyncio_mode = "auto"
# MYPY:
[tool.mypy]
warn_unused_ignores = true
warn_unused_configs = true
disallow_untyped_defs = true
disallow_incomplete_defs = true
disallow_untyped_decorators = true
show_error_codes = true
python_version = "3.8"
# For some files, it's easier to just disable strict-optional all together instead of
# cluttering the code with `# type: ignore`s or stuff like
# `if self.text is None: raise RuntimeError()`
[[tool.mypy.overrides]]
module = [
"telegram._callbackquery",
"telegram._file",
"telegram._message",
"telegram._files.file"
]
strict_optional = false
# type hinting for asyncio in webhookhandler is a bit tricky because it depends on the OS
[[tool.mypy.overrides]]
module = "telegram.ext._utils.webhookhandler"
warn_unused_ignores = false
# The libs listed below are only used for the `customwebhookbot_*.py` examples
# let's just ignore type checking for them for now
[[tool.mypy.overrides]]
module = [
"flask.*",
"quart.*",
"starlette.*",
"uvicorn.*",
"asgiref.*",
"django.*",
"apscheduler.*", # not part of `customwebhookbot_*.py` examples
]
ignore_missing_imports = true
# COVERAGE:
[tool.coverage.run]
branch = true
source = ["telegram"]
parallel = true
concurrency = ["thread", "multiprocessing"]
omit = [
"tests/",
"telegram/__main__.py"
]
[tool.coverage.report]
exclude_also = [
"@overload",
"@abstractmethod",
"if TYPE_CHECKING:"
]
+1 -1
View File
@@ -1,7 +1,7 @@
pre-commit # needed for pre-commit hooks in the git commit command
# For the test suite
pytest==7.4.3
pytest==7.4.4
pytest-asyncio==0.21.1 # needed because pytest doesn't come with native support for coroutines as tests
pytest-xdist==3.5.0 # xdist runs tests in parallel
flaky # Used for flaky tests (flaky decorator)
+1 -1
View File
@@ -16,7 +16,7 @@ cryptography!=3.4,!=3.4.1,!=3.4.2,!=3.4.3,>=39.0.1 # passport
aiolimiter~=1.1.0 # rate-limiter!ext
# tornado is rather stable, but let's not allow the next mayor release without prior testing
tornado~=6.3.3 # webhooks!ext
tornado~=6.4 # webhooks!ext
# Cachetools and APS don't have a strict stability policy.
# Let's be cautious for now.
+1 -1
View File
@@ -6,4 +6,4 @@
# versions and only increase the lower bound if necessary
# httpx has no stable release yet, so let's be cautious for now
httpx ~= 0.25.2
httpx ~= 0.26.0
+1 -87
View File
@@ -1,94 +1,8 @@
[metadata]
license_files = LICENSE, LICENSE.dual, LICENSE.lesser
[build_sphinx]
source-dir = docs/source
build-dir = docs/build
all_files = 1
[upload_sphinx]
upload-dir = docs/build/html
[flake8]
max-line-length = 99
ignore = W503, W605
extend-ignore = E203
extend-ignore = E203, E704
exclude = setup.py, setup-raw.py docs/source/conf.py
[pylint.message-control]
disable = duplicate-code,too-many-arguments,too-many-public-methods,too-few-public-methods,
broad-except,too-many-instance-attributes,fixme,missing-function-docstring,
missing-class-docstring,too-many-locals,too-many-lines,too-many-branches,
too-many-statements, cyclic-import
enable=useless-suppression ; Warns about unused pylint ignores
exclude-protected=_unfrozen
[tool:pytest]
testpaths = tests
addopts = --no-success-flaky-report -rsxX
filterwarnings =
error
ignore::DeprecationWarning
ignore:Tasks created via `Application\.create_task` while the application is not running
ignore::ResourceWarning
; TODO: Write so good code that we don't need to ignore ResourceWarnings anymore
; Unfortunately due to https://github.com/pytest-dev/pytest/issues/8343 we can't have this here
; and instead do a trick directly in tests/conftest.py
; ignore::telegram.utils.deprecate.TelegramDeprecationWarning
markers =
dev: If you want to test a specific test, use this
no_req
req
asyncio_mode = auto
[coverage:run]
branch = True
source = telegram
parallel = True
concurrency = thread, multiprocessing
omit =
tests/
telegram/__main__.py
[coverage:report]
exclude_lines =
pragma: no cover
@overload
if TYPE_CHECKING:
[mypy]
warn_unused_ignores = True
warn_unused_configs = True
disallow_untyped_defs = True
disallow_incomplete_defs = True
disallow_untyped_decorators = True
show_error_codes = True
# For some files, it's easier to just disable strict-optional all together instead of
# cluttering the code with `# type: ignore`s or stuff like
# `if self.text is None: raise RuntimeError()`
[mypy-telegram._callbackquery,telegram._file,telegram._message,telegram._files.file]
strict_optional = False
# type hinting for asyncio in webhookhandler is a bit tricky because it depends on the OS
[mypy-telegram.ext._utils.webhookhandler]
warn_unused_ignores = False
[mypy-apscheduler.*]
ignore_missing_imports = True
# The libs listed below are only used for the `customwebhookbot_*.py` examples
# let's just ignore type checking for them for now
[mypy-uvicorn.*]
ignore_missing_imports = True
[mypy-starlette.*]
ignore_missing_imports = True
[mypy-asgiref.*]
ignore_missing_imports = True
[mypy-flask.*]
ignore_missing_imports = True
[mypy-quart.*]
ignore_missing_imports = True
[mypy-django.*]
ignore_missing_imports = True
+75 -19
View File
@@ -19,12 +19,7 @@
"""A library that provides a Python interface to the Telegram Bot API"""
__author__ = "devs@python-telegram-bot.org"
__all__ = ( # Keep this alphabetically ordered
"__bot_api_version__",
"__bot_api_version_info__",
"__version__",
"__version_info__",
__all__ = (
"Animation",
"Audio",
"Bot",
@@ -44,22 +39,28 @@ __all__ = ( # Keep this alphabetically ordered
"CallbackQuery",
"Chat",
"ChatAdministratorRights",
"ChatBoost",
"ChatBoostRemoved",
"ChatBoostSource",
"ChatBoostSourceGiftCode",
"ChatBoostSourceGiveaway",
"ChatBoostSourcePremium",
"ChatBoostUpdated",
"ChatInviteLink",
"ChatJoinRequest",
"ChatLocation",
"ChatMember",
"ChatMemberOwner",
"ChatMemberAdministrator",
"ChatMemberMember",
"ChatMemberRestricted",
"ChatMemberLeft",
"ChatMemberBanned",
"ChatMemberLeft",
"ChatMemberMember",
"ChatMemberOwner",
"ChatMemberRestricted",
"ChatMemberUpdated",
"ChatPermissions",
"ChatPhoto",
"ChatShared",
"ChosenInlineResult",
"constants",
"Contact",
"Credentials",
"DataCredentials",
@@ -67,7 +68,7 @@ __all__ = ( # Keep this alphabetically ordered
"Document",
"EncryptedCredentials",
"EncryptedPassportElement",
"error",
"ExternalReplyInfo",
"File",
"FileCredentials",
"ForceReply",
@@ -80,8 +81,12 @@ __all__ = ( # Keep this alphabetically ordered
"GameHighScore",
"GeneralForumTopicHidden",
"GeneralForumTopicUnhidden",
"helpers",
"Giveaway",
"GiveawayCompleted",
"GiveawayCreated",
"GiveawayWinners",
"IdDocumentData",
"InaccessibleMessage",
"InlineKeyboardButton",
"InlineKeyboardMarkup",
"InlineQuery",
@@ -103,10 +108,10 @@ __all__ = ( # Keep this alphabetically ordered
"InlineQueryResultLocation",
"InlineQueryResultMpeg4Gif",
"InlineQueryResultPhoto",
"InlineQueryResultsButton",
"InlineQueryResultVenue",
"InlineQueryResultVideo",
"InlineQueryResultVoice",
"InlineQueryResultsButton",
"InputContactMessageContent",
"InputFile",
"InputInvoiceMessageContent",
@@ -126,10 +131,13 @@ __all__ = ( # Keep this alphabetically ordered
"KeyboardButtonPollType",
"KeyboardButtonRequestChat",
"KeyboardButtonRequestUser",
"KeyboardButtonRequestUsers",
"LabeledPrice",
"LinkPreviewOptions",
"Location",
"LoginUrl",
"MaskPosition",
"MaybeInaccessibleMessage",
"MenuButton",
"MenuButtonCommands",
"MenuButtonDefault",
@@ -138,6 +146,13 @@ __all__ = ( # Keep this alphabetically ordered
"MessageAutoDeleteTimerChanged",
"MessageEntity",
"MessageId",
"MessageOrigin",
"MessageOriginChannel",
"MessageOriginChat",
"MessageOriginHiddenUser",
"MessageOriginUser",
"MessageReactionCountUpdated",
"MessageReactionUpdated",
"OrderInfo",
"PassportData",
"PassportElementError",
@@ -158,9 +173,13 @@ __all__ = ( # Keep this alphabetically ordered
"PollOption",
"PreCheckoutQuery",
"ProximityAlertTriggered",
"ReactionCount",
"ReactionType",
"ReactionTypeCustomEmoji",
"ReactionTypeEmoji",
"ReplyKeyboardMarkup",
"ReplyKeyboardRemove",
"request",
"ReplyParameters",
"ResidentialAddress",
"SecureData",
"SecureValue",
@@ -174,10 +193,13 @@ __all__ = ( # Keep this alphabetically ordered
"SuccessfulPayment",
"SwitchInlineQueryChosenChat",
"TelegramObject",
"TextQuote",
"Update",
"User",
"UserChatBoosts",
"UserProfilePhotos",
"UserShared",
"UsersShared",
"Venue",
"Video",
"VideoChatEnded",
@@ -186,11 +208,19 @@ __all__ = ( # Keep this alphabetically ordered
"VideoChatStarted",
"VideoNote",
"Voice",
"warnings",
"WebAppData",
"WebAppInfo",
"WebhookInfo",
"WriteAccessAllowed",
"__bot_api_version__",
"__bot_api_version_info__",
"__version__",
"__version_info__",
"constants",
"error",
"helpers",
"request",
"warnings",
)
@@ -212,6 +242,16 @@ from ._botname import BotName
from ._callbackquery import CallbackQuery
from ._chat import Chat
from ._chatadministratorrights import ChatAdministratorRights
from ._chatboost import (
ChatBoost,
ChatBoostRemoved,
ChatBoostSource,
ChatBoostSourceGiftCode,
ChatBoostSourceGiveaway,
ChatBoostSourcePremium,
ChatBoostUpdated,
UserChatBoosts,
)
from ._chatinvitelink import ChatInviteLink
from ._chatjoinrequest import ChatJoinRequest
from ._chatlocation import ChatLocation
@@ -264,6 +304,7 @@ from ._forumtopic import (
from ._games.callbackgame import CallbackGame
from ._games.game import Game
from ._games.gamehighscore import GameHighScore
from ._giveaway import Giveaway, GiveawayCompleted, GiveawayCreated, GiveawayWinners
from ._inline.inlinekeyboardbutton import InlineKeyboardButton
from ._inline.inlinekeyboardmarkup import InlineKeyboardMarkup
from ._inline.inlinequery import InlineQuery
@@ -297,13 +338,26 @@ from ._inline.inputtextmessagecontent import InputTextMessageContent
from ._inline.inputvenuemessagecontent import InputVenueMessageContent
from ._keyboardbutton import KeyboardButton
from ._keyboardbuttonpolltype import KeyboardButtonPollType
from ._keyboardbuttonrequest import KeyboardButtonRequestChat, KeyboardButtonRequestUser
from ._keyboardbuttonrequest import (
KeyboardButtonRequestChat,
KeyboardButtonRequestUser,
KeyboardButtonRequestUsers,
)
from ._linkpreviewoptions import LinkPreviewOptions
from ._loginurl import LoginUrl
from ._menubutton import MenuButton, MenuButtonCommands, MenuButtonDefault, MenuButtonWebApp
from ._message import Message
from ._message import InaccessibleMessage, MaybeInaccessibleMessage, Message
from ._messageautodeletetimerchanged import MessageAutoDeleteTimerChanged
from ._messageentity import MessageEntity
from ._messageid import MessageId
from ._messageorigin import (
MessageOrigin,
MessageOriginChannel,
MessageOriginChat,
MessageOriginHiddenUser,
MessageOriginUser,
)
from ._messagereactionupdated import MessageReactionCountUpdated, MessageReactionUpdated
from ._passport.credentials import (
Credentials,
DataCredentials,
@@ -338,10 +392,12 @@ from ._payment.shippingquery import ShippingQuery
from ._payment.successfulpayment import SuccessfulPayment
from ._poll import Poll, PollAnswer, PollOption
from ._proximityalerttriggered import ProximityAlertTriggered
from ._reaction import ReactionCount, ReactionType, ReactionTypeCustomEmoji, ReactionTypeEmoji
from ._reply import ExternalReplyInfo, ReplyParameters, TextQuote
from ._replykeyboardmarkup import ReplyKeyboardMarkup
from ._replykeyboardremove import ReplyKeyboardRemove
from ._sentwebappmessage import SentWebAppMessage
from ._shared import ChatShared, UserShared
from ._shared import ChatShared, UserShared, UsersShared
from ._story import Story
from ._switchinlinequerychosenchat import SwitchInlineQueryChosenChat
from ._telegramobject import TelegramObject
+3 -3
View File
@@ -27,7 +27,7 @@ from .constants import BOT_API_VERSION
def _git_revision() -> Optional[str]:
try:
output = subprocess.check_output( # skipcq: BAN-B607
output = subprocess.check_output(
["git", "describe", "--long", "--tags"], stderr=subprocess.STDOUT
)
except (subprocess.SubprocessError, OSError):
@@ -35,7 +35,7 @@ def _git_revision() -> Optional[str]:
return output.decode().strip()
def print_ver_info() -> None: # skipcq: PY-D0003
def print_ver_info() -> None:
"""Prints version information for python-telegram-bot, the Bot API and Python."""
git_revision = _git_revision()
print(f"python-telegram-bot {telegram_ver}" + (f" ({git_revision})" if git_revision else ""))
@@ -44,7 +44,7 @@ def print_ver_info() -> None: # skipcq: PY-D0003
print(f"Python {sys_version}")
def main() -> None: # skipcq: PY-D0003
def main() -> None:
"""Prints version information for python-telegram-bot, the Bot API and Python."""
print_ver_info()
+936 -54
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -50,7 +50,7 @@ class BotCommand(TelegramObject):
"""
__slots__ = ("description", "command")
__slots__ = ("command", "description")
def __init__(self, command: str, description: str, *, api_kwargs: Optional[JSONDict] = None):
super().__init__(api_kwargs=api_kwargs)
+2 -1
View File
@@ -22,6 +22,7 @@ from typing import TYPE_CHECKING, Dict, Final, Optional, Type, Union
from telegram import constants
from telegram._telegramobject import TelegramObject
from telegram._utils import enum
from telegram._utils.types import JSONDict
if TYPE_CHECKING:
@@ -77,7 +78,7 @@ class BotCommandScope(TelegramObject):
def __init__(self, type: str, *, api_kwargs: Optional[JSONDict] = None):
super().__init__(api_kwargs=api_kwargs)
self.type: str = type
self.type: str = enum.get_member(constants.BotCommandScopeType, type, type)
self._id_attrs = (self.type,)
self._freeze()
+118 -29
View File
@@ -22,7 +22,7 @@ from typing import TYPE_CHECKING, Final, Optional, Sequence, Tuple, Union
from telegram import constants
from telegram._files.location import Location
from telegram._message import Message
from telegram._message import MaybeInaccessibleMessage, Message
from telegram._telegramobject import TelegramObject
from telegram._user import User
from telegram._utils.defaultvalue import DEFAULT_NONE
@@ -34,8 +34,10 @@ if TYPE_CHECKING:
GameHighScore,
InlineKeyboardMarkup,
InputMedia,
LinkPreviewOptions,
MessageEntity,
MessageId,
ReplyParameters,
)
@@ -70,9 +72,11 @@ class CallbackQuery(TelegramObject):
from_user (:class:`telegram.User`): Sender.
chat_instance (:obj:`str`): Global identifier, uniquely corresponding to the chat to which
the message with the callback button was sent. Useful for high scores in games.
message (:class:`telegram.Message`, optional): Message with the callback button that
originated the query. Note that message content and message date will not be available
if the message is too old.
message (:class:`telegram.MaybeInaccessibleMessage`, optional): Message sent by the bot
with the callback button that originated the query.
.. versionchanged:: 20.8
Accept objects of type :class:`telegram.MaybeInaccessibleMessage` since Bot API 7.0.
data (:obj:`str`, optional): Data associated with the callback button. Be aware that the
message, which originated the query, can contain no callback buttons with this data.
inline_message_id (:obj:`str`, optional): Identifier of the message sent via the bot in
@@ -85,9 +89,12 @@ class CallbackQuery(TelegramObject):
from_user (:class:`telegram.User`): Sender.
chat_instance (:obj:`str`): Global identifier, uniquely corresponding to the chat to which
the message with the callback button was sent. Useful for high scores in games.
message (:class:`telegram.Message`): Optional. Message with the callback button that
originated the query. Note that message content and message date will not be available
if the message is too old.
message (:class:`telegram.MaybeInaccessibleMessage`): Optional. Message sent by the bot
with the callback button that originated the query.
.. versionchanged:: 20.8
Objects maybe be of type :class:`telegram.MaybeInaccessibleMessage` since Bot API
7.0.
data (:obj:`str` | :obj:`object`): Optional. Data associated with the callback button.
Be aware that the message, which originated the query, can contain no callback buttons
with this data.
@@ -104,13 +111,13 @@ class CallbackQuery(TelegramObject):
"""
__slots__ = (
"game_short_name",
"message",
"chat_instance",
"id",
"from_user",
"inline_message_id",
"data",
"from_user",
"game_short_name",
"id",
"inline_message_id",
"message",
)
def __init__(
@@ -118,7 +125,7 @@ class CallbackQuery(TelegramObject):
id: str,
from_user: User,
chat_instance: str,
message: Optional[Message] = None,
message: Optional[MaybeInaccessibleMessage] = None,
data: Optional[str] = None,
inline_message_id: Optional[str] = None,
game_short_name: Optional[str] = None,
@@ -131,7 +138,7 @@ class CallbackQuery(TelegramObject):
self.from_user: User = from_user
self.chat_instance: str = chat_instance
# Optionals
self.message: Optional[Message] = message
self.message: Optional[MaybeInaccessibleMessage] = message
self.data: Optional[str] = data
self.inline_message_id: Optional[str] = inline_message_id
self.game_short_name: Optional[str] = game_short_name
@@ -190,6 +197,14 @@ class CallbackQuery(TelegramObject):
api_kwargs=api_kwargs,
)
def _get_message(self, action: str = "edit") -> Message:
"""Helper method to get the message for the shortcut methods. Must be called only
if :attr:`inline_message_id` is *not* set.
"""
if not isinstance(self.message, Message):
raise TypeError(f"Cannot {action} an inaccessible message")
return self.message
async def edit_message_text(
self,
text: str,
@@ -197,6 +212,7 @@ class CallbackQuery(TelegramObject):
disable_web_page_preview: ODVInput[bool] = DEFAULT_NONE,
reply_markup: Optional["InlineKeyboardMarkup"] = None,
entities: Optional[Sequence["MessageEntity"]] = None,
link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -217,10 +233,16 @@ class CallbackQuery(TelegramObject):
For the documentation of the arguments, please see
:meth:`telegram.Bot.edit_message_text` and :meth:`telegram.Message.edit_text`.
.. versionchanged:: 20.8
Raises :exc:`TypeError` if :attr:`message` is not accessible.
Returns:
:class:`telegram.Message`: On success, if edited message is sent by the bot, the
edited Message is returned, otherwise :obj:`True` is returned.
Raises:
:exc:`TypeError` if :attr:`message` is not accessible.
"""
if self.inline_message_id:
return await self.get_bot().edit_message_text(
@@ -228,6 +250,7 @@ class CallbackQuery(TelegramObject):
text=text,
parse_mode=parse_mode,
disable_web_page_preview=disable_web_page_preview,
link_preview_options=link_preview_options,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -238,10 +261,11 @@ class CallbackQuery(TelegramObject):
chat_id=None,
message_id=None,
)
return await self.message.edit_text(
return await self._get_message().edit_text(
text=text,
parse_mode=parse_mode,
disable_web_page_preview=disable_web_page_preview,
link_preview_options=link_preview_options,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -277,10 +301,16 @@ class CallbackQuery(TelegramObject):
For the documentation of the arguments, please see
:meth:`telegram.Bot.edit_message_caption` and :meth:`telegram.Message.edit_caption`.
.. versionchanged:: 20.8
Raises :exc:`TypeError` if :attr:`message` is not accessible.
Returns:
:class:`telegram.Message`: On success, if edited message is sent by the bot, the
edited Message is returned, otherwise :obj:`True` is returned.
Raises:
:exc:`TypeError` if :attr:`message` is not accessible.
"""
if self.inline_message_id:
return await self.get_bot().edit_message_caption(
@@ -297,7 +327,7 @@ class CallbackQuery(TelegramObject):
chat_id=None,
message_id=None,
)
return await self.message.edit_caption(
return await self._get_message().edit_caption(
caption=caption,
reply_markup=reply_markup,
read_timeout=read_timeout,
@@ -333,10 +363,16 @@ class CallbackQuery(TelegramObject):
:meth:`telegram.Bot.edit_message_reply_markup` and
:meth:`telegram.Message.edit_reply_markup`.
.. versionchanged:: 20.8
Raises :exc:`TypeError` if :attr:`message` is not accessible.
Returns:
:class:`telegram.Message`: On success, if edited message is sent by the bot, the
edited Message is returned, otherwise :obj:`True` is returned.
Raises:
:exc:`TypeError` if :attr:`message` is not accessible.
"""
if self.inline_message_id:
return await self.get_bot().edit_message_reply_markup(
@@ -350,7 +386,7 @@ class CallbackQuery(TelegramObject):
chat_id=None,
message_id=None,
)
return await self.message.edit_reply_markup(
return await self._get_message().edit_reply_markup(
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -383,10 +419,16 @@ class CallbackQuery(TelegramObject):
For the documentation of the arguments, please see
:meth:`telegram.Bot.edit_message_media` and :meth:`telegram.Message.edit_media`.
.. versionchanged:: 20.8
Raises :exc:`TypeError` if :attr:`message` is not accessible.
Returns:
:class:`telegram.Message`: On success, if edited message is not an inline message, the
edited Message is returned, otherwise :obj:`True` is returned.
Raises:
:exc:`TypeError` if :attr:`message` is not accessible.
"""
if self.inline_message_id:
return await self.get_bot().edit_message_media(
@@ -401,7 +443,7 @@ class CallbackQuery(TelegramObject):
chat_id=None,
message_id=None,
)
return await self.message.edit_media(
return await self._get_message().edit_media(
media=media,
reply_markup=reply_markup,
read_timeout=read_timeout,
@@ -441,10 +483,16 @@ class CallbackQuery(TelegramObject):
:meth:`telegram.Bot.edit_message_live_location` and
:meth:`telegram.Message.edit_live_location`.
.. versionchanged:: 20.8
Raises :exc:`TypeError` if :attr:`message` is not accessible.
Returns:
:class:`telegram.Message`: On success, if edited message is sent by the bot, the
edited Message is returned, otherwise :obj:`True` is returned.
Raises:
:exc:`TypeError` if :attr:`message` is not accessible.
"""
if self.inline_message_id:
return await self.get_bot().edit_message_live_location(
@@ -464,7 +512,7 @@ class CallbackQuery(TelegramObject):
chat_id=None,
message_id=None,
)
return await self.message.edit_live_location(
return await self._get_message().edit_live_location(
latitude=latitude,
longitude=longitude,
location=location,
@@ -503,10 +551,16 @@ class CallbackQuery(TelegramObject):
:meth:`telegram.Bot.stop_message_live_location` and
:meth:`telegram.Message.stop_live_location`.
.. versionchanged:: 20.8
Raises :exc:`TypeError` if :attr:`message` is not accessible.
Returns:
:class:`telegram.Message`: On success, if edited message is sent by the bot, the
edited Message is returned, otherwise :obj:`True` is returned.
Raises:
:exc:`TypeError` if :attr:`message` is not accessible.
"""
if self.inline_message_id:
return await self.get_bot().stop_message_live_location(
@@ -520,7 +574,7 @@ class CallbackQuery(TelegramObject):
chat_id=None,
message_id=None,
)
return await self.message.stop_live_location(
return await self._get_message().stop_live_location(
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -555,10 +609,16 @@ class CallbackQuery(TelegramObject):
For the documentation of the arguments, please see
:meth:`telegram.Bot.set_game_score` and :meth:`telegram.Message.set_game_score`.
.. versionchanged:: 20.8
Raises :exc:`TypeError` if :attr:`message` is not accessible.
Returns:
:class:`telegram.Message`: On success, if edited message is sent by the bot, the
edited Message is returned, otherwise :obj:`True` is returned.
Raises:
:exc:`TypeError` if :attr:`message` is not accessible.
"""
if self.inline_message_id:
return await self.get_bot().set_game_score(
@@ -575,7 +635,7 @@ class CallbackQuery(TelegramObject):
chat_id=None,
message_id=None,
)
return await self.message.set_game_score(
return await self._get_message().set_game_score(
user_id=user_id,
score=score,
force=force,
@@ -611,9 +671,15 @@ class CallbackQuery(TelegramObject):
:meth:`telegram.Bot.get_game_high_scores` and
:meth:`telegram.Message.get_game_high_scores`.
.. versionchanged:: 20.8
Raises :exc:`TypeError` if :attr:`message` is not accessible.
Returns:
Tuple[:class:`telegram.GameHighScore`]
Raises:
:exc:`TypeError` if :attr:`message` is not accessible.
"""
if self.inline_message_id:
return await self.get_bot().get_game_high_scores(
@@ -627,7 +693,7 @@ class CallbackQuery(TelegramObject):
chat_id=None,
message_id=None,
)
return await self.message.get_game_high_scores(
return await self._get_message().get_game_high_scores(
user_id=user_id,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -651,11 +717,17 @@ class CallbackQuery(TelegramObject):
For the documentation of the arguments, please see :meth:`telegram.Message.delete`.
.. versionchanged:: 20.8
Raises :exc:`TypeError` if :attr:`message` is not accessible.
Returns:
:obj:`bool`: On success, :obj:`True` is returned.
Raises:
:exc:`TypeError` if :attr:`message` is not accessible.
"""
return await self.message.delete(
return await self._get_message(action="delete").delete(
read_timeout=read_timeout,
write_timeout=write_timeout,
connect_timeout=connect_timeout,
@@ -679,11 +751,16 @@ class CallbackQuery(TelegramObject):
For the documentation of the arguments, please see :meth:`telegram.Message.pin`.
.. versionchanged:: 20.8
Raises :exc:`TypeError` if :attr:`message` is not accessible.
Returns:
:obj:`bool`: On success, :obj:`True` is returned.
Raises:
:exc:`TypeError` if :attr:`message` is not accessible.
"""
return await self.message.pin(
return await self._get_message(action="pin").pin(
disable_notification=disable_notification,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -707,11 +784,16 @@ class CallbackQuery(TelegramObject):
For the documentation of the arguments, please see :meth:`telegram.Message.unpin`.
.. versionchanged:: 20.8
Raises :exc:`TypeError` if :attr:`message` is not accessible.
Returns:
:obj:`bool`: On success, :obj:`True` is returned.
Raises:
:exc:`TypeError` if :attr:`message` is not accessible.
"""
return await self.message.unpin(
return await self._get_message(action="unpin").unpin(
read_timeout=read_timeout,
write_timeout=write_timeout,
connect_timeout=connect_timeout,
@@ -731,6 +813,7 @@ class CallbackQuery(TelegramObject):
reply_markup: Optional[ReplyMarkup] = None,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -749,11 +832,16 @@ class CallbackQuery(TelegramObject):
For the documentation of the arguments, please see :meth:`telegram.Message.copy`.
.. versionchanged:: 20.8
Raises :exc:`TypeError` if :attr:`message` is not accessible.
Returns:
:class:`telegram.MessageId`: On success, returns the MessageId of the sent message.
Raises:
:exc:`TypeError` if :attr:`message` is not accessible.
"""
return await self.message.copy(
return await self._get_message(action="copy").copy(
chat_id=chat_id,
caption=caption,
parse_mode=parse_mode,
@@ -769,11 +857,12 @@ class CallbackQuery(TelegramObject):
api_kwargs=api_kwargs,
protect_content=protect_content,
message_thread_id=message_thread_id,
reply_parameters=reply_parameters,
)
MAX_ANSWER_TEXT_LENGTH: Final[
int
] = constants.CallbackQueryLimit.ANSWER_CALLBACK_QUERY_TEXT_LENGTH
MAX_ANSWER_TEXT_LENGTH: Final[int] = (
constants.CallbackQueryLimit.ANSWER_CALLBACK_QUERY_TEXT_LENGTH
)
"""
:const:`telegram.constants.CallbackQueryLimit.ANSWER_CALLBACK_QUERY_TEXT_LENGTH`
+483 -37
View File
@@ -28,6 +28,7 @@ from telegram._chatpermissions import ChatPermissions
from telegram._files.chatphoto import ChatPhoto
from telegram._forumtopic import ForumTopic
from telegram._menubutton import MenuButton
from telegram._reaction import ReactionType
from telegram._telegramobject import TelegramObject
from telegram._utils import enum
from telegram._utils.argumentparsing import parse_sequence_arg
@@ -53,12 +54,15 @@ if TYPE_CHECKING:
InputMediaPhoto,
InputMediaVideo,
LabeledPrice,
LinkPreviewOptions,
Location,
Message,
MessageEntity,
MessageId,
PhotoSize,
ReplyParameters,
Sticker,
UserChatBoosts,
Venue,
Video,
VideoNote,
@@ -126,7 +130,11 @@ class Chat(TelegramObject):
be forwarded to other chats. Returned only in :meth:`telegram.Bot.get_chat`.
.. versionadded:: 13.9
has_visible_history (:obj:`bool`, optional): :obj:`True`, if new chat members will have
access to old messages; available only to chat administrators. Returned only in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.8
sticker_set_name (:obj:`str`, optional): For supergroups, name of group sticker set.
Returned only in :meth:`telegram.Bot.get_chat`.
can_set_sticker_set (:obj:`bool`, optional): :obj:`True`, if the bot can change group the
@@ -161,14 +169,43 @@ class Chat(TelegramObject):
only in :meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.0
available_reactions (Sequence[:class:`telegram.ReactionType`], optional): List of available
reactions allowed in the chat. If omitted, then all of
:const:`telegram.constants.ReactionEmoji` are allowed. Returned only in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.8
accent_color_id (:obj:`int`, optional): Identifier of the
:class:`accent color <telegram.constants.AccentColor>` for the chat name and
backgrounds of the chat photo, reply header, and link preview. See `accent colors`_
for more details. Returned only in :meth:`telegram.Bot.get_chat`. Always returned in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.8
background_custom_emoji_id (:obj:`str`, optional): Custom emoji identifier of emoji chosen
by the chat for the reply header and link preview background. Returned only in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.8
profile_accent_color_id (:obj:`int`, optional): Identifier of the
:class:`accent color <telegram.constants.ProfileAccentColor>` for the chat's profile
background. See profile `accent colors`_ for more details. Returned only in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.8
profile_background_custom_emoji_id (:obj:`str`, optional): Custom emoji identifier of
the emoji chosen by the chat for its profile background. Returned only in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.8
emoji_status_custom_emoji_id (:obj:`str`, optional): Custom emoji identifier of emoji
status of the other party in a private chat. Returned only in
status of the chat or the other party in a private chat. Returned only in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.0
emoji_status_expiration_date (:class:`datetime.datetime`, optional): Expiration date of
emoji status of the other party in a private chat, in seconds. Returned only in
:meth:`telegram.Bot.get_chat`.
emoji status of the chat or the other party in a private chat, in seconds. Returned
only in :meth:`telegram.Bot.get_chat`.
|datetime_localization|
.. versionadded:: 20.5
@@ -224,6 +261,11 @@ class Chat(TelegramObject):
be forwarded to other chats. Returned only in :meth:`telegram.Bot.get_chat`.
.. versionadded:: 13.9
has_visible_history (:obj:`bool`): Optional. :obj:`True`, if new chat members will have
access to old messages; available only to chat administrators. Returned only in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.8
sticker_set_name (:obj:`str`): Optional. For supergroups, name of Group sticker set.
Returned only in :meth:`telegram.Bot.get_chat`.
can_set_sticker_set (:obj:`bool`): Optional. :obj:`True`, if the bot can change group the
@@ -260,14 +302,43 @@ class Chat(TelegramObject):
obtained via :meth:`~telegram.Bot.get_chat`.
.. versionadded:: 20.0
available_reactions (Tuple[:class:`telegram.ReactionType`]): Optional. List of available
reactions allowed in the chat. If omitted, then all of
:const:`telegram.constants.ReactionEmoji` are allowed. Returned only in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.8
accent_color_id (:obj:`int`): Optional. Identifier of the
:class:`accent color <telegram.constants.AccentColor>` for the chat name and
backgrounds of the chat photo, reply header, and link preview. See `accent colors`_
for more details. Returned only in :meth:`telegram.Bot.get_chat`. Always returned in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.8
background_custom_emoji_id (:obj:`str`): Optional. Custom emoji identifier of emoji chosen
by the chat for the reply header and link preview background. Returned only in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.8
profile_accent_color_id (:obj:`int`): Optional. Identifier of the
:class:`accent color <telegram.constants.ProfileAccentColor>` for the chat's profile
background. See profile `accent colors`_ for more details. Returned only in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.8
profile_background_custom_emoji_id (:obj:`str`): Optional. Custom emoji identifier of
the emoji chosen by the chat for its profile background. Returned only in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.8
emoji_status_custom_emoji_id (:obj:`str`): Optional. Custom emoji identifier of emoji
status of the other party in a private chat. Returned only in
status of the chat or the other party in a private chat. Returned only in
:meth:`telegram.Bot.get_chat`.
.. versionadded:: 20.0
emoji_status_expiration_date (:class:`datetime.datetime`, optional): Expiration date of
emoji status of the other party in a private chat, in seconds. Returned only in
:meth:`telegram.Bot.get_chat`.
emoji_status_expiration_date (:class:`datetime.datetime`): Optional. Expiration date of
emoji status of the chat or the other party in a private chat, in seconds. Returned
only in :meth:`telegram.Bot.get_chat`.
|datetime_localization|
.. versionadded:: 20.5
@@ -283,38 +354,45 @@ class Chat(TelegramObject):
.. versionadded:: 20.0
.. _topics: https://telegram.org/blog/topics-in-groups-collectible-usernames#topics-in-groups
.. _accent colors: https://core.telegram.org/bots/api#accent-colors
"""
__slots__ = (
"bio",
"id",
"type",
"last_name",
"sticker_set_name",
"slow_mode_delay",
"location",
"first_name",
"permissions",
"invite_link",
"pinned_message",
"description",
"can_set_sticker_set",
"username",
"title",
"photo",
"linked_chat_id",
"message_auto_delete_time",
"has_protected_content",
"has_private_forwards",
"join_to_send_messages",
"join_by_request",
"has_restricted_voice_and_video_messages",
"is_forum",
"accent_color_id",
"active_usernames",
"available_reactions",
"background_custom_emoji_id",
"bio",
"can_set_sticker_set",
"description",
"emoji_status_custom_emoji_id",
"emoji_status_expiration_date",
"has_hidden_members",
"first_name",
"has_aggressive_anti_spam_enabled",
"has_hidden_members",
"has_private_forwards",
"has_protected_content",
"has_restricted_voice_and_video_messages",
"has_visible_history",
"id",
"invite_link",
"is_forum",
"join_by_request",
"join_to_send_messages",
"last_name",
"linked_chat_id",
"location",
"message_auto_delete_time",
"permissions",
"photo",
"pinned_message",
"profile_accent_color_id",
"profile_background_custom_emoji_id",
"slow_mode_delay",
"sticker_set_name",
"title",
"type",
"username",
)
SENDER: Final[str] = constants.ChatType.SENDER
@@ -362,6 +440,12 @@ class Chat(TelegramObject):
emoji_status_expiration_date: Optional[datetime] = None,
has_aggressive_anti_spam_enabled: Optional[bool] = None,
has_hidden_members: Optional[bool] = None,
available_reactions: Optional[Sequence[ReactionType]] = None,
accent_color_id: Optional[int] = None,
background_custom_emoji_id: Optional[str] = None,
profile_accent_color_id: Optional[int] = None,
profile_background_custom_emoji_id: Optional[str] = None,
has_visible_history: Optional[bool] = None,
*,
api_kwargs: Optional[JSONDict] = None,
):
@@ -386,21 +470,29 @@ class Chat(TelegramObject):
int(message_auto_delete_time) if message_auto_delete_time is not None else None
)
self.has_protected_content: Optional[bool] = has_protected_content
self.has_visible_history: Optional[bool] = has_visible_history
self.sticker_set_name: Optional[str] = sticker_set_name
self.can_set_sticker_set: Optional[bool] = can_set_sticker_set
self.linked_chat_id: Optional[int] = linked_chat_id
self.location: Optional[ChatLocation] = location
self.join_to_send_messages: Optional[bool] = join_to_send_messages
self.join_by_request: Optional[bool] = join_by_request
self.has_restricted_voice_and_video_messages: Optional[
bool
] = has_restricted_voice_and_video_messages
self.has_restricted_voice_and_video_messages: Optional[bool] = (
has_restricted_voice_and_video_messages
)
self.is_forum: Optional[bool] = is_forum
self.active_usernames: Tuple[str, ...] = parse_sequence_arg(active_usernames)
self.emoji_status_custom_emoji_id: Optional[str] = emoji_status_custom_emoji_id
self.emoji_status_expiration_date: Optional[datetime] = emoji_status_expiration_date
self.has_aggressive_anti_spam_enabled: Optional[bool] = has_aggressive_anti_spam_enabled
self.has_hidden_members: Optional[bool] = has_hidden_members
self.available_reactions: Optional[Tuple[ReactionType, ...]] = parse_sequence_arg(
available_reactions
)
self.accent_color_id: Optional[int] = accent_color_id
self.background_custom_emoji_id: Optional[str] = background_custom_emoji_id
self.profile_accent_color_id: Optional[int] = profile_accent_color_id
self.profile_background_custom_emoji_id: Optional[str] = profile_background_custom_emoji_id
self._id_attrs = (self.id,)
@@ -468,6 +560,7 @@ class Chat(TelegramObject):
data["pinned_message"] = Message.de_json(data.get("pinned_message"), bot)
data["permissions"] = ChatPermissions.de_json(data.get("permissions"), bot)
data["location"] = ChatLocation.de_json(data.get("location"), bot)
data["available_reactions"] = ReactionType.de_list(data.get("available_reactions"), bot)
api_kwargs = {}
# This is a deprecated field that TG still returns for backwards compatibility
@@ -1326,6 +1419,8 @@ class Chat(TelegramObject):
entities: Optional[Sequence["MessageEntity"]] = None,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
link_preview_options: ODVInput["LinkPreviewOptions"] = DEFAULT_NONE,
reply_parameters: Optional["ReplyParameters"] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -1350,6 +1445,8 @@ class Chat(TelegramObject):
disable_web_page_preview=disable_web_page_preview,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
link_preview_options=link_preview_options,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
allow_sending_without_reply=allow_sending_without_reply,
entities=entities,
@@ -1362,6 +1459,70 @@ class Chat(TelegramObject):
api_kwargs=api_kwargs,
)
async def delete_message(
self,
message_id: int,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
connect_timeout: ODVInput[float] = DEFAULT_NONE,
pool_timeout: ODVInput[float] = DEFAULT_NONE,
api_kwargs: Optional[JSONDict] = None,
) -> bool:
"""Shortcut for::
await bot.delete_message(update.effective_chat.id, *args, **kwargs)
For the documentation of the arguments, please see :meth:`telegram.Bot.delete_message`.
.. versionadded:: 20.8
Returns:
:obj:`bool`: On success, :obj:`True` is returned.
"""
return await self.get_bot().delete_message(
chat_id=self.id,
message_id=message_id,
read_timeout=read_timeout,
write_timeout=write_timeout,
connect_timeout=connect_timeout,
pool_timeout=pool_timeout,
api_kwargs=api_kwargs,
)
async def delete_messages(
self,
message_ids: Sequence[int],
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
connect_timeout: ODVInput[float] = DEFAULT_NONE,
pool_timeout: ODVInput[float] = DEFAULT_NONE,
api_kwargs: Optional[JSONDict] = None,
) -> bool:
"""Shortcut for::
await bot.delete_messages(update.effective_chat.id, *args, **kwargs)
For the documentation of the arguments, please see :meth:`telegram.Bot.delete_messages`.
.. versionadded:: 20.8
Returns:
:obj:`bool`: On success, :obj:`True` is returned.
"""
return await self.get_bot().delete_messages(
chat_id=self.id,
message_ids=message_ids,
read_timeout=read_timeout,
write_timeout=write_timeout,
connect_timeout=connect_timeout,
pool_timeout=pool_timeout,
api_kwargs=api_kwargs,
)
async def send_media_group(
self,
media: Sequence[
@@ -1372,6 +1533,7 @@ class Chat(TelegramObject):
allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -1409,6 +1571,7 @@ class Chat(TelegramObject):
caption=caption,
parse_mode=parse_mode,
caption_entities=caption_entities,
reply_parameters=reply_parameters,
)
async def send_chat_action(
@@ -1459,6 +1622,7 @@ class Chat(TelegramObject):
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
has_spoiler: Optional[bool] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
filename: Optional[str] = None,
read_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -1483,6 +1647,7 @@ class Chat(TelegramObject):
caption=caption,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
parse_mode=parse_mode,
allow_sending_without_reply=allow_sending_without_reply,
@@ -1510,6 +1675,7 @@ class Chat(TelegramObject):
allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
contact: Optional["Contact"] = None,
read_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -1535,6 +1701,7 @@ class Chat(TelegramObject):
last_name=last_name,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -1564,6 +1731,7 @@ class Chat(TelegramObject):
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
thumbnail: Optional[FileInput] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
filename: Optional[str] = None,
read_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -1591,6 +1759,7 @@ class Chat(TelegramObject):
caption=caption,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
parse_mode=parse_mode,
allow_sending_without_reply=allow_sending_without_reply,
@@ -1620,6 +1789,7 @@ class Chat(TelegramObject):
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
thumbnail: Optional[FileInput] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
filename: Optional[str] = None,
read_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -1645,6 +1815,7 @@ class Chat(TelegramObject):
caption=caption,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -1669,6 +1840,7 @@ class Chat(TelegramObject):
allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -1690,6 +1862,7 @@ class Chat(TelegramObject):
chat_id=self.id,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -1711,6 +1884,7 @@ class Chat(TelegramObject):
allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -1733,6 +1907,7 @@ class Chat(TelegramObject):
game_short_name=game_short_name,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -1773,6 +1948,7 @@ class Chat(TelegramObject):
suggested_tip_amounts: Optional[Sequence[int]] = None,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -1834,6 +2010,7 @@ class Chat(TelegramObject):
suggested_tip_amounts=suggested_tip_amounts,
protect_content=protect_content,
message_thread_id=message_thread_id,
reply_parameters=reply_parameters,
)
async def send_location(
@@ -1850,6 +2027,7 @@ class Chat(TelegramObject):
allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
location: Optional["Location"] = None,
read_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -1874,6 +2052,7 @@ class Chat(TelegramObject):
longitude=longitude,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -1907,6 +2086,7 @@ class Chat(TelegramObject):
message_thread_id: Optional[int] = None,
has_spoiler: Optional[bool] = None,
thumbnail: Optional[FileInput] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
filename: Optional[str] = None,
read_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -1935,6 +2115,7 @@ class Chat(TelegramObject):
parse_mode=parse_mode,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -1960,6 +2141,7 @@ class Chat(TelegramObject):
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
emoji: Optional[str] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -1982,6 +2164,7 @@ class Chat(TelegramObject):
sticker=sticker,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -2010,6 +2193,7 @@ class Chat(TelegramObject):
allow_sending_without_reply: ODVInput[bool] = DEFAULT_NONE,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
venue: Optional["Venue"] = None,
read_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -2037,6 +2221,7 @@ class Chat(TelegramObject):
foursquare_id=foursquare_id,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -2070,6 +2255,7 @@ class Chat(TelegramObject):
message_thread_id: Optional[int] = None,
has_spoiler: Optional[bool] = None,
thumbnail: Optional[FileInput] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
filename: Optional[str] = None,
read_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -2095,6 +2281,7 @@ class Chat(TelegramObject):
caption=caption,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -2126,6 +2313,7 @@ class Chat(TelegramObject):
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
thumbnail: Optional[FileInput] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
filename: Optional[str] = None,
read_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -2151,6 +2339,7 @@ class Chat(TelegramObject):
length=length,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -2177,6 +2366,7 @@ class Chat(TelegramObject):
caption_entities: Optional[Sequence["MessageEntity"]] = None,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
filename: Optional[str] = None,
read_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -2202,6 +2392,7 @@ class Chat(TelegramObject):
caption=caption,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -2236,6 +2427,7 @@ class Chat(TelegramObject):
explanation_entities: Optional[Sequence["MessageEntity"]] = None,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -2264,6 +2456,7 @@ class Chat(TelegramObject):
is_closed=is_closed,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
reply_markup=reply_markup,
read_timeout=read_timeout,
write_timeout=write_timeout,
@@ -2293,6 +2486,7 @@ class Chat(TelegramObject):
reply_markup: Optional[ReplyMarkup] = None,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -2306,6 +2500,8 @@ class Chat(TelegramObject):
For the documentation of the arguments, please see :meth:`telegram.Bot.copy_message`.
.. seealso:: :meth:`copy_message`, :meth:`send_copies`, :meth:`copy_messages`.
Returns:
:class:`telegram.Message`: On success, instance representing the message posted.
@@ -2319,6 +2515,7 @@ class Chat(TelegramObject):
caption_entities=caption_entities,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
allow_sending_without_reply=allow_sending_without_reply,
reply_markup=reply_markup,
read_timeout=read_timeout,
@@ -2343,6 +2540,7 @@ class Chat(TelegramObject):
reply_markup: Optional[ReplyMarkup] = None,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
reply_parameters: Optional["ReplyParameters"] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
@@ -2356,6 +2554,8 @@ class Chat(TelegramObject):
For the documentation of the arguments, please see :meth:`telegram.Bot.copy_message`.
.. seealso:: :meth:`send_copy`, :meth:`send_copies`, :meth:`copy_messages`.
Returns:
:class:`telegram.Message`: On success, instance representing the message posted.
@@ -2369,6 +2569,7 @@ class Chat(TelegramObject):
caption_entities=caption_entities,
disable_notification=disable_notification,
reply_to_message_id=reply_to_message_id,
reply_parameters=reply_parameters,
allow_sending_without_reply=allow_sending_without_reply,
reply_markup=reply_markup,
read_timeout=read_timeout,
@@ -2380,6 +2581,96 @@ class Chat(TelegramObject):
message_thread_id=message_thread_id,
)
async def send_copies(
self,
from_chat_id: Union[str, int],
message_ids: Sequence[int],
disable_notification: ODVInput[bool] = DEFAULT_NONE,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
remove_caption: Optional[bool] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
connect_timeout: ODVInput[float] = DEFAULT_NONE,
pool_timeout: ODVInput[float] = DEFAULT_NONE,
api_kwargs: Optional[JSONDict] = None,
) -> Tuple["MessageId", ...]:
"""Shortcut for::
await bot.copy_messages(chat_id=update.effective_chat.id, *args, **kwargs)
For the documentation of the arguments, please see :meth:`telegram.Bot.copy_messages`.
.. seealso:: :meth:`copy_message`, :meth:`send_copy`, :meth:`copy_messages`.
.. versionadded:: 20.8
Returns:
Tuple[:class:`telegram.MessageId`]: On success, a tuple of :class:`~telegram.MessageId`
of the sent messages is returned.
"""
return await self.get_bot().copy_messages(
chat_id=self.id,
from_chat_id=from_chat_id,
message_ids=message_ids,
disable_notification=disable_notification,
protect_content=protect_content,
message_thread_id=message_thread_id,
remove_caption=remove_caption,
read_timeout=read_timeout,
write_timeout=write_timeout,
connect_timeout=connect_timeout,
pool_timeout=pool_timeout,
api_kwargs=api_kwargs,
)
async def copy_messages(
self,
chat_id: Union[str, int],
message_ids: Sequence[int],
disable_notification: ODVInput[bool] = DEFAULT_NONE,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
remove_caption: Optional[bool] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
connect_timeout: ODVInput[float] = DEFAULT_NONE,
pool_timeout: ODVInput[float] = DEFAULT_NONE,
api_kwargs: Optional[JSONDict] = None,
) -> Tuple["MessageId", ...]:
"""Shortcut for::
await bot.copy_messages(from_chat_id=update.effective_chat.id, *args, **kwargs)
For the documentation of the arguments, please see :meth:`telegram.Bot.copy_messages`.
.. seealso:: :meth:`copy_message`, :meth:`send_copy`, :meth:`send_copies`.
.. versionadded:: 20.8
Returns:
Tuple[:class:`telegram.MessageId`]: On success, a tuple of :class:`~telegram.MessageId`
of the sent messages is returned.
"""
return await self.get_bot().copy_messages(
from_chat_id=self.id,
chat_id=chat_id,
message_ids=message_ids,
disable_notification=disable_notification,
protect_content=protect_content,
message_thread_id=message_thread_id,
remove_caption=remove_caption,
read_timeout=read_timeout,
write_timeout=write_timeout,
connect_timeout=connect_timeout,
pool_timeout=pool_timeout,
api_kwargs=api_kwargs,
)
async def forward_from(
self,
from_chat_id: Union[str, int],
@@ -2400,7 +2691,7 @@ class Chat(TelegramObject):
For the documentation of the arguments, please see :meth:`telegram.Bot.forward_message`.
.. seealso:: :meth:`forward_to`
.. seealso:: :meth:`forward_to`, :meth:`forward_messages_from`, :meth:`forward_messages_to`
.. versionadded:: 20.0
@@ -2442,7 +2733,8 @@ class Chat(TelegramObject):
For the documentation of the arguments, please see :meth:`telegram.Bot.forward_message`.
.. seealso:: :meth:`forward_from`
.. seealso:: :meth:`forward_from`, :meth:`forward_messages_from`,
:meth:`forward_messages_to`
.. versionadded:: 20.0
@@ -2464,6 +2756,92 @@ class Chat(TelegramObject):
message_thread_id=message_thread_id,
)
async def forward_messages_from(
self,
from_chat_id: Union[str, int],
message_ids: Sequence[int],
disable_notification: ODVInput[bool] = DEFAULT_NONE,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
connect_timeout: ODVInput[float] = DEFAULT_NONE,
pool_timeout: ODVInput[float] = DEFAULT_NONE,
api_kwargs: Optional[JSONDict] = None,
) -> Tuple["MessageId", ...]:
"""Shortcut for::
await bot.forward_messages(chat_id=update.effective_chat.id, *args, **kwargs)
For the documentation of the arguments, please see :meth:`telegram.Bot.forward_messages`.
.. seealso:: :meth:`forward_to`, :meth:`forward_from`, :meth:`forward_messages_to`.
.. versionadded:: 20.8
Returns:
Tuple[:class:`telegram.MessageId`]: On success, a tuple of :class:`~telegram.MessageId`
of sent messages is returned.
"""
return await self.get_bot().forward_messages(
chat_id=self.id,
from_chat_id=from_chat_id,
message_ids=message_ids,
disable_notification=disable_notification,
protect_content=protect_content,
message_thread_id=message_thread_id,
read_timeout=read_timeout,
write_timeout=write_timeout,
connect_timeout=connect_timeout,
pool_timeout=pool_timeout,
api_kwargs=api_kwargs,
)
async def forward_messages_to(
self,
chat_id: Union[int, str],
message_ids: Sequence[int],
disable_notification: ODVInput[bool] = DEFAULT_NONE,
protect_content: ODVInput[bool] = DEFAULT_NONE,
message_thread_id: Optional[int] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
connect_timeout: ODVInput[float] = DEFAULT_NONE,
pool_timeout: ODVInput[float] = DEFAULT_NONE,
api_kwargs: Optional[JSONDict] = None,
) -> Tuple["MessageId", ...]:
"""Shortcut for::
await bot.forward_messages(from_chat_id=update.effective_chat.id, *args, **kwargs)
For the documentation of the arguments, please see :meth:`telegram.Bot.forward_messages`.
.. seealso:: :meth:`forward_from`, :meth:`forward_to`, :meth:`forward_messages_from`.
.. versionadded:: 20.8
Returns:
Tuple[:class:`telegram.MessageId`]: On success, a tuple of :class:`~telegram.MessageId`
of sent messages is returned.
"""
return await self.get_bot().forward_messages(
from_chat_id=self.id,
chat_id=chat_id,
message_ids=message_ids,
disable_notification=disable_notification,
protect_content=protect_content,
message_thread_id=message_thread_id,
read_timeout=read_timeout,
write_timeout=write_timeout,
connect_timeout=connect_timeout,
pool_timeout=pool_timeout,
api_kwargs=api_kwargs,
)
async def export_invite_link(
self,
*,
@@ -3142,3 +3520,71 @@ class Chat(TelegramObject):
pool_timeout=pool_timeout,
api_kwargs=api_kwargs,
)
async def get_user_chat_boosts(
self,
user_id: int,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
connect_timeout: ODVInput[float] = DEFAULT_NONE,
pool_timeout: ODVInput[float] = DEFAULT_NONE,
api_kwargs: Optional[JSONDict] = None,
) -> "UserChatBoosts":
"""Shortcut for::
await bot.get_user_chat_boosts(chat_id=update.effective_chat.id, *args, **kwargs)
For the documentation of the arguments, please see
:meth:`telegram.Bot.get_user_chat_boosts`.
.. versionadded:: 20.8
Returns:
:class:`telegram.UserChatBoosts`: On success, returns the boosts applied in the chat.
"""
return await self.get_bot().get_user_chat_boosts(
chat_id=self.id,
user_id=user_id,
api_kwargs=api_kwargs,
read_timeout=read_timeout,
write_timeout=write_timeout,
connect_timeout=connect_timeout,
pool_timeout=pool_timeout,
)
async def set_message_reaction(
self,
message_id: int,
reaction: Optional[Union[Sequence[Union[ReactionType, str]], ReactionType, str]] = None,
is_big: Optional[bool] = None,
*,
read_timeout: ODVInput[float] = DEFAULT_NONE,
write_timeout: ODVInput[float] = DEFAULT_NONE,
connect_timeout: ODVInput[float] = DEFAULT_NONE,
pool_timeout: ODVInput[float] = DEFAULT_NONE,
api_kwargs: Optional[JSONDict] = None,
) -> bool:
"""Shortcut for::
await bot.set_message_reaction(chat_id=update.effective_chat.id, *args, **kwargs)
For the documentation of the arguments, please see
:meth:`telegram.Bot.set_message_reaction`.
.. versionadded:: 20.8
Returns:
:obj:`bool` On success, :obj:`True` is returned.
"""
return await self.get_bot().set_message_reaction(
chat_id=self.id,
message_id=message_id,
reaction=reaction,
is_big=is_big,
read_timeout=read_timeout,
write_timeout=write_timeout,
connect_timeout=connect_timeout,
pool_timeout=pool_timeout,
api_kwargs=api_kwargs,
)
+13 -13
View File
@@ -132,21 +132,21 @@ class ChatAdministratorRights(TelegramObject):
"""
__slots__ = (
"is_anonymous",
"can_manage_chat",
"can_delete_messages",
"can_manage_video_chats",
"can_restrict_members",
"can_promote_members",
"can_change_info",
"can_invite_users",
"can_post_messages",
"can_edit_messages",
"can_pin_messages",
"can_manage_topics",
"can_post_stories",
"can_edit_stories",
"can_delete_messages",
"can_delete_stories",
"can_edit_messages",
"can_edit_stories",
"can_invite_users",
"can_manage_chat",
"can_manage_topics",
"can_manage_video_chats",
"can_pin_messages",
"can_post_messages",
"can_post_stories",
"can_promote_members",
"can_restrict_members",
"is_anonymous",
)
def __init__(
+408
View File
@@ -0,0 +1,408 @@
#!/usr/bin/env python
#
# A library that provides a Python interface to the Telegram Bot API
# Copyright (C) 2015-2024
# Leandro Toledo de Souza <devs@python-telegram-bot.org>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser Public License for more details.
#
# You should have received a copy of the GNU Lesser Public License
# along with this program. If not, see [http://www.gnu.org/licenses/].
"""This module contains the classes that represent Telegram ChatBoosts."""
from datetime import datetime
from typing import TYPE_CHECKING, Dict, Final, Optional, Sequence, Tuple, Type
from telegram import constants
from telegram._chat import Chat
from telegram._telegramobject import TelegramObject
from telegram._user import User
from telegram._utils import enum
from telegram._utils.argumentparsing import parse_sequence_arg
from telegram._utils.datetime import extract_tzinfo_from_defaults, from_timestamp
from telegram._utils.types import JSONDict
if TYPE_CHECKING:
from telegram import Bot
class ChatBoostSource(TelegramObject):
"""
Base class for Telegram ChatBoostSource objects. It can be one of:
* :class:`telegram.ChatBoostSourcePremium`
* :class:`telegram.ChatBoostSourceGiftCode`
* :class:`telegram.ChatBoostSourceGiveaway`
Objects of this class are comparable in terms of equality. Two objects of this class are
considered equal, if their :attr:`source` is equal.
.. versionadded:: 20.8
Args:
source (:obj:`str`): The source of the chat boost. Can be one of:
:attr:`~telegram.ChatBoostSource.PREMIUM`, :attr:`~telegram.ChatBoostSource.GIFT_CODE`,
or :attr:`~telegram.ChatBoostSource.GIVEAWAY`.
Attributes:
source (:obj:`str`): The source of the chat boost. Can be one of:
:attr:`~telegram.ChatBoostSource.PREMIUM`, :attr:`~telegram.ChatBoostSource.GIFT_CODE`,
or :attr:`~telegram.ChatBoostSource.GIVEAWAY`.
"""
__slots__ = ("source",)
PREMIUM: Final[str] = constants.ChatBoostSources.PREMIUM
""":const:`telegram.constants.ChatBoostSources.PREMIUM`"""
GIFT_CODE: Final[str] = constants.ChatBoostSources.GIFT_CODE
""":const:`telegram.constants.ChatBoostSources.GIFT_CODE`"""
GIVEAWAY: Final[str] = constants.ChatBoostSources.GIVEAWAY
""":const:`telegram.constants.ChatBoostSources.GIVEAWAY`"""
def __init__(self, source: str, *, api_kwargs: Optional[JSONDict] = None):
super().__init__(api_kwargs=api_kwargs)
# Required by all subclasses:
self.source: str = enum.get_member(constants.ChatBoostSources, source, source)
self._id_attrs = (self.source,)
self._freeze()
@classmethod
def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatBoostSource"]:
"""See :meth:`telegram.TelegramObject.de_json`."""
data = cls._parse_data(data)
if not data:
return None
_class_mapping: Dict[str, Type[ChatBoostSource]] = {
cls.PREMIUM: ChatBoostSourcePremium,
cls.GIFT_CODE: ChatBoostSourceGiftCode,
cls.GIVEAWAY: ChatBoostSourceGiveaway,
}
if cls is ChatBoostSource and data.get("source") in _class_mapping:
return _class_mapping[data.pop("source")].de_json(data=data, bot=bot)
if "user" in data:
data["user"] = User.de_json(data.get("user"), bot)
return super().de_json(data=data, bot=bot)
class ChatBoostSourcePremium(ChatBoostSource):
"""
The boost was obtained by subscribing to Telegram Premium or by gifting a Telegram Premium
subscription to another user.
.. versionadded:: 20.8
Args:
user (:class:`telegram.User`): User that boosted the chat.
Attributes:
source (:obj:`str`): The source of the chat boost. Always
:attr:`~telegram.ChatBoostSource.PREMIUM`.
user (:class:`telegram.User`): User that boosted the chat.
"""
__slots__ = ("user",)
def __init__(self, user: User, *, api_kwargs: Optional[JSONDict] = None):
super().__init__(source=self.PREMIUM, api_kwargs=api_kwargs)
with self._unfrozen():
self.user: User = user
class ChatBoostSourceGiftCode(ChatBoostSource):
"""
The boost was obtained by the creation of Telegram Premium gift codes to boost a chat. Each
such code boosts the chat 4 times for the duration of the corresponding Telegram Premium
subscription.
.. versionadded:: 20.8
Args:
user (:class:`telegram.User`): User for which the gift code was created.
Attributes:
source (:obj:`str`): The source of the chat boost. Always
:attr:`~telegram.ChatBoostSource.GIFT_CODE`.
user (:class:`telegram.User`): User for which the gift code was created.
"""
__slots__ = ("user",)
def __init__(self, user: User, *, api_kwargs: Optional[JSONDict] = None):
super().__init__(source=self.GIFT_CODE, api_kwargs=api_kwargs)
with self._unfrozen():
self.user: User = user
class ChatBoostSourceGiveaway(ChatBoostSource):
"""
The boost was obtained by the creation of a Telegram Premium giveaway. This boosts the chat 4
times for the duration of the corresponding Telegram Premium subscription.
.. versionadded:: 20.8
Args:
giveaway_message_id (:obj:`int`): Identifier of a message in the chat with the giveaway;
the message could have been deleted already. May be 0 if the message isn't sent yet.
user (:class:`telegram.User`, optional): User that won the prize in the giveaway if any.
is_unclaimed (:obj:`bool`, optional): :obj:`True`, if the giveaway was completed, but
there was no user to win the prize.
Attributes:
source (:obj:`str`): Source of the boost. Always
:attr:`~telegram.ChatBoostSource.GIVEAWAY`.
giveaway_message_id (:obj:`int`): Identifier of a message in the chat with the giveaway;
the message could have been deleted already. May be 0 if the message isn't sent yet.
user (:class:`telegram.User`): Optional. User that won the prize in the giveaway if any.
is_unclaimed (:obj:`bool`): Optional. :obj:`True`, if the giveaway was completed, but
there was no user to win the prize.
"""
__slots__ = ("giveaway_message_id", "is_unclaimed", "user")
def __init__(
self,
giveaway_message_id: int,
user: Optional[User] = None,
is_unclaimed: Optional[bool] = None,
*,
api_kwargs: Optional[JSONDict] = None,
):
super().__init__(source=self.GIVEAWAY, api_kwargs=api_kwargs)
with self._unfrozen():
self.giveaway_message_id: int = giveaway_message_id
self.user: Optional[User] = user
self.is_unclaimed: Optional[bool] = is_unclaimed
class ChatBoost(TelegramObject):
"""
This object contains information about a chat boost.
Objects of this class are comparable in terms of equality. Two objects of this class are
considered equal, if their :attr:`boost_id`, :attr:`add_date`, :attr:`expiration_date`,
and :attr:`source` are equal.
.. versionadded:: 20.8
Args:
boost_id (:obj:`str`): Unique identifier of the boost.
add_date (:obj:`datetime.datetime`): Point in time when the chat was boosted.
expiration_date (:obj:`datetime.datetime`): Point in time when the boost
will automatically expire, unless the booster's Telegram Premium subscription is
prolonged.
source (:class:`telegram.ChatBoostSource`): Source of the added boost.
Attributes:
boost_id (:obj:`str`): Unique identifier of the boost.
add_date (:obj:`datetime.datetime`): Point in time when the chat was boosted.
|datetime_localization|
expiration_date (:obj:`datetime.datetime`): Point in time when the boost
will automatically expire, unless the booster's Telegram Premium subscription is
prolonged. |datetime_localization|
source (:class:`telegram.ChatBoostSource`): Source of the added boost.
"""
__slots__ = ("add_date", "boost_id", "expiration_date", "source")
def __init__(
self,
boost_id: str,
add_date: datetime,
expiration_date: datetime,
source: ChatBoostSource,
*,
api_kwargs: Optional[JSONDict] = None,
):
super().__init__(api_kwargs=api_kwargs)
self.boost_id: str = boost_id
self.add_date: datetime = add_date
self.expiration_date: datetime = expiration_date
self.source: ChatBoostSource = source
self._id_attrs = (self.boost_id, self.add_date, self.expiration_date, self.source)
self._freeze()
@classmethod
def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatBoost"]:
"""See :meth:`telegram.TelegramObject.de_json`."""
data = cls._parse_data(data)
if not data:
return None
data["source"] = ChatBoostSource.de_json(data.get("source"), bot)
loc_tzinfo = extract_tzinfo_from_defaults(bot)
data["add_date"] = from_timestamp(data["add_date"], tzinfo=loc_tzinfo)
data["expiration_date"] = from_timestamp(data["expiration_date"], tzinfo=loc_tzinfo)
return super().de_json(data=data, bot=bot)
class ChatBoostUpdated(TelegramObject):
"""This object represents a boost added to a chat or changed.
Objects of this class are comparable in terms of equality. Two objects of this class are
considered equal, if their :attr:`chat`, and :attr:`boost` are equal.
.. versionadded:: 20.8
Args:
chat (:class:`telegram.Chat`): Chat which was boosted.
boost (:class:`telegram.ChatBoost`): Information about the chat boost.
Attributes:
chat (:class:`telegram.Chat`): Chat which was boosted.
boost (:class:`telegram.ChatBoost`): Information about the chat boost.
"""
__slots__ = ("boost", "chat")
def __init__(
self,
chat: Chat,
boost: ChatBoost,
*,
api_kwargs: Optional[JSONDict] = None,
):
super().__init__(api_kwargs=api_kwargs)
self.chat: Chat = chat
self.boost: ChatBoost = boost
self._id_attrs = (self.chat.id, self.boost)
self._freeze()
@classmethod
def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatBoostUpdated"]:
"""See :meth:`telegram.TelegramObject.de_json`."""
data = cls._parse_data(data)
if not data:
return None
data["chat"] = Chat.de_json(data.get("chat"), bot)
data["boost"] = ChatBoost.de_json(data.get("boost"), bot)
return super().de_json(data=data, bot=bot)
class ChatBoostRemoved(TelegramObject):
"""
This object represents a boost removed from a chat.
Objects of this class are comparable in terms of equality. Two objects of this class are
considered equal, if their :attr:`chat`, :attr:`boost_id`, :attr:`remove_date`, and
:attr:`source` are equal.
Args:
chat (:class:`telegram.Chat`): Chat which was boosted.
boost_id (:obj:`str`): Unique identifier of the boost.
remove_date (:obj:`datetime.datetime`): Point in time when the boost was removed.
source (:class:`telegram.ChatBoostSource`): Source of the removed boost.
Attributes:
chat (:class:`telegram.Chat`): Chat which was boosted.
boost_id (:obj:`str`): Unique identifier of the boost.
remove_date (:obj:`datetime.datetime`): Point in time when the boost was removed.
|datetime_localization|
source (:class:`telegram.ChatBoostSource`): Source of the removed boost.
"""
__slots__ = ("boost_id", "chat", "remove_date", "source")
def __init__(
self,
chat: Chat,
boost_id: str,
remove_date: datetime,
source: ChatBoostSource,
*,
api_kwargs: Optional[JSONDict] = None,
):
super().__init__(api_kwargs=api_kwargs)
self.chat: Chat = chat
self.boost_id: str = boost_id
self.remove_date: datetime = remove_date
self.source: ChatBoostSource = source
self._id_attrs = (self.chat, self.boost_id, self.remove_date, self.source)
self._freeze()
@classmethod
def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["ChatBoostRemoved"]:
"""See :meth:`telegram.TelegramObject.de_json`."""
data = cls._parse_data(data)
if not data:
return None
data["chat"] = Chat.de_json(data.get("chat"), bot)
data["source"] = ChatBoostSource.de_json(data.get("source"), bot)
loc_tzinfo = extract_tzinfo_from_defaults(bot)
data["remove_date"] = from_timestamp(data["remove_date"], tzinfo=loc_tzinfo)
return super().de_json(data=data, bot=bot)
class UserChatBoosts(TelegramObject):
"""This object represents a list of boosts added to a chat by a user.
Objects of this class are comparable in terms of equality. Two objects of this class are
considered equal, if their :attr:`boosts` are equal.
.. versionadded:: 20.8
Args:
boosts (Sequence[:class:`telegram.ChatBoost`]): List of boosts added to the chat by the
user.
Attributes:
boosts (Tuple[:class:`telegram.ChatBoost`]): List of boosts added to the chat by the user.
"""
__slots__ = ("boosts",)
def __init__(
self,
boosts: Sequence[ChatBoost],
*,
api_kwargs: Optional[JSONDict] = None,
):
super().__init__(api_kwargs=api_kwargs)
self.boosts: Tuple[ChatBoost, ...] = parse_sequence_arg(boosts)
self._id_attrs = (self.boosts,)
self._freeze()
@classmethod
def de_json(cls, data: Optional[JSONDict], bot: "Bot") -> Optional["UserChatBoosts"]:
"""See :meth:`telegram.TelegramObject.de_json`."""
data = cls._parse_data(data)
if not data:
return None
data["boosts"] = ChatBoost.de_list(data.get("boosts"), bot)
return super().de_json(data=data, bot=bot)
+3 -3
View File
@@ -100,14 +100,14 @@ class ChatInviteLink(TelegramObject):
"""
__slots__ = (
"invite_link",
"creates_join_request",
"creator",
"expire_date",
"invite_link",
"is_primary",
"is_revoked",
"expire_date",
"member_limit",
"name",
"creates_join_request",
"pending_join_request_count",
)
+1 -1
View File
@@ -100,7 +100,7 @@ class ChatJoinRequest(TelegramObject):
"""
__slots__ = ("chat", "from_user", "date", "bio", "invite_link", "user_chat_id")
__slots__ = ("bio", "chat", "date", "from_user", "invite_link", "user_chat_id")
def __init__(
self,
+1 -1
View File
@@ -50,7 +50,7 @@ class ChatLocation(TelegramObject):
"""
__slots__ = ("location", "address")
__slots__ = ("address", "location")
def __init__(
self,
+24 -24
View File
@@ -72,7 +72,7 @@ class ChatMember(TelegramObject):
"""
__slots__ = ("user", "status")
__slots__ = ("status", "user")
ADMINISTRATOR: Final[str] = constants.ChatMemberStatus.ADMINISTRATOR
""":const:`telegram.constants.ChatMemberStatus.ADMINISTRATOR`"""
@@ -162,7 +162,7 @@ class ChatMemberOwner(ChatMember):
this user.
"""
__slots__ = ("is_anonymous", "custom_title")
__slots__ = ("custom_title", "is_anonymous")
def __init__(
self,
@@ -300,22 +300,22 @@ class ChatMemberAdministrator(ChatMember):
__slots__ = (
"can_be_edited",
"is_anonymous",
"can_manage_chat",
"can_delete_messages",
"can_manage_video_chats",
"can_restrict_members",
"can_promote_members",
"can_change_info",
"can_invite_users",
"can_post_messages",
"can_edit_messages",
"can_pin_messages",
"can_manage_topics",
"custom_title",
"can_post_stories",
"can_edit_stories",
"can_delete_messages",
"can_delete_stories",
"can_edit_messages",
"can_edit_stories",
"can_invite_users",
"can_manage_chat",
"can_manage_topics",
"can_manage_video_chats",
"can_pin_messages",
"can_post_messages",
"can_post_stories",
"can_promote_members",
"can_restrict_members",
"custom_title",
"is_anonymous",
)
def __init__(
@@ -505,22 +505,22 @@ class ChatMemberRestricted(ChatMember):
"""
__slots__ = (
"is_member",
"can_add_web_page_previews",
"can_change_info",
"can_invite_users",
"can_pin_messages",
"can_send_messages",
"can_send_polls",
"can_send_other_messages",
"can_add_web_page_previews",
"can_manage_topics",
"until_date",
"can_pin_messages",
"can_send_audios",
"can_send_documents",
"can_send_messages",
"can_send_other_messages",
"can_send_photos",
"can_send_videos",
"can_send_polls",
"can_send_video_notes",
"can_send_videos",
"can_send_voice_notes",
"is_member",
"until_date",
)
def __init__(
+3 -3
View File
@@ -85,11 +85,11 @@ class ChatMemberUpdated(TelegramObject):
__slots__ = (
"chat",
"from_user",
"date",
"old_chat_member",
"new_chat_member",
"from_user",
"invite_link",
"new_chat_member",
"old_chat_member",
"via_chat_folder_invite_link",
)
+7 -7
View File
@@ -137,19 +137,19 @@ class ChatPermissions(TelegramObject):
"""
__slots__ = (
"can_send_other_messages",
"can_invite_users",
"can_send_polls",
"can_send_messages",
"can_change_info",
"can_pin_messages",
"can_add_web_page_previews",
"can_change_info",
"can_invite_users",
"can_manage_topics",
"can_pin_messages",
"can_send_audios",
"can_send_documents",
"can_send_messages",
"can_send_other_messages",
"can_send_photos",
"can_send_videos",
"can_send_polls",
"can_send_video_notes",
"can_send_videos",
"can_send_voice_notes",
)
+1 -1
View File
@@ -65,7 +65,7 @@ class ChosenInlineResult(TelegramObject):
"""
__slots__ = ("location", "result_id", "from_user", "inline_message_id", "query")
__slots__ = ("from_user", "inline_message_id", "location", "query", "result_id")
def __init__(
self,
+1 -1
View File
@@ -98,7 +98,7 @@ class Dice(TelegramObject):
self._freeze()
DICE: Final[str] = constants.DiceEmoji.DICE # skipcq: PTC-W0052
DICE: Final[str] = constants.DiceEmoji.DICE
""":const:`telegram.constants.DiceEmoji.DICE`"""
DARTS: Final[str] = constants.DiceEmoji.DARTS
""":const:`telegram.constants.DiceEmoji.DARTS`"""
+1 -1
View File
@@ -69,7 +69,7 @@ class Animation(_BaseThumbedMedium):
"""
__slots__ = ("duration", "height", "file_name", "mime_type", "width")
__slots__ = ("duration", "file_name", "height", "mime_type", "width")
def __init__(
self,
+1 -1
View File
@@ -74,10 +74,10 @@ class ChatPhoto(TelegramObject):
"""
__slots__ = (
"big_file_id",
"big_file_unique_id",
"small_file_id",
"small_file_unique_id",
"big_file_id",
)
def __init__(
+1 -1
View File
@@ -45,7 +45,7 @@ class Contact(TelegramObject):
"""
__slots__ = ("vcard", "user_id", "first_name", "last_name", "phone_number")
__slots__ = ("first_name", "last_name", "phone_number", "user_id", "vcard")
def __init__(
self,
+6 -2
View File
@@ -74,11 +74,11 @@ class File(TelegramObject):
"""
__slots__ = (
"_credentials",
"file_id",
"file_path",
"file_size",
"file_unique_id",
"file_path",
"_credentials",
)
def __init__(
@@ -231,6 +231,10 @@ class File(TelegramObject):
.. seealso:: :wiki:`Working with Files and Media <Working-with-Files-and-Media>`
Hint:
If you want to immediately read the data from ``out`` after calling this method, you
should call ``out.seek(0)`` first. See also :meth:`io.IOBase.seek`.
.. versionadded:: 20.0
Args:
+1 -1
View File
@@ -63,7 +63,7 @@ class InputFile:
"""
__slots__ = ("filename", "attach_name", "input_file_content", "mimetype")
__slots__ = ("attach_name", "filename", "input_file_content", "mimetype")
def __init__(
self,
+7 -5
View File
@@ -19,6 +19,7 @@
"""Base class for Telegram InputMedia Objects."""
from typing import Optional, Sequence, Tuple, Union
from telegram import constants
from telegram._files.animation import Animation
from telegram._files.audio import Audio
from telegram._files.document import Document
@@ -27,6 +28,7 @@ from telegram._files.photosize import PhotoSize
from telegram._files.video import Video
from telegram._messageentity import MessageEntity
from telegram._telegramobject import TelegramObject
from telegram._utils import enum
from telegram._utils.argumentparsing import parse_sequence_arg
from telegram._utils.defaultvalue import DEFAULT_NONE
from telegram._utils.files import parse_file_input
@@ -94,7 +96,7 @@ class InputMedia(TelegramObject):
api_kwargs: Optional[JSONDict] = None,
):
super().__init__(api_kwargs=api_kwargs)
self.type: str = media_type
self.type: str = enum.get_member(constants.InputMediaType, media_type, media_type)
self.media: Union[str, InputFile, Animation, Audio, Document, PhotoSize, Video] = media
self.caption: Optional[str] = caption
self.caption_entities: Tuple[MessageEntity, ...] = parse_sequence_arg(caption_entities)
@@ -184,7 +186,7 @@ class InputMediaAnimation(InputMedia):
.. versionadded:: 20.2
"""
__slots__ = ("duration", "height", "width", "has_spoiler", "thumbnail")
__slots__ = ("duration", "has_spoiler", "height", "thumbnail", "width")
def __init__(
self,
@@ -387,11 +389,11 @@ class InputMediaVideo(InputMedia):
__slots__ = (
"duration",
"has_spoiler",
"height",
"supports_streaming",
"width",
"has_spoiler",
"thumbnail",
"width",
)
def __init__(
@@ -505,7 +507,7 @@ class InputMediaAudio(InputMedia):
"""
__slots__ = ("duration", "performer", "title", "thumbnail")
__slots__ = ("duration", "performer", "thumbnail", "title")
def __init__(
self,
+1 -1
View File
@@ -70,7 +70,7 @@ class InputSticker(TelegramObject):
"""
__slots__ = ("sticker", "emoji_list", "mask_position", "keywords")
__slots__ = ("emoji_list", "keywords", "mask_position", "sticker")
def __init__(
self,

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