Compare commits

...

33 Commits

Author SHA1 Message Date
Pieter Schutz 6012fa65c1 Bump to version 8.0 2017-09-01 10:38:15 +02:00
Pieter Schutz ef9dbacf7e Fix last issues for new release 2017-09-01 10:38:04 +02:00
Eldinnie e13cd58773 Fix sticker tests (#807)
* Fix sticker tests

Added flaky, timeout and xfails to the stickerset bot method tests.

* Make sure the first stickersettest worked before modifying in test 2

* some mor changes to make the deletion more stable
2017-09-01 08:47:34 +02:00
Jannes Höke 1f5311b473 catch exceptions in error handlerfor errors that happen during polling (2) (#810)
* catch exceptions in error handlerfor errors that happen during polling

* add tests for error handlers that raise exceptions
2017-09-01 08:46:21 +02:00
Eldinnie eae139d3e9 remove de_json() (#789)
* remove de_json()

* Remove or rename obsolete tests

* fixes according to rc
2017-09-01 08:45:22 +02:00
Eldinnie 160ffed5ad Remove Botan (#776) 2017-09-01 08:45:01 +02:00
Jacob Bom 8cda3f7a71 Turn on branch coverage (#790)
* Run pre commit hook tests on all platforms TEMPORARILY

* Use os.system instead of subprocess.call

* Turn on branch coverage

* Let's try this then

* More testing!

* Update test_meta.py
2017-09-01 08:44:45 +02:00
Jacob Bom d7929a8de4 Test UserProfilePhotos (#796) 2017-09-01 08:44:26 +02:00
Noam Meltzer e018445513 Documentation update to PEP (#797) 2017-09-01 08:43:08 +02:00
Eldinnie 4601eedf0f Show status_updates in docs (#798)
* Show status_updates in docs

* Show status_updates in docs
2017-09-01 08:41:15 +02:00
Eldinnie 6cd0c14c02 Show what parameter/attribute is missing in test_offical (#808)
* Show what parameter/attribute is missing in test_offical

* Only run test_official on py3.6

Down from 3.5 and 3.6
2017-09-01 08:40:52 +02:00
Jeff b6a0853896 Add Bot API 3.3 (#806)
* Bot API 3.3

* simpler helper methods (accept only custom names now)
attempt to fix circular import (not sure if its the correct way tho)
added helper methods into User object

* fix User objects in tests to contain is_bot required value

* fix User objects in tests to contain is_bot required value

* delete extra line that caused flake8 error

* fix swapped arguments
2017-09-01 08:40:05 +02:00
Noam Meltzer 16a49ec659 Remove DispatcherHandlerContinue + more unitests for dispatcher (#792)
The idea was nice, but it really complicated things for us and for the
user.
If a user wants to run more than one handler on an update, he can put
the handlers in different groups or he can have a single handler.
If a user wants to have multiple handlers in the same group which only
one of them should run on the update, he should use check_update().

Since we haven't released this code yet, there's no problem with
backward compatability.
2017-08-12 18:57:12 +03:00
Noam Meltzer ee34d57521 Warn on small con_pool_size during custom initalization of Updater (#793)
fixes #787
2017-08-12 16:45:38 +03:00
Jacob Bom 5d7c6ad541 Switch to pytest + required fixes to code (#788)
Required fixes:
 - CallbackQuery is now comparable.
 - Message.effective_attachment, Message.photo,
   Message.new_chat_members, Message.new_chat_photo &
   Game.text_entitties semantic fixes - when they are not defined,
   return an empty list.
 - Docstring fix to Update class.
2017-08-12 00:58:41 +03:00
Noam Meltzer 915cd64140 Effective attachment (#766)
fixes #746
2017-08-08 00:25:19 +03:00
Eldinnie 56f7d18853 bot.py semantic fixes (#774)
offset for get_user_profile_photo can be zero.
edit_message_caption should raise ValueError in compliance with other methods. Also changed to snake_case
edit_message_reply_markup was even weirder
2017-08-08 00:13:32 +03:00
Eldinnie b04869f36a docstring correction (#775)
[ci skip]
2017-08-08 00:11:44 +03:00
Eldinnie 70057a67c5 Regression fix for text_html & text_markdown (#777)
`text_html` & `text_markdown` reverted to the old semantics - URLs are not converted to hyperlinks.
To get the new behaviour there are matching `text_html_urled` & `text_markdown_urled` properties.
fixes #773
2017-08-08 00:10:48 +03:00
Eldinnie 8d4b484f7b Fix Game.to_dict() (#767)
`Game.to_dict()` fails if the `optional` parameter `test_entities` has it's default value `None`
This fixes that.
2017-08-05 00:02:51 +03:00
Jacob Bom 073bed3a01 Fix get_game_high_scores (#771) 2017-08-04 20:41:27 +03:00
Noam Meltzer 5ceb6f8f36 Docs fixes (#765)
* Clean warnings during build_sphinx

* fix documentation types
2017-08-02 05:56:07 +03:00
Ihor Polyakov b6ef30a454 Authors list (#758) 2017-08-01 23:10:07 +03:00
Ihor Polyakov 1b515a16d6 CONTRIBUTING.rst: Note about git behaviour (#763) 2017-08-01 23:09:15 +03:00
Jacob Bom b3069348ca Add rich comparison to CallbackQuery (#764)
We currently have no tests for it. Noted for #756 and #757.
2017-08-01 23:07:12 +03:00
Ihor Polyakov 454ab050c0 Decrease number of requests in tests (#755) 2017-08-01 00:16:44 +03:00
Eldinnie d19ae5084a Add RESTRICTED as constant to ChatMember (#761) 2017-07-31 23:37:00 +03:00
Ihor Polyakov 6aacde189e Flow control ability in Dispatcher (#738)
fixes #666
2017-07-29 20:15:43 +03:00
Noam Meltzer 5d3f5575ab Sane defaults for tcp socket options on linux (#754)
Currently only for linux as most of our userbase is there.

fixes #535
2017-07-29 14:30:27 +03:00
Noam Meltzer 13ab6d43d3 CHANGES.rst: Added 7.0.1 release notes.
[ci skip]
2017-07-28 21:22:48 +03:00
Eldinnie 2ba7505eaf Fix TypeError exception in RegexHandler (#751)
fixes #750
2017-07-28 20:47:42 +03:00
Eldinnie 5ed06df840 callback query docstring (#749)
showed from instead of from_user and was missing the informational note about it.

[ci skip]
2017-07-28 17:41:25 +03:00
Noam Meltzer eef1238d60 Comment out unitest test_send_contact_with_contact
Caused too many "RetryAfter: Flood control exceeded" errors.

[ci skip]
2017-07-28 17:39:21 +03:00
213 changed files with 9389 additions and 8633 deletions
-8
View File
@@ -1,8 +0,0 @@
[run]
source = telegram
omit = telegram/vendor/*
[report]
omit =
tests/
telegram/vendor/*
+33 -18
View File
@@ -1,10 +1,10 @@
How To Contribute
===================
=================
Every open source project lives from the generous help by contributors that sacrifice their time and ``python-telegram-bot`` is no different. To make participation as pleasant as possible, this project adheres to the `Code of Conduct`_ by the Python Software Foundation.
Setting things up
-------------------
-----------------
1. Fork the ``python-telegram-bot`` repository to your GitHub account.
@@ -35,7 +35,7 @@ Setting things up
$ pre-commit install
Finding something to do
###################
#######################
If you already know what you'd like to work on, you can skip this section.
@@ -44,7 +44,7 @@ If you have an idea for something to do, first check if it's already been filed
Another great way to start contributing is by writing tests. Tests are really important because they help prevent developers from accidentally breaking existing code, allowing them to build cool things faster. If you're interested in helping out, let the development team know by posting to the `developers' mailing list`_, and we'll help you get started.
Instructions for making a code change
####################
#####################################
The central development branch is ``master``, which should be clean and ready for release at any time. In general, all changes should be done as feature branches based off of ``master``.
@@ -89,7 +89,7 @@ Here's how to make a one-off code change.
.. code-block::
$ nosetests -v
$ pytest -v
- To actually make the commit (this will trigger tests for yapf, lint and pep8 automatically):
@@ -129,13 +129,19 @@ Here's how to make a one-off code change.
.. code-block:: bash
$ git checkout your-branch-name
$ git fetch upstream
$ git merge upstream/master
$ ...[fix the conflicts]...
$ ...[make sure the tests pass before committing]...
$ git commit -a
$ git push origin your-branch-name
$ git checkout your-branch-name
$ git fetch upstream
$ git merge upstream/master
$ ...[fix the conflicts]...
$ ...[make sure the tests pass before committing]...
$ git commit -a
$ git push origin your-branch-name
- If after merging you see local modified files in ``telegram/vendor/`` directory, that you didn't actually touch, that means you need to update submodules with this command:
.. code-block:: bash
$ git submodule update --init --recursive
- At the end, the reviewer will merge the pull request.
@@ -149,20 +155,29 @@ Here's how to make a one-off code change.
7. **Celebrate.** Congratulations, you have contributed to ``python-telegram-bot``!
Style commandments
---------------------
------------------
Specific commandments
#####################
- Avoid using "double quotes" where you can reasonably use 'single quotes'.
AssertEqual argument order
######################
Assert comparison order
#######################
- assertEqual method's arguments should be in ('actual', 'expected') order.
- assert statements should compare in **actual** == **expected** order.
For example (assuming ``test_call`` is the thing being tested):
.. code-block:: python
# GOOD
assert test_call() == 5
# BAD
assert 5 == test_call()
Properly calling callables
#######################
##########################
Methods, functions and classes can specify optional parameters (with default
values) using Python's keyword arg syntax. When providing a value to such a
@@ -180,7 +195,7 @@ This gives us the flexibility to re-order arguments and more importantly
to add new required arguments. It's also more explicit and easier to read.
Properly defining optional arguments
########################
####################################
It's always good to not initialize optional arguments at class creation,
instead use ``**kwargs`` to get them. It's well known Telegram API can
+1 -1
View File
@@ -17,4 +17,4 @@
files: ^telegram/.*\.py$
args:
- --errors-only
- --disable=no-name-in-module,import-error
- --disable=import-error
+8 -5
View File
@@ -18,18 +18,21 @@ branches:
cache:
directories:
- $HOME/.cache/pip
- $HOME/.pre-commit
before_cache:
- rm -f $HOME/.cache/pip/log/debug.log
- rm -f $HOME/.pre-commit/pre-commit.log
install:
- pip install coveralls
- pip install coveralls pytest-cov
- pip install -U wheel
- pip install -r requirements.txt
- pip install -r requirements-dev.txt
- pip install -U -r requirements.txt
- pip install -U -r requirements-dev.txt
- if [[ $TRAVIS_PYTHON_VERSION != 'pypy'* ]]; then pip install ujson; fi
script:
- python travis.py
- pytest -v --cov=telegram
after_success:
coveralls
- coverage combine
- coveralls
+4 -3
View File
@@ -16,8 +16,8 @@ Contributors
The following wonderful people contributed directly or indirectly to this project:
- `Alateas <https://github.com/alateas>`_
- `Avanatiker <https://github.com/Avanatiker>`_
- `Anton Tagunov <https://github.com/anton-tagunov>`_
- `Avanatiker <https://github.com/Avanatiker>`_
- `Balduro <https://github.com/Balduro>`_
- `bimmlerd <https://github.com/bimmlerd>`_
- `d-qoi <https://github.com/d-qoi>`_
@@ -29,15 +29,17 @@ The following wonderful people contributed directly or indirectly to this projec
- `evgfilim1 <https://github.com/evgfilim1>`_
- `franciscod <https://github.com/franciscod>`_
- `Hugo Damer <https://github.com/HakimusGIT>`_
- `ihoru <https://github.com/ihoru>`_
- `Jacob Bom <https://github.com/bomjacob>`_
- `JASON0916 <https://github.com/JASON0916>`_
- `jeffffc <https://github.com/jeffffc>`_
- `Jelle Besseling <https://github.com/pingiun>`_
- `jh0ker <https://github.com/jh0ker>`_
- `jlmadurga <https://github.com/jlmadurga>`_
- `John Yong <https://github.com/whipermr5>`_
- `Joscha Götzer <https://github.com/Rostgnom>`_
- `jossalgon <https://github.com/jossalgon>`_
- `JRoot3D <https://github.com/JRoot3D>`_
- `jlmadurga <https://github.com/jlmadurga>`_
- `Kjwon15 <https://github.com/kjwon15>`_
- `Li-aung Yip <https://github.com/LiaungYip>`_
- `macrojames <https://github.com/macrojames>`_
@@ -51,7 +53,6 @@ The following wonderful people contributed directly or indirectly to this projec
- `Patrick Hofmann <https://github.com/PH89>`_
- `Pieter Schutz <https://github.com/eldinnie>`_
- `Rahiel Kasim <https://github.com/rahiel>`_
- `Joscha Götzer <https://github.com/Rostgnom>`_
- `Sascha <https://github.com/saschalalala>`_
- `Shelomentsev D <https://github.com/shelomentsevd>`_
- `sooyhwang <https://github.com/sooyhwang>`_
+47
View File
@@ -1,6 +1,53 @@
=======
Changes
=======
**2017-09-01**
*Released 8.0.0*
New features
- Fully support Bot Api 3.3 (PR `#806`_).
- DispatcherHandlerStop (`see docs`_).
- Regression fix for text_html & text_markdown (PR `#777`_).
- Added effective_attachment to message (PR `#766`_).
Non backward compatible changes
- Removed Botan support from the library (PR `#776`_).
- Fully support Bot Api 3.3 (PR `#806`_).
- Remove de_json() (PR `#789`_).
Changes
- Sane defaults for tcp socket options on linux (PR `#754`_).
- Add RESTRICTED as constant to ChatMember (PR `#761`_).
- Add rich comparison to CallbackQuery (PR `#764`_).
- Fix get_game_high_scores (PR `#771`_).
- Warn on small con_pool_size during custom initalization of Updater (PR `#793`_).
- Catch exceptions in error handlerfor errors that happen during polling (PR `#810`_).
- For testing we switched to pytest (PR `#788`_).
- Lot's of small improvements to our tests and documentation.
.. _`see docs`: http://python-telegram-bot.readthedocs.io/en/stable/telegram.ext.dispatcher.html#telegram.ext.Dispatcher.add_handler
.. _`#777`: https://github.com/python-telegram-bot/python-telegram-bot/pull/777
.. _`#806`: https://github.com/python-telegram-bot/python-telegram-bot/pull/806
.. _`#766`: https://github.com/python-telegram-bot/python-telegram-bot/pull/766
.. _`#776`: https://github.com/python-telegram-bot/python-telegram-bot/pull/776
.. _`#789`: https://github.com/python-telegram-bot/python-telegram-bot/pull/789
.. _`#754`: https://github.com/python-telegram-bot/python-telegram-bot/pull/754
.. _`#761`: https://github.com/python-telegram-bot/python-telegram-bot/pull/761
.. _`#764`: https://github.com/python-telegram-bot/python-telegram-bot/pull/764
.. _`#771`: https://github.com/python-telegram-bot/python-telegram-bot/pull/771
.. _`#788`: https://github.com/python-telegram-bot/python-telegram-bot/pull/788
.. _`#793`: https://github.com/python-telegram-bot/python-telegram-bot/pull/793
.. _`#810`: https://github.com/python-telegram-bot/python-telegram-bot/pull/810
**2017-07-28**
*Released 7.0.1*
- Fix TypeError exception in RegexHandler (PR #751).
- Small documentation fix (PR #749).
**2017-07-25**
*Released 7.0.0*
+4 -4
View File
@@ -2,7 +2,7 @@
.PHONY: clean pep257 pep8 yapf lint test install
PYLINT := pylint
NOSETESTS := nosetests
PYTEST := pytest
PEP257 := pep257
PEP8 := flake8
YAPF := yapf
@@ -29,7 +29,7 @@ lint:
$(PYLINT) -E telegram --disable=no-name-in-module,import-error
test:
$(NOSETESTS) -v
$(PYTEST) -v
install:
$(PIP) install -r requirements.txt -r requirements-dev.txt
@@ -41,11 +41,11 @@ help:
@echo "- pep8 Check style with flake8"
@echo "- lint Check style with pylint"
@echo "- yapf Check style with yapf"
@echo "- test Run tests"
@echo "- test Run tests using pytest"
@echo
@echo "Available variables:"
@echo "- PYLINT default: $(PYLINT)"
@echo "- NOSETESTS default: $(NOSETESTS)"
@echo "- PYTEST default: $(PYTEST)"
@echo "- PEP257 default: $(PEP257)"
@echo "- PEP8 default: $(PEP8)"
@echo "- YAPF default: $(YAPF)"
+1 -5
View File
@@ -24,8 +24,4 @@ build: off
cache: C:\Users\appveyor\pip\wheels
test_script:
- "%python%\\Scripts\\nosetests -v --with-flaky --no-flaky-report tests"
after_test:
# This step builds your wheels.
- "%PYTHON%\\python.exe setup.py bdist_wheel"
- "%python%\\Scripts\\pytest -v --cov=telegram"
View File
+2 -2
View File
@@ -58,9 +58,9 @@ author = u'Leandro Toledo'
# built documents.
#
# The short X.Y version.
version = '7.0' # telegram.__version__[:3]
version = '8.0' # telegram.__version__[:3]
# The full version, including alpha/beta/rc tags.
release = '7.0.0' # telegram.__version__
release = '8.0.0' # telegram.__version__
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
-7
View File
@@ -1,7 +0,0 @@
telegram.contrib.Botan
======================
.. autoclass:: telegram.contrib.Botan
:members:
:undoc-members:
:show-inheritance:
-18
View File
@@ -1,18 +0,0 @@
telegram.contrib package
========================
Submodules
----------
.. toctree::
telegram.contrib.botan
Module contents
---------------
.. automodule:: telegram.contrib
:members:
:undoc-members:
:show-inheritance:
:noindex:
-1
View File
@@ -3,7 +3,6 @@ telegram package
.. toctree::
telegram.contrib
telegram.ext
telegram.audio
telegram.bot
+2 -3
View File
@@ -1,10 +1,9 @@
flake8
nose
pep257
pylint
flaky
yapf
pre-commit
pre-commit-hooks
beautifulsoup4
rednose
pytest
pytest-timeout
+18
View File
@@ -17,3 +17,21 @@ ignore = W503
based_on_style = google
split_before_logical_operator = True
column_limit = 99
[tool:pytest]
testpaths = tests
addopts = --no-success-flaky-report -rsxX
filterwarnings =
error
ignore::DeprecationWarning
[coverage:run]
branch = True
source = telegram
parallel = True
concurrency = thread, multiprocessing
omit =
tests/
telegram/__main__.py
telegram/vendor/*
+2 -3
View File
@@ -27,9 +27,7 @@ from abc import ABCMeta
class TelegramObject(object):
"""
Base class for most telegram objects.
"""
"""Base class for most telegram objects."""
__metaclass__ = ABCMeta
_id_attrs = ()
@@ -53,6 +51,7 @@ class TelegramObject(object):
"""
Returns:
:obj:`str`
"""
return json.dumps(self.to_dict())
+99 -134
View File
@@ -72,8 +72,7 @@ def message(func):
class Bot(TelegramObject):
"""
This object represents a Telegram Bot.
"""This object represents a Telegram Bot.
Args:
token (:obj:`str`): Bot's unique authentication.
@@ -81,6 +80,7 @@ class Bot(TelegramObject):
base_file_url (:obj:`str`, optional): Telegram Bot API file URL.
request (:obj:`telegram.utils.Request`, optional): Pre initialized
:obj:`telegram.utils.Request`.
"""
def __init__(self, token, base_url=None, base_file_url=None, request=None):
@@ -104,7 +104,7 @@ class Bot(TelegramObject):
@staticmethod
def _validate_token(token):
"""a very basic validation on token"""
"""A very basic validation on token."""
if any(x.isspace() for x in token):
raise InvalidToken()
@@ -117,44 +117,34 @@ class Bot(TelegramObject):
@property
@info
def id(self):
"""
:obj:`int`: Unique identifier for this bot.
"""
""":obj:`int`: Unique identifier for this bot."""
return self.bot.id
@property
@info
def first_name(self):
"""
:obj:`str`: Bot's first name.
"""
""":obj:`str`: Bot's first name."""
return self.bot.first_name
@property
@info
def last_name(self):
"""
:obj:`str`: Optional. Bot's last name.
"""
""":obj:`str`: Optional. Bot's last name."""
return self.bot.last_name
@property
@info
def username(self):
"""
:obj:`str`: Bot's username.
"""
""":obj:`str`: Bot's username."""
return self.bot.username
@property
def name(self):
"""
:obj:`str`: Bot's @username.
"""
""":obj:`str`: Bot's @username."""
return '@{0}'.format(self.username)
@@ -181,8 +171,7 @@ class Bot(TelegramObject):
@log
def get_me(self, timeout=None, **kwargs):
"""
A simple method for testing your bot's auth token. Requires no parameters.
"""A simple method for testing your bot's auth token. Requires no parameters.
Args:
timeout (:obj:`int` | :obj:`float`, optional): If this value is specified, use it as
@@ -195,8 +184,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/getMe'.format(self.base_url)
result = self._request.get(url, timeout=timeout)
@@ -217,8 +206,7 @@ class Bot(TelegramObject):
reply_markup=None,
timeout=None,
**kwargs):
"""
Use this method to send text messages.
"""Use this method to send text messages.
Args:
chat_id (:obj:`int` | :obj:`str`): Unique identifier for the target chat or username
@@ -247,8 +235,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendMessage'.format(self.base_url)
data = {'chat_id': chat_id, 'text': text}
@@ -286,8 +274,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/deleteMessage'.format(self.base_url)
data = {'chat_id': chat_id, 'message_id': message_id}
@@ -305,8 +293,7 @@ class Bot(TelegramObject):
disable_notification=False,
timeout=None,
**kwargs):
"""
Use this method to forward messages of any kind.
"""Use this method to forward messages of any kind.
Args:
chat_id (:obj:`int` | :obj:`str`): Unique identifier for the target chat or username
@@ -327,8 +314,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/forwardMessage'.format(self.base_url)
data = {}
@@ -353,8 +340,7 @@ class Bot(TelegramObject):
reply_markup=None,
timeout=20.,
**kwargs):
"""
Use this method to send photos.
"""Use this method to send photos.
Note:
The video argument can be either a file_id, an URL or a file from disk
@@ -385,8 +371,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendPhoto'.format(self.base_url)
if isinstance(photo, PhotoSize):
@@ -452,8 +438,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendAudio'.format(self.base_url)
if isinstance(audio, Audio):
@@ -484,8 +470,7 @@ class Bot(TelegramObject):
reply_markup=None,
timeout=20.,
**kwargs):
"""
Use this method to send general files.
"""Use this method to send general files.
Note:
The document argument can be either a file_id, an URL or a file from disk
@@ -518,8 +503,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendDocument'.format(self.base_url)
if isinstance(document, Document):
@@ -544,8 +529,7 @@ class Bot(TelegramObject):
reply_markup=None,
timeout=None,
**kwargs):
"""
Use this method to send .webp stickers.
"""Use this method to send .webp stickers.
Note:
The sticker argument can be either a file_id, an URL or a file from disk
@@ -574,8 +558,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendSticker'.format(self.base_url)
if isinstance(sticker, Sticker):
@@ -616,7 +600,7 @@ class Bot(TelegramObject):
the Internet, or upload a new one using multipart/form-data. Lastly you can pass
an existing :class:`telegram.Video` object to send.
duration (:obj:`int`, optional): Duration of sent video in seconds.
width (Optional[int)): Video width.
width (:obj:`int`, optional): Video width.
height (:obj:`int`, optional): Video height.
caption (:obj:`str`, optional): Video caption (may also be used when resending videos
by file_id), 0-200 characters.
@@ -635,8 +619,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendVideo'.format(self.base_url)
if isinstance(video, Video):
@@ -701,8 +685,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendVoice'.format(self.base_url)
if isinstance(voice, Voice):
@@ -729,8 +713,7 @@ class Bot(TelegramObject):
reply_markup=None,
timeout=20.,
**kwargs):
"""
Use this method to send video messages.
"""Use this method to send video messages.
Note:
The video_note argument can be either a file_id or a file from disk
@@ -761,8 +744,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendVideoNote'.format(self.base_url)
if isinstance(video_note, VideoNote):
@@ -789,8 +772,7 @@ class Bot(TelegramObject):
timeout=None,
location=None,
**kwargs):
"""
Use this method to send point on the map.
"""Use this method to send point on the map.
Note:
You can either supply a :obj:`latitude` and :obj:`longitude` or a :obj:`location`.
@@ -818,8 +800,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendLocation'.format(self.base_url)
if not (all([latitude, longitude]) or location):
@@ -849,8 +831,7 @@ class Bot(TelegramObject):
timeout=None,
venue=None,
**kwargs):
"""
Use this method to send information about a venue.
"""Use this method to send information about a venue.
Note:
you can either supply :obj:`venue`, or :obj:`latitude`, :obj:`longitude`,
@@ -882,8 +863,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendVenue'.format(self.base_url)
if not (venue or all([latitude, longitude, address, title])):
@@ -923,8 +904,7 @@ class Bot(TelegramObject):
timeout=None,
contact=None,
**kwargs):
"""
Use this method to send phone contacts.
"""Use this method to send phone contacts.
Note:
You can either supply :obj:`contact` or :obj:`phone_number` and :obj:`first_name`
@@ -954,8 +934,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendContact'.format(self.base_url)
if (not contact) and (not all([phone_number, first_name])):
@@ -984,8 +964,7 @@ class Bot(TelegramObject):
reply_markup=None,
timeout=None,
**kwargs):
"""
Use this method to send a game.
"""Use this method to send a game.
Args:
chat_id (:obj:`int` | :obj:`str`): Unique identifier for the target chat or username
@@ -1009,8 +988,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendGame'.format(self.base_url)
data = {'chat_id': chat_id, 'game_short_name': game_short_name}
@@ -1040,8 +1019,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendChatAction'.format(self.base_url)
data = {'chat_id': chat_id, 'action': action}
@@ -1104,8 +1083,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/answerInlineQuery'.format(self.base_url)
results = [res.to_dict() for res in results]
@@ -1131,8 +1110,7 @@ class Bot(TelegramObject):
@log
def get_user_profile_photos(self, user_id, offset=None, limit=100, timeout=None, **kwargs):
"""
Use this method to get a list of profile pictures for a user.
"""Use this method to get a list of profile pictures for a user.
Args:
user_id (:obj:`int`): Unique identifier of the target user.
@@ -1150,13 +1128,13 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/getUserProfilePhotos'.format(self.base_url)
data = {'user_id': user_id}
if offset:
if offset is not None:
data['offset'] = offset
if limit:
data['limit'] = limit
@@ -1187,8 +1165,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/getFile'.format(self.base_url)
data = {'file_id': file_id}
@@ -1230,8 +1208,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/kickChatMember'.format(self.base_url)
data = {'chat_id': chat_id, 'user_id': user_id}
@@ -1248,8 +1226,8 @@ class Bot(TelegramObject):
@log
def unban_chat_member(self, chat_id, user_id, timeout=None, **kwargs):
"""
Use this method to unban a previously kicked user in a supergroup.
"""Use this method to unban a previously kicked user in a supergroup.
The user will not return to the group automatically, but will be able to join via link,
etc. The bot must be an administrator in the group for this to work.
@@ -1267,8 +1245,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/unbanChatMember'.format(self.base_url)
data = {'chat_id': chat_id, 'user_id': user_id}
@@ -1319,8 +1297,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url_ = '{0}/answerCallbackQuery'.format(self.base_url)
data = {'callback_query_id': callback_query_id}
@@ -1380,8 +1358,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/editMessageText'.format(self.base_url)
data = {'text': text}
@@ -1435,11 +1413,11 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
if inline_message_id is None and (chat_id is None or message_id is None):
raise TelegramError(
'editMessageCaption: Both chat_id and message_id are required when '
raise ValueError(
'edit_message_caption: Both chat_id and message_id are required when '
'inline_message_id is not specified')
url = '{0}/editMessageCaption'.format(self.base_url)
@@ -1491,11 +1469,11 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
if inline_message_id is None and (chat_id is None or message_id is None):
raise TelegramError(
'editMessageCaption: Both chat_id and message_id are required when '
raise ValueError(
'edit_message_reply_markup: Both chat_id and message_id are required when '
'inline_message_id is not specified')
url = '{0}/editMessageReplyMarkup'.format(self.base_url)
@@ -1520,8 +1498,7 @@ class Bot(TelegramObject):
read_latency=2.,
allowed_updates=None,
**kwargs):
"""
Use this method to receive incoming updates using long polling.
"""Use this method to receive incoming updates using long polling.
Args:
offset (:obj:`int`, optional): Identifier of the first update to be returned. Must be
@@ -1557,8 +1534,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/getUpdates'.format(self.base_url)
if network_delay is not None:
@@ -1646,12 +1623,12 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url_ = '{0}/setWebhook'.format(self.base_url)
# Backwards-compatibility: 'url' used to be named 'webhook_url'
if 'webhook_url' in kwargs:
if 'webhook_url' in kwargs: # pragma: no cover
warnings.warn("The 'webhook_url' parameter has been renamed to 'url' in accordance "
"with the API")
@@ -1694,8 +1671,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/deleteWebhook'.format(self.base_url)
data = kwargs
@@ -1706,8 +1683,7 @@ class Bot(TelegramObject):
@log
def leave_chat(self, chat_id, timeout=None, **kwargs):
"""
Use this method for your bot to leave a group, supergroup or channel.
"""Use this method for your bot to leave a group, supergroup or channel.
Args:
chat_id (:obj:`int` | :obj:`str`): Unique identifier for the target chat or username
@@ -1722,8 +1698,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/leaveChat'.format(self.base_url)
data = {'chat_id': chat_id}
@@ -1752,8 +1728,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/getChat'.format(self.base_url)
data = {'chat_id': chat_id}
@@ -1784,8 +1760,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/getChatAdministrators'.format(self.base_url)
data = {'chat_id': chat_id}
@@ -1797,8 +1773,7 @@ class Bot(TelegramObject):
@log
def get_chat_members_count(self, chat_id, timeout=None, **kwargs):
"""
Use this method to get the number of members in a chat
"""Use this method to get the number of members in a chat
Args:
chat_id (:obj:`int` | :obj:`str`): Unique identifier for the target chat or username
@@ -1813,8 +1788,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/getChatMembersCount'.format(self.base_url)
data = {'chat_id': chat_id}
@@ -1826,8 +1801,7 @@ class Bot(TelegramObject):
@log
def get_chat_member(self, chat_id, user_id, timeout=None, **kwargs):
"""
Use this method to get information about a member of a chat.
"""Use this method to get information about a member of a chat.
Args:
chat_id (:obj:`int` | :obj:`str`): Unique identifier for the target chat or username
@@ -1843,8 +1817,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/getChatMember'.format(self.base_url)
data = {'chat_id': chat_id, 'user_id': user_id}
@@ -1855,8 +1829,8 @@ class Bot(TelegramObject):
return ChatMember.de_json(result, self)
def get_webhook_info(self, timeout=None, **kwargs):
"""
Use this method to get current webhook status. Requires no parameters.
"""Use this method to get current webhook status. Requires no parameters.
If the bot is using getUpdates, will return an object with the url field empty.
Args:
@@ -1867,8 +1841,8 @@ class Bot(TelegramObject):
Returns:
:class:`telegram.WebhookInfo`
"""
"""
url = '{0}/getWebhookInfo'.format(self.base_url)
data = kwargs
@@ -1920,8 +1894,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`: If the new score is not greater than the user's
current score in the chat and force is False.
"""
"""
url = '{0}/setGameScore'.format(self.base_url)
data = {'user_id': user_id, 'score': score}
@@ -1969,9 +1943,9 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
url = '{0}/setGameScore'.format(self.base_url)
"""
url = '{0}/getGameHighScores'.format(self.base_url)
data = {'user_id': user_id}
@@ -2012,8 +1986,7 @@ class Bot(TelegramObject):
reply_markup=None,
timeout=None,
**kwargs):
"""
Use this method to send invoices.
"""Use this method to send invoices.
Args:
chat_id (:obj:`int` | :obj:`str`): Unique identifier for the target private chat.
@@ -2060,8 +2033,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/sendInvoice'.format(self.base_url)
data = {
@@ -2130,8 +2103,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
ok = bool(ok)
if ok and (shipping_options is None or error_message is not None):
@@ -2189,8 +2162,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
ok = bool(ok)
if not (ok ^ (error_message is not None)):
@@ -2247,8 +2220,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/restrictChatMember'.format(self.base_url)
data = {'chat_id': chat_id, 'user_id': user_id}
@@ -2314,8 +2287,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/promoteChatMember'.format(self.base_url)
data = {'chat_id': chat_id, 'user_id': user_id}
@@ -2361,8 +2334,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/exportChatInviteLink'.format(self.base_url)
data = {'chat_id': chat_id}
@@ -2374,8 +2347,8 @@ class Bot(TelegramObject):
@log
def set_chat_photo(self, chat_id, photo, timeout=None, **kwargs):
"""
Use this method to set a new profile photo for the chat.
"""Use this method to set a new profile photo for the chat.
Photos can't be changed for private chats. The bot must be an administrator in the chat
for this to work and must have the appropriate admin rights.
@@ -2397,8 +2370,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/setChatPhoto'.format(self.base_url)
data = {'chat_id': chat_id, 'photo': photo}
@@ -2432,8 +2405,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/deleteChatPhoto'.format(self.base_url)
data = {'chat_id': chat_id}
@@ -2468,8 +2441,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/setChatTitle'.format(self.base_url)
data = {'chat_id': chat_id, 'title': title}
@@ -2499,8 +2472,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/setChatDescription'.format(self.base_url)
data = {'chat_id': chat_id, 'description': description}
@@ -2533,8 +2506,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/pinChatMessage'.format(self.base_url)
data = {'chat_id': chat_id, 'message_id': message_id}
@@ -2566,8 +2539,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/unpinChatMessage'.format(self.base_url)
data = {'chat_id': chat_id}
@@ -2579,8 +2552,7 @@ class Bot(TelegramObject):
@log
def get_sticker_set(self, name, timeout=None, **kwargs):
"""
Use this method to get a sticker set.
"""Use this method to get a sticker set.
Args:
name (:obj:`str`): Short name of the sticker set that is used in t.me/addstickers/
@@ -2595,8 +2567,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/getStickerSet'.format(self.base_url)
data = {'name': name}
@@ -2632,8 +2604,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/uploadStickerFile'.format(self.base_url)
data = {'user_id': user_id, 'png_sticker': png_sticker}
@@ -2646,8 +2618,8 @@ class Bot(TelegramObject):
@log
def create_new_sticker_set(self, user_id, name, title, png_sticker, emojis,
contains_masks=None, mask_position=None, timeout=None, **kwargs):
"""
Use this method to create new sticker set owned by a user.
"""Use this method to create new sticker set owned by a user.
The bot will be able to edit the created sticker set.
Note:
@@ -2683,8 +2655,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/createNewStickerSet'.format(self.base_url)
data = {'user_id': user_id, 'name': name, 'title': title, 'png_sticker': png_sticker,
@@ -2703,8 +2675,7 @@ class Bot(TelegramObject):
@log
def add_sticker_to_set(self, user_id, name, png_sticker, emojis, mask_position=None,
timeout=None, **kwargs):
"""
Use this method to add a new sticker to a set created by the bot.
"""Use this method to add a new sticker to a set created by the bot.
Note:
The png_sticker argument can be either a file_id, an URL or a file from disk
@@ -2732,8 +2703,8 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
"""
url = '{0}/addStickerToSet'.format(self.base_url)
data = {'user_id': user_id, 'name': name, 'png_sticker': png_sticker, 'emojis': emojis}
@@ -2748,8 +2719,7 @@ class Bot(TelegramObject):
@log
def set_sticker_position_in_set(self, sticker, position, timeout=None, **kwargs):
"""
Use this method to move a sticker in a set created by the bot to a specific position.
"""Use this method to move a sticker in a set created by the bot to a specific position.
Args:
sticker (:obj:`str`): File identifier of the sticker.
@@ -2764,6 +2734,7 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
url = '{0}/setStickerPositionInSet'.format(self.base_url)
@@ -2776,8 +2747,7 @@ class Bot(TelegramObject):
@log
def delete_sticker_from_set(self, sticker, timeout=None, **kwargs):
"""
Use this method to delete a sticker from a set created by the bot.
"""Use this method to delete a sticker from a set created by the bot.
Args:
sticker (:obj:`str`): File identifier of the sticker.
@@ -2791,6 +2761,7 @@ class Bot(TelegramObject):
Raises:
:class:`telegram.TelegramError`
"""
url = '{0}/deleteStickerFromSet'.format(self.base_url)
@@ -2801,12 +2772,6 @@ class Bot(TelegramObject):
return result
@classmethod
def de_json(cls, data, bot):
data = super(Bot, cls).de_json(data, bot)
return cls(**data)
def to_dict(self):
data = {'id': self.id, 'username': self.username, 'first_name': self.username}
+15 -15
View File
@@ -30,11 +30,12 @@ class CallbackQuery(TelegramObject):
inline mode), the field :attr:`inline_message_id` will be present.
Note:
Exactly one of the fields :attr:`data` or :attr:`game_short_name` will be present.
* In Python `from` is a reserved word, use `from_user` instead.
* Exactly one of the fields :attr:`data` or :attr:`game_short_name` will be present.
Attributes:
id (:obj:`str`): Unique identifier for this query.
from (:class:`telegram.User`): Sender.
from_user (:class:`telegram.User`): Sender.
message (:class:`telegram.Message`): Optional. Message with the callback button that
originated the query.
inline_message_id (:obj:`str`): Optional. Identifier of the message sent via the bot in
@@ -46,7 +47,7 @@ class CallbackQuery(TelegramObject):
Args:
id (:obj:`str`): Unique identifier for this query.
from (:class:`telegram.User`): Sender.
from_user (:class:`telegram.User`): Sender.
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.
@@ -65,6 +66,7 @@ class CallbackQuery(TelegramObject):
until you call :attr:`answer`. It is, therefore, necessary to react
by calling :attr:`telegram.Bot.answer_callback_query` even if no notification to the user
is needed (e.g., without specifying any of the optional parameters).
"""
def __init__(self,
@@ -89,6 +91,8 @@ class CallbackQuery(TelegramObject):
self.bot = bot
self._id_attrs = (self.id,)
@classmethod
def de_json(cls, data, bot):
if not data:
@@ -109,20 +113,18 @@ class CallbackQuery(TelegramObject):
return data
def answer(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.answer_callback_query(update.callback_query.id, *args, **kwargs)
Returns:
:obj:`bool`: On success, ``True`` is returned.
"""
"""
return self.bot.answerCallbackQuery(self.id, *args, **kwargs)
def edit_message_text(self, *args, **kwargs):
"""
Shortcut for either::
"""Shortcut for either::
bot.edit_message_text(chat_id=update.callback_query.message.chat_id,
message_id=update.callback_query.message.message_id,
@@ -136,8 +138,8 @@ class CallbackQuery(TelegramObject):
Returns:
:class:`telegram.Message`: On success, if edited message is sent by the bot, the
edited Message is returned, otherwise ``True`` is returned.
"""
"""
if self.inline_message_id:
return self.bot.edit_message_text(
inline_message_id=self.inline_message_id, *args, **kwargs)
@@ -146,8 +148,7 @@ class CallbackQuery(TelegramObject):
chat_id=self.message.chat_id, message_id=self.message.message_id, *args, **kwargs)
def edit_message_caption(self, *args, **kwargs):
"""
Shortcut for either::
"""Shortcut for either::
bot.edit_message_caption(chat_id=update.callback_query.message.chat_id,
message_id=update.callback_query.message.message_id,
@@ -161,8 +162,8 @@ class CallbackQuery(TelegramObject):
Returns:
:class:`telegram.Message`: On success, if edited message is sent by the bot, the
edited Message is returned, otherwise ``True`` is returned.
"""
"""
if self.inline_message_id:
return self.bot.edit_message_caption(
inline_message_id=self.inline_message_id, *args, **kwargs)
@@ -171,8 +172,7 @@ class CallbackQuery(TelegramObject):
chat_id=self.message.chat_id, message_id=self.message.message_id, *args, **kwargs)
def edit_message_reply_markup(self, *args, **kwargs):
"""
Shortcut for either::
"""Shortcut for either::
bot.edit_message_replyMarkup(chat_id=update.callback_query.message.chat_id,
message_id=update.callback_query.message.message_id,
@@ -186,8 +186,8 @@ class CallbackQuery(TelegramObject):
Returns:
:class:`telegram.Message`: On success, if edited message is sent by the bot, the
edited Message is returned, otherwise ``True`` is returned.
"""
"""
if self.inline_message_id:
return self.bot.edit_message_reply_markup(
inline_message_id=self.inline_message_id, *args, **kwargs)
+25 -23
View File
@@ -23,8 +23,7 @@ from telegram import TelegramObject, ChatPhoto
class Chat(TelegramObject):
"""
This object represents a chat.
"""This object represents a chat.
Attributes:
id (:obj:`int`): Unique identifier for this chat.
@@ -37,6 +36,8 @@ class Chat(TelegramObject):
photo (:class:`telegram.ChatPhoto`): Optional. Chat photo.
description (:obj:`str`): Optional. Description, for supergroups and channel chats.
invite_link (:obj:`str`): Optional. Chat invite link, for supergroups and channel chats.
pinned_message (:class:`telegram.Message`): Optional. Pinned message, for supergroups.
Returned only in get_chat.
Args:
id (:obj:`int`): Unique identifier for this chat. This number may be greater than 32 bits
@@ -57,6 +58,8 @@ class Chat(TelegramObject):
Returned only in get_chat.
invite_link (:obj:`str`, optional): Chat invite link, for supergroups and channel chats.
Returned only in get_chat.
pinned_message (:class:`telegram.Message`, optional): Pinned message, for supergroups.
Returned only in get_chat.
bot (:class:`telegram.Bot`, optional): The Bot to use for instance methods.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
@@ -83,6 +86,7 @@ class Chat(TelegramObject):
photo=None,
description=None,
invite_link=None,
pinned_message=None,
**kwargs):
# Required
self.id = int(id)
@@ -96,6 +100,7 @@ class Chat(TelegramObject):
self.photo = photo
self.description = description
self.invite_link = invite_link
self.pinned_message = pinned_message
self.bot = bot
self._id_attrs = (self.id,)
@@ -106,36 +111,36 @@ class Chat(TelegramObject):
return None
data['photo'] = ChatPhoto.de_json(data.get('photo'), bot)
from telegram import Message
data['pinned_message'] = Message.de_json(data.get('pinned_message'), bot)
return cls(bot=bot, **data)
def send_action(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.send_chat_action(update.message.chat.id, *args, **kwargs)
Returns:
:obj:`bool`: If the action was sent successfully.
"""
return self.bot.send_chat_action(self.id, *args, **kwargs)
def leave(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.leave_chat(update.message.chat.id, *args, **kwargs)
Returns:
:obj:`bool` If the action was sent successfully.
"""
"""
return self.bot.leave_chat(self.id, *args, **kwargs)
def get_administrators(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.get_chat_administrators(update.message.chat.id, *args, **kwargs)
@@ -144,39 +149,36 @@ class Chat(TelegramObject):
:class:`telegram.ChatMember` objects that contains information about all
chat administrators except other bots. If the chat is a group or a supergroup
and no administrators were appointed, only the creator will be returned
"""
"""
return self.bot.get_chat_administrators(self.id, *args, **kwargs)
def get_members_count(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.get_chat_members_count(update.message.chat.id, *args, **kwargs)
Returns:
:obj:`int`
"""
"""
return self.bot.get_chat_members_count(self.id, *args, **kwargs)
def get_member(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.get_chat_member(update.message.chat.id, *args, **kwargs)
Returns:
:class:`telegram.ChatMember`
"""
"""
return self.bot.get_chat_member(self.id, *args, **kwargs)
def kick_member(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.kick_chat_member(update.message.chat.id, *args, **kwargs)
bot.kick_chat_member(update.message.chat.id, *args, **kwargs)
Returns:
:obj:`bool`: If the action was sent succesfully.
@@ -185,17 +187,17 @@ class Chat(TelegramObject):
This method will only work if the `All Members Are Admins` setting is off in the
target group. Otherwise members may only be removed by the group's creator or by the
member that added them.
"""
"""
return self.bot.kick_chat_member(self.id, *args, **kwargs)
def unban_member(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.unban_chat_member(update.message.chat.id, *args, **kwargs)
bot.unban_chat_member(update.message.chat.id, *args, **kwargs)
Returns:
:obj:`bool`: If the action was sent successfully.
"""
return self.bot.unban_chat_member(self.id, *args, **kwargs)
+1 -3
View File
@@ -21,9 +21,7 @@
class ChatAction(object):
"""
Helper class to provide constants for different chatactions
"""
"""Helper class to provide constants for different chatactions."""
FIND_LOCATION = 'find_location'
""":obj:`str`: 'find_location'"""
+5 -4
View File
@@ -23,8 +23,7 @@ from telegram.utils.helpers import to_timestamp, from_timestamp
class ChatMember(TelegramObject):
"""
This object contains information about one member of the chat.
"""This object contains information about one member of the chat.
Attributes:
user (:class:`telegram.User`): Information about the user.
@@ -59,7 +58,7 @@ class ChatMember(TelegramObject):
Args:
user (:class:`telegram.User`): Information about the user.
status (:obj:`str`): The member's status in the chat. Can be 'creator', 'administrator',
'member', 'left' or 'kicked'.
'member', 'restricted', 'left' or 'kicked'.
until_date (:class:`datetime.datetime`, optional): Restricted and kicked only. Date when
restrictions will be lifted for this user.
can_be_edited (:obj:`bool`, optional): Administrators only. True, if the bot is allowed to
@@ -91,8 +90,8 @@ class ChatMember(TelegramObject):
send animations, games, stickers and use inline bots, implies can_send_media_messages.
can_add_web_page_previews (:obj:`bool`, optional): Restricted only. True, if user may add
web page previews to his messages, implies can_send_media_messages.
"""
"""
ADMINISTRATOR = 'administrator'
""":obj:`str`: 'administrator'"""
CREATOR = 'creator'
@@ -103,6 +102,8 @@ class ChatMember(TelegramObject):
""":obj:`str`: 'left'"""
MEMBER = 'member'
""":obj:`str`: 'member'"""
RESTRICTED = 'restricted'
""":obj:`str`: 'restricted'"""
def __init__(self, user, status, until_date=None, can_be_edited=None,
can_change_info=None, can_post_messages=None, can_edit_messages=None,
+1
View File
@@ -47,6 +47,7 @@ class ChosenInlineResult(TelegramObject):
callback queries and can be used to edit the message.
query (:obj:`str`): The query that was used to obtain the result.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
+2 -2
View File
@@ -14,8 +14,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/].
"""
Constants in the Telegram network.
"""Constants in the Telegram network.
The following constants were extracted from the
`Telegram Bots FAQ <https://core.telegram.org/bots/faq>`_.
@@ -37,6 +36,7 @@ The following constant have been found by experimentation:
Attributes:
MAX_MESSAGE_ENTITIES (:obj:`int`): 100 (Beyond this cap telegram will simply ignore further
formatting styles)
"""
MAX_MESSAGE_LENGTH = 4096
-3
View File
@@ -1,3 +0,0 @@
from .botan import Botan
__all__ = ['Botan']
-43
View File
@@ -1,43 +0,0 @@
import logging
from future.moves.urllib.parse import quote
from future.moves.urllib.error import HTTPError, URLError
from future.moves.urllib.request import urlopen, Request
logging.getLogger(__name__).addHandler(logging.NullHandler())
class Botan(object):
"""This class helps to send incoming events to your botan analytics account.
See more: https://github.com/botanio/sdk#botan-sdk
"""
token = ''
url_template = 'https://api.botan.io/track?token={token}' \
'&uid={uid}&name={name}&src=python-telegram-bot'
def __init__(self, token):
self.token = token
self.logger = logging.getLogger(__name__)
def track(self, message, event_name='event'):
try:
uid = message.chat_id
except AttributeError:
self.logger.warn('No chat_id in message')
return False
data = message.to_json()
try:
url = self.url_template.format(
token=str(self.token), uid=str(uid), name=quote(event_name))
request = Request(
url, data=data.encode(), headers={'Content-Type': 'application/json'})
urlopen(request)
return True
except HTTPError as error:
self.logger.warn('Botan track error ' + str(error.code) + ':' + error.read().decode(
'utf-8'))
return False
except URLError as error:
self.logger.warn('Botan track error ' + str(error.reason))
return False
+3 -2
View File
@@ -18,7 +18,7 @@
# along with this program. If not, see [http://www.gnu.org/licenses/].
"""Extensions over the Telegram Bot API to facilitate bot making"""
from .dispatcher import Dispatcher
from .dispatcher import Dispatcher, DispatcherHandlerStop, run_async
from .jobqueue import JobQueue, Job
from .updater import Updater
from .callbackqueryhandler import CallbackQueryHandler
@@ -42,4 +42,5 @@ __all__ = ('Dispatcher', 'JobQueue', 'Job', 'Updater', 'CallbackQueryHandler',
'ChosenInlineResultHandler', 'CommandHandler', 'Handler', 'InlineQueryHandler',
'MessageHandler', 'BaseFilter', 'Filters', 'RegexHandler', 'StringCommandHandler',
'StringRegexHandler', 'TypeHandler', 'ConversationHandler',
'PreCheckoutQueryHandler', 'ShippingQueryHandler', 'MessageQueue', 'DelayQueue')
'PreCheckoutQueryHandler', 'ShippingQueryHandler', 'MessageQueue', 'DelayQueue',
'DispatcherHandlerStop', 'run_async')
+8 -9
View File
@@ -16,7 +16,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/].
""" This module contains the CallbackQueryHandler class """
"""This module contains the CallbackQueryHandler class."""
import re
@@ -27,8 +27,8 @@ from .handler import Handler
class CallbackQueryHandler(Handler):
"""
Handler class to handle Telegram callback queries. Optionally based on a regex.
"""Handler class to handle Telegram callback queries. Optionally based on a regex.
Read the documentation of the ``re`` module for more information.
Attributes:
@@ -79,6 +79,7 @@ class CallbackQueryHandler(Handler):
``user_data`` will be passed to the callback function. Default is ``False``.
pass_chat_data (:obj:`bool`, optional): If set to ``True``, a keyword argument called
``chat_data`` will be passed to the callback function. Default is ``False``.
"""
def __init__(self,
@@ -105,16 +106,15 @@ class CallbackQueryHandler(Handler):
self.pass_groupdict = pass_groupdict
def check_update(self, update):
"""
Determines whether an update should be passed to this handlers :attr:`callback`.
"""Determines whether an update should be passed to this handlers :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
Returns:
:obj:`bool`
"""
"""
if isinstance(update, Update) and update.callback_query:
if self.pattern:
if update.callback_query.data:
@@ -124,14 +124,13 @@ class CallbackQueryHandler(Handler):
return True
def handle_update(self, update, dispatcher):
"""
Send the update to the :attr:`callback`.
"""Send the update to the :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
dispatcher (:class:`telegram.ext.Dispatcher`): Dispatcher that originated the Update.
"""
"""
optional_args = self.collect_optional_args(dispatcher, update)
if self.pattern:
match = re.match(self.pattern, update.callback_query.data)
+7 -9
View File
@@ -16,7 +16,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/].
""" This module contains the ChosenInlineResultHandler class """
"""This module contains the ChosenInlineResultHandler class."""
from .handler import Handler
from telegram import Update
@@ -24,8 +24,7 @@ from telegram.utils.deprecate import deprecate
class ChosenInlineResultHandler(Handler):
"""
Handler class to handle Telegram updates that contain a chosen inline result.
"""Handler class to handle Telegram updates that contain a chosen inline result.
Attributes:
callback (:obj:`callable`): The callback function for this handler.
@@ -60,6 +59,7 @@ class ChosenInlineResultHandler(Handler):
``user_data`` will be passed to the callback function. Default is ``False``.
pass_chat_data (:obj:`bool`, optional): If set to ``True``, a keyword argument called
``chat_data`` will be passed to the callback function. Default is ``False``.
"""
def __init__(self,
@@ -76,27 +76,25 @@ class ChosenInlineResultHandler(Handler):
pass_chat_data=pass_chat_data)
def check_update(self, update):
"""
Determines whether an update should be passed to this handlers :attr:`callback`.
"""Determines whether an update should be passed to this handlers :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
Returns:
:obj:`bool`
"""
"""
return isinstance(update, Update) and update.chosen_inline_result
def handle_update(self, update, dispatcher):
"""
Send the update to the :attr:`callback`.
"""Send the update to the :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
dispatcher (:class:`telegram.ext.Dispatcher`): Dispatcher that originated the Update.
"""
"""
optional_args = self.collect_optional_args(dispatcher, update)
return self.callback(dispatcher.bot, update, **optional_args)
+10 -11
View File
@@ -16,7 +16,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/].
""" This module contains the CommandHandler class """
"""This module contains the CommandHandler class."""
import warnings
from future.utils import string_types
@@ -26,10 +26,10 @@ from telegram import Update
class CommandHandler(Handler):
"""
Handler class to handle Telegram commands. Commands are Telegram messages
that start with ``/``, optionally followed by an ``@`` and the bot's
name and/or some additional text.
"""Handler class to handle Telegram commands.
Commands are Telegram messages that start with ``/``, optionally followed by an ``@`` and the
bot's name and/or some additional text.
Attributes:
command (:obj:`str` | List[:obj:`str`]): The command or list of commands this handler
@@ -84,6 +84,7 @@ class CommandHandler(Handler):
``user_data`` will be passed to the callback function. Default is ``False``.
pass_chat_data (:obj:`bool`, optional): If set to ``True``, a keyword argument called
``chat_data`` will be passed to the callback function. Default is ``False``.
"""
def __init__(self,
@@ -119,16 +120,15 @@ class CommandHandler(Handler):
'instead. More info: https://git.io/vPTbc.')
def check_update(self, update):
"""
Determines whether an update should be passed to this handlers :attr:`callback`.
"""Determines whether an update should be passed to this handlers :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
Returns:
:obj:`bool`
"""
"""
if (isinstance(update, Update)
and (update.message or update.edited_message and self.allow_edited)):
message = update.message or update.edited_message
@@ -154,14 +154,13 @@ class CommandHandler(Handler):
return False
def handle_update(self, update, dispatcher):
"""
Send the update to the :attr:`callback`.
"""Send the update to the :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
dispatcher (:class:`telegram.ext.Dispatcher`): Dispatcher that originated the Update.
"""
"""
optional_args = self.collect_optional_args(dispatcher, update)
message = update.message or update.edited_message
+5 -6
View File
@@ -16,7 +16,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/].
""" This module contains the ConversationHandler """
"""This module contains the ConversationHandler."""
import logging
@@ -110,8 +110,8 @@ class ConversationHandler(Handler):
Raises:
ValueError
"""
"""
END = -1
""":obj:`int`: Used as a constant to return when a conversation is ended."""
@@ -203,8 +203,8 @@ class ConversationHandler(Handler):
Returns:
:obj:`bool`
"""
"""
# Ignore messages in channels
if (not isinstance(update, Update) or update.channel_post or self.per_chat
and (update.inline_query or update.chosen_inline_result) or self.per_message
@@ -285,14 +285,13 @@ class ConversationHandler(Handler):
return True
def handle_update(self, update, dispatcher):
"""
Send the update to the callback for the current state and Handler
"""Send the update to the callback for the current state and Handler
Args:
update (:class:`telegram.Update`): Incoming telegram update.
dispatcher (:class:`telegram.ext.Dispatcher`): Dispatcher that originated the Update.
"""
"""
new_state = self.current_handler.handle_update(update, dispatcher)
self.update_state(new_state, self.current_conversation)
+79 -78
View File
@@ -39,15 +39,15 @@ DEFAULT_GROUP = 0
def run_async(func):
"""
Function decorator that will run the function in a new thread.
will run :attr:`telegram.ext.Dispatcher.run_async`.
"""Function decorator that will run the function in a new thread.
Will run :attr:`telegram.ext.Dispatcher.run_async`.
Using this decorator is only possible when only a single Dispatcher exist in the system.
Note:
Use this decorator to run handlers asynchronously.
"""
Note: Use this decorator to run handlers asynchronously.
"""
@wraps(func)
def async_func(*args, **kwargs):
return Dispatcher.get_instance().run_async(func, *args, **kwargs)
@@ -55,9 +55,13 @@ def run_async(func):
return async_func
class DispatcherHandlerStop(Exception):
"""Raise this in handler to prevent execution any other handler (even in different group)."""
pass
class Dispatcher(object):
"""
This class dispatches all kinds of updates to its registered handlers.
"""This class dispatches all kinds of updates to its registered handlers.
Attributes:
bot (:class:`telegram.Bot`): The bot object that should be passed to the handlers.
@@ -74,6 +78,7 @@ class Dispatcher(object):
instance to pass onto handler callbacks.
workers (:obj:`int`, optional): Number of maximum concurrent worker threads for the
``@run_async`` decorator. defaults to 4.
"""
__singleton_lock = Lock()
@@ -113,12 +118,6 @@ class Dispatcher(object):
else:
self._set_singleton(None)
@classmethod
def _reset_singleton(cls):
# NOTE: This method was added mainly for test_updater benefit and specifically pypy. Never
# call it in production code.
cls.__singleton_semaphore.release()
def _init_async_threads(self, base_name, workers):
base_name = '{}_'.format(base_name) if base_name else ''
@@ -134,16 +133,15 @@ class Dispatcher(object):
@classmethod
def get_instance(cls):
"""
Get the singleton instance of this class.
"""Get the singleton instance of this class.
Returns:
:class:`telegram.ext.Dispatcher`
Raises:
RuntimeError
"""
"""
if cls.__singleton is not None:
return cls.__singleton()
else:
@@ -162,10 +160,13 @@ class Dispatcher(object):
break
promise.run()
if isinstance(promise.exception, DispatcherHandlerStop):
self.logger.warning(
'DispatcherHandlerStop is not supported with async functions; func: %s',
promise.pooled_function.__name__)
def run_async(self, func, *args, **kwargs):
"""
Queue a function (with given args/kwargs) to be run asynchronously.
"""Queue a function (with given args/kwargs) to be run asynchronously.
Args:
func (:obj:`callable`): The function to run in the thread.
@@ -183,11 +184,11 @@ class Dispatcher(object):
return promise
def start(self):
"""
Thread target of thread 'dispatcher'. Runs in background and processes
the update queue.
"""
"""Thread target of thread 'dispatcher'.
Runs in background and processes the update queue.
"""
if self.running:
self.logger.warning('already running')
return
@@ -221,10 +222,7 @@ class Dispatcher(object):
self.logger.debug('Dispatcher thread stopped')
def stop(self):
"""
Stops the thread.
"""
"""Stops the thread."""
if self.running:
self.__stop_event.set()
while self.running:
@@ -251,64 +249,71 @@ class Dispatcher(object):
return self.running or bool(self.__async_threads)
def process_update(self, update):
"""
Processes a single update.
"""Processes a single update.
Args:
update (:obj:`str` | :class:`telegram.Update`): The update to process.
"""
update (:obj:`str` | :class:`telegram.Update` | :class:`telegram.TelegramError`):
The update to process.
"""
# An error happened while polling
if isinstance(update, TelegramError):
self.dispatch_error(None, update)
try:
self.dispatch_error(None, update)
except Exception:
self.logger.exception('An uncaught error was raised while handling the error')
return
else:
for group in self.groups:
for handler in self.handlers[group]:
try:
if handler.check_update(update):
handler.handle_update(update, self)
break
# Dispatch any errors
except TelegramError as te:
self.logger.warn('A TelegramError was raised while processing the '
'Update.')
for group in self.groups:
try:
for handler in (x for x in self.handlers[group] if x.check_update(update)):
handler.handle_update(update, self)
break
try:
self.dispatch_error(update, te)
except Exception:
self.logger.exception('An uncaught error was raised while '
'handling the error')
finally:
break
# Stop processing with any other handler.
except DispatcherHandlerStop:
self.logger.debug('Stopping further handlers due to DispatcherHandlerStop')
break
# Errors should not stop the thread
except Exception:
self.logger.exception('An uncaught error was raised while '
'processing the update')
break
# Dispatch any error.
except TelegramError as te:
self.logger.warning('A TelegramError was raised while processing the Update')
try:
self.dispatch_error(update, te)
except DispatcherHandlerStop:
self.logger.debug('Error handler stopped further handlers')
break
except Exception:
self.logger.exception('An uncaught error was raised while handling the error')
# Errors should not stop the thread.
except Exception:
self.logger.exception('An uncaught error was raised while processing the update')
def add_handler(self, handler, group=DEFAULT_GROUP):
"""
Register a handler.
"""Register a handler.
TL;DR: Order and priority counts. 0 or 1 handlers per group will be
used.
TL;DR: Order and priority counts. 0 or 1 handlers per group will be used.
A handler must be an instance of a subclass of :class:`telegram.ext.Handler`. All handlers
are organized in groups with a numeric value. The default group is 0. All groups will be
evaluated for handling an update, but only 0 or 1 handler per group will be used.
evaluated for handling an update, but only 0 or 1 handler per group will be used. If
:class:`telegram.DispatcherHandlerStop` is raised from one of the handlers, no further
handlers (regardless of the group) will be called.
The priority/order of handlers is determined as follows:
* Priority of the group (lower group number == higher priority)
* The first handler in a group which should handle an update will be
used. Other handlers from the group will not be used. The order in
which handlers were added to the group defines the priority.
* The first handler in a group which should handle an update (see
:attr:`telegram.ext.Handler.check_update`) will be used. Other handlers from the
group will not be used. The order in which handlers were added to the group defines the
priority.
Args:
handler (:class:`telegram.ext.Handler`): A Handler instance.
group (:obj:`int`, optional): The group identifier. Default is 0.
"""
if not isinstance(handler, Handler):
@@ -324,14 +329,13 @@ class Dispatcher(object):
self.handlers[group].append(handler)
def remove_handler(self, handler, group=DEFAULT_GROUP):
"""
Remove a handler from the specified group
"""Remove a handler from the specified group.
Args:
handler (:class:`telegram.ext.Handler`): A Handler instance.
group (:obj:`object`, optional): The group identifier. Default is 0.
"""
"""
if handler in self.handlers[group]:
self.handlers[group].remove(handler)
if not self.handlers[group]:
@@ -339,35 +343,32 @@ class Dispatcher(object):
self.groups.remove(group)
def add_error_handler(self, callback):
"""
Registers an error handler in the Dispatcher.
"""Registers an error handler in the Dispatcher.
Args:
handler (:obj:`callable`): A function that takes ``Bot, Update, TelegramError`` as
callback (:obj:`callable`): A function that takes ``Bot, Update, TelegramError`` as
arguments.
"""
"""
self.error_handlers.append(callback)
def remove_error_handler(self, callback):
"""
Removes an error handler.
"""Removes an error handler.
Args:
handler (:obj:`callable`): The error handler to remove.
"""
callback (:obj:`callable`): The error handler to remove.
"""
if callback in self.error_handlers:
self.error_handlers.remove(callback)
def dispatch_error(self, update, error):
"""
Dispatches an error.
"""Dispatches an error.
Args:
update (:obj:`str` | :class:`telegram.Update`): The update that caused the error
update (:obj:`str` | :class:`telegram.Update` | None): The update that caused the error
error (:class:`telegram.TelegramError`): The Telegram error that was raised.
"""
"""
for callback in self.error_handlers:
callback(self.bot, update, error)
+48 -17
View File
@@ -16,14 +16,13 @@
#
# 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 Filters for use with the MessageHandler class """
"""This module contains the Filters for use with the MessageHandler class."""
from telegram import Chat
from future.utils import string_types
class BaseFilter(object):
"""
Base class for all Message Filters
"""Base class for all Message Filters.
Subclassing from this class filters to be combined using bitwise operators:
@@ -55,6 +54,7 @@ class BaseFilter(object):
Attributes:
name (:obj:`str`): Name for this filter. Defaults to the type of filter.
"""
name = None
@@ -78,14 +78,14 @@ class BaseFilter(object):
return self.name
def filter(self, message):
"""
This method must be overwritten.
"""This method must be overwritten.
Args:
message (:class:`telegram.Message`): The message that is tested.
Returns:
:obj:`bool`
"""
raise NotImplementedError
@@ -96,6 +96,7 @@ class InvertedFilter(BaseFilter):
Args:
f: The filter to invert.
"""
def __init__(self, f):
@@ -115,6 +116,7 @@ class MergedFilter(BaseFilter):
base_filter: Filter 1 of the merged filter
and_filter: Optional filter to "and" with base_filter. Mutually exclusive with or_filter.
or_filter: Optional filter to "or" with base_filter. Mutually exclusive with and_filter.
"""
def __init__(self, base_filter, and_filter=None, or_filter=None):
@@ -134,12 +136,12 @@ class MergedFilter(BaseFilter):
class Filters(object):
"""
Predefined filters for use with the `filter` argument of :class:`telegram.ext.MessageHandler`.
"""Predefined filters for use as the `filter` argument of :class:`telegram.ext.MessageHandler`.
Examples:
Use ``MessageHandler(Filters.video, callback_method)`` to filter all video
messages. Use ``MessageHandler(Filters.contact, callback_method)`` for all contacts. etc.
"""
class _All(BaseFilter):
@@ -260,12 +262,12 @@ class Filters(object):
""":obj:`Filter`: Messages that contain :class:`telegram.Venue`."""
class _StatusUpdate(BaseFilter):
"""
Subset for messages containing a status update.
"""Subset for messages containing a status update.
Examples:
Use these filters like: ``Filters.status_update.new_chat_member`` etc. Or use just
``Filters.status_update`` for all status update messages.
"""
class _NewChatMembers(BaseFilter):
@@ -353,6 +355,33 @@ class Filters(object):
self.migrate(message) or self.pinned_message(message))
status_update = _StatusUpdate()
"""Subset for messages containing a status update.
Examples:
Use these filters like: ``Filters.status_update.new_chat_member`` etc. Or use just
``Filters.status_update`` for all status update messages.
Attributes:
chat_created (:obj:`Filter`): Messages that contain
:attr:`telegram.Message.group_chat_created`,
:attr:`telegram.Message.supergroup_chat_created` or
:attr:`telegram.Message.channel_chat_created`.
delete_chat_photo (:obj:`Filter`): Messages that contain
:attr:`telegram.Message.delete_chat_photo`.
left_chat_member (:obj:`Filter`): Messages that contain
:attr:`telegram.Message.left_chat_member`.
migrate (:obj:`Filter`): Messages that contain
:attr:`telegram.Message.migrate_from_chat_id` or
:attr: `telegram.Message.migrate_from_chat_id`.
new_chat_members (:obj:`Filter`): Messages that contain
:attr:`telegram.Message.new_chat_member`.
new_chat_photo (:obj:`Filter`): Messages that contain
:attr:`telegram.Message.new_chat_photo`.
new_chat_title (:obj:`Filter`): Messages that contain
:attr:`telegram.Message.new_chat_title`.
pinned_message (:obj:`Filter`): Messages that contain
:attr:`telegram.Message.pinned_message`.
"""
class _Forwarded(BaseFilter):
name = 'Filters.forwarded'
@@ -383,6 +412,7 @@ class Filters(object):
Args:
entity_type: Entity type to check for. All types can be found as constants
in :class:`telegram.MessageEntity`.
"""
def __init__(self, entity_type):
@@ -411,8 +441,7 @@ class Filters(object):
""":obj:`Filter`: Messages sent in a group chat."""
class user(BaseFilter):
"""
Filters messages to allow only those which are from specified user ID.
"""Filters messages to allow only those which are from specified user ID.
Examples:
``MessageHandler(Filters.user(1234), callback_method)``
@@ -424,6 +453,7 @@ class Filters(object):
Raises:
ValueError: If chat_id and username are both present, or neither is.
"""
def __init__(self, user_id=None, username=None):
@@ -449,8 +479,7 @@ class Filters(object):
message.from_user.username in self.usernames)
class chat(BaseFilter):
"""
Filters messages to allow only those which are from specified chat ID.
"""Filters messages to allow only those which are from specified chat ID.
Examples:
``MessageHandler(Filters.chat(-1234), callback_method)``
@@ -462,6 +491,7 @@ class Filters(object):
Raises:
ValueError: If chat_id and username are both present, or neither is.
"""
def __init__(self, chat_id=None, username=None):
@@ -504,10 +534,10 @@ class Filters(object):
""":obj:`Filter`: Messages that confirm a :class:`telegram.SuccessfulPayment`."""
class language(BaseFilter):
"""
Filters messages to only allow those which are from users with a certain language code.
Note that according to telegrams documentation, every single user does not have the
language_code attribute.
"""Filters messages to only allow those which are from users with a certain language code.
Note: According to telegrams documentation, every single user does not have the
`language_code` attribute.
Examples:
``MessageHandler(Filters.language("en"), callback_method)``
@@ -516,6 +546,7 @@ class Filters(object):
lang (:obj:`str` | List[:obj:`str`]): Which language code(s) to allow through. This
will be matched using ``.startswith`` meaning that 'en' will match both 'en_US'
and 'en_GB'.
"""
def __init__(self, lang):
+6 -8
View File
@@ -16,14 +16,11 @@
#
# 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 base class for handlers as used by the
Dispatcher """
"""This module contains the base class for handlers as used by the Dispatcher."""
class Handler(object):
"""
The base class for all update handlers. You can create your own handlers by inheriting from
this class.
"""The base class for all update handlers. Create custom handlers by inheriting from it.
Attributes:
callback (:obj:`callable`): The callback function for this handler.
@@ -58,6 +55,7 @@ class Handler(object):
``user_data`` will be passed to the callback function. Default is ``False``.
pass_chat_data (:obj:`bool`, optional): If set to ``True``, a keyword argument called
``chat_data`` will be passed to the callback function. Default is ``False``.
"""
def __init__(self,
@@ -82,6 +80,7 @@ class Handler(object):
Returns:
:obj:`bool`
"""
raise NotImplementedError
@@ -101,12 +100,11 @@ class Handler(object):
raise NotImplementedError
def collect_optional_args(self, dispatcher, update=None):
"""
Prepares the optional arguments that are the same for all types of
handlers.
"""Prepares the optional arguments that are the same for all types of handlers.
Args:
dispatcher (:class:`telegram.ext.Dispatcher`): The dispatcher.
"""
optional_args = dict()
+2 -2
View File
@@ -38,7 +38,7 @@ class InlineQueryHandler(Handler):
pass_job_queue (:obj:`bool`): Optional. Determines whether ``job_queue`` will be passed to
the callback function.
pattern (:obj:`str` | :obj:`Pattern`): Optional. Regex pattern to test
:attr:`telegram.CallbackQuery.data` against.
:attr:`telegram.InlineQuery.query` against.
pass_groups (:obj:`bool`): Optional. Determines whether ``groups`` will be passed to the
callback function.
pass_groupdict (:obj:`bool`): Optional. Determines whether ``groupdict``. will be passed to
@@ -67,7 +67,7 @@ class InlineQueryHandler(Handler):
:class:`telegram.ext.JobQueue` instance created by the :class:`telegram.ext.Updater`
which can be used to schedule new jobs. Default is ``False``.
pattern (:obj:`str` | :obj:`Pattern`, optional): Regex pattern. If not ``None``,
``re.match`` is used on :attr:`telegram.CallbackQuery.data` to determine if an update
``re.match`` is used on :attr:`telegram.InlineQuery.query` to determine if an update
should be handled by this handler.
pass_groups (:obj:`bool`, optional): If the callback should be passed the result of
``re.match(pattern, data).groups()`` as a keyword argument called ``groups``.
+26 -52
View File
@@ -35,8 +35,7 @@ class Days(object):
class JobQueue(object):
"""
This class allows you to periodically perform tasks with the bot.
"""This class allows you to periodically perform tasks with the bot.
Attributes:
queue (:obj:`PriorityQueue`): The queue that holds the Jobs.
@@ -48,6 +47,7 @@ class JobQueue(object):
Deprecated:
prevent_autostart (:obj:`bool`, optional): Thread does not start during initialisation.
Use `start` method instead.
"""
def __init__(self, bot, prevent_autostart=None):
@@ -65,8 +65,7 @@ class JobQueue(object):
self._running = False
def put(self, job, next_t=None):
"""
Queue a new job.
"""Queue a new job.
Note:
This method is deprecated. Please use: :attr:`run_once`, :attr:`run_daily`
@@ -87,6 +86,7 @@ class JobQueue(object):
* :obj:`datetime.time` will be interpreted as a specific time at which the job
should run. This could be either today or, if the time has already passed,
tomorrow.
"""
warnings.warn("'JobQueue.put' is being deprecated, use 'JobQueue.run_once', "
@@ -125,8 +125,7 @@ class JobQueue(object):
self._set_next_peek(next_t)
def run_once(self, callback, when, context=None, name=None):
"""
Creates a new ``Job`` that runs once and adds it to the queue.
"""Creates a new ``Job`` that runs once and adds it to the queue.
Args:
callback (:obj:`callable`): The callback function that should be executed by the new
@@ -155,15 +154,14 @@ class JobQueue(object):
Returns:
:class:`telegram.ext.Job`: The new ``Job`` instance that has been added to the job
queue.
"""
"""
job = Job(callback, repeat=False, context=context, name=name, job_queue=self)
self._put(job, next_t=when)
return job
def run_repeating(self, callback, interval, first=None, context=None, name=None):
"""
Creates a new ``Job`` that runs once and adds it to the queue.
"""Creates a new ``Job`` that runs once and adds it to the queue.
Args:
callback (:obj:`callable`): The callback function that should be executed by the new
@@ -196,6 +194,7 @@ class JobQueue(object):
Returns:
:class:`telegram.ext.Job`: The new ``Job`` instance that has been added to the job
queue.
"""
job = Job(callback,
@@ -208,8 +207,7 @@ class JobQueue(object):
return job
def run_daily(self, callback, time, days=Days.EVERY_DAY, context=None, name=None):
"""
Creates a new ``Job`` that runs once and adds it to the queue.
"""Creates a new ``Job`` that runs once and adds it to the queue.
Args:
callback (:obj:`callable`): The callback function that should be executed by the new
@@ -227,6 +225,7 @@ class JobQueue(object):
Returns:
:class:`telegram.ext.Job`: The new ``Job`` instance that has been added to the job
queue.
"""
job = Job(callback,
@@ -250,9 +249,7 @@ class JobQueue(object):
self.__tick.set()
def tick(self):
"""
Run all jobs that are due and re-enqueue them with their interval.
"""
"""Run all jobs that are due and re-enqueue them with their interval."""
now = time.time()
@@ -300,9 +297,7 @@ class JobQueue(object):
self.logger.debug('Dropping non-repeating or removed job %s', job.name)
def start(self):
"""
Starts the job_queue thread.
"""
"""Starts the job_queue thread."""
self.__start_lock.acquire()
@@ -319,8 +314,8 @@ class JobQueue(object):
"""
Thread target of thread ``job_queue``. Runs in background and performs ticks on the job
queue.
"""
"""
while self._running:
# self._next_peek may be (re)scheduled during self.tick() or self.put()
with self.__next_peek_lock:
@@ -339,9 +334,7 @@ class JobQueue(object):
self.logger.debug('%s thread stopped', self.__class__.__name__)
def stop(self):
"""
Stops the thread.
"""
"""Stops the thread."""
with self.__start_lock:
self._running = False
@@ -351,16 +344,13 @@ class JobQueue(object):
self.__thread.join()
def jobs(self):
"""
Returns a tuple of all jobs that are currently in the ``JobQueue``
"""
"""Returns a tuple of all jobs that are currently in the ``JobQueue``."""
return tuple(job[1] for job in self.queue.queue if job)
class Job(object):
"""
This class encapsulates a Job
"""This class encapsulates a Job.
Attributes:
callback (:obj:`callable`): The callback function that should be executed by the new job.
@@ -385,6 +375,7 @@ class Job(object):
Defaults to ``Days.EVERY_DAY``
job_queue (class:`telegram.ext.JobQueue`, optional): The ``JobQueue`` this job belongs to.
Only optional for backward compatibility with ``JobQueue.put()``.
"""
def __init__(self,
@@ -415,9 +406,7 @@ class Job(object):
self._enabled.set()
def run(self, bot):
"""
Executes the callback function.
"""
"""Executes the callback function."""
self.callback(bot, self)
@@ -425,24 +414,19 @@ class Job(object):
"""
Schedules this job for removal from the ``JobQueue``. It will be removed without executing
its callback function again.
"""
self._remove.set()
@property
def removed(self):
"""
:obj:`bool`: Whether this job is due to be removed.
"""
""":obj:`bool`: Whether this job is due to be removed."""
return self._remove.is_set()
@property
def enabled(self):
"""
:obj:`bool`: Whether this job is enabled.
"""
""":obj:`bool`: Whether this job is enabled."""
return self._enabled.is_set()
@enabled.setter
@@ -457,8 +441,8 @@ class Job(object):
"""
:obj:`int` | :obj:`float` | :obj:`datetime.timedelta`: Optional. The interval in which the
job will run.
"""
"""
return self._interval
@interval.setter
@@ -474,10 +458,7 @@ class Job(object):
@property
def interval_seconds(self):
"""
:obj:`int`: The interval for this job in seconds.
"""
""":obj:`int`: The interval for this job in seconds."""
if isinstance(self.interval, datetime.timedelta):
return self.interval.total_seconds()
else:
@@ -485,10 +466,7 @@ class Job(object):
@property
def repeat(self):
"""
:obj:`bool`: Optional. If this job should be periodically execute its callback function.
"""
""":obj:`bool`: Optional. If this job should periodically execute its callback function."""
return self._repeat
@repeat.setter
@@ -499,9 +477,7 @@ class Job(object):
@property
def days(self):
"""
Tuple[:obj:`int`]: Optional. Defines on which days of the week the job should run.
"""
"""Tuple[:obj:`int`]: Optional. Defines on which days of the week the job should run."""
return self._days
@@ -521,9 +497,7 @@ class Job(object):
@property
def job_queue(self):
"""
:class:`telegram.ext.JobQueue`: Optional. The ``JobQueue`` this job belongs to.
"""
""":class:`telegram.ext.JobQueue`: Optional. The ``JobQueue`` this job belongs to."""
return self._job_queue
+7 -9
View File
@@ -17,7 +17,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/].
# TODO: Remove allow_edited
""" This module contains the MessageHandler class """
"""This module contains the MessageHandler class."""
import warnings
from .handler import Handler
@@ -25,8 +25,7 @@ from telegram import Update
class MessageHandler(Handler):
"""
Handler class to handle telegram messages. They might contain text, media or status updates.
"""Handler class to handle telegram messages. They might contain text, media or status updates.
Attributes:
filters (:obj:`Filter`): Only allow updates with these Filters. See
@@ -86,6 +85,7 @@ class MessageHandler(Handler):
Raises:
ValueError
"""
def __init__(self,
@@ -130,16 +130,15 @@ class MessageHandler(Handler):
(self.channel_post_updates and update.channel_post)])
def check_update(self, update):
"""
Determines whether an update should be passed to this handlers :attr:`callback`.
"""Determines whether an update should be passed to this handlers :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
Returns:
:obj:`bool`
"""
"""
if isinstance(update, Update) and self._is_allowed_update(update):
if not self.filters:
@@ -158,14 +157,13 @@ class MessageHandler(Handler):
return res
def handle_update(self, update, dispatcher):
"""
Send the update to the :attr:`callback`.
"""Send the update to the :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
dispatcher (:class:`telegram.ext.Dispatcher`): Dispatcher that originated the Update.
"""
"""
optional_args = self.collect_optional_args(dispatcher, update)
return self.callback(dispatcher.bot, update, **optional_args)
+15 -14
View File
@@ -19,7 +19,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/]
"""A throughput-limiting message processor for Telegram bots"""
"""A throughput-limiting message processor for Telegram bots."""
from telegram.utils import promise
import functools
@@ -44,9 +44,7 @@ else:
class DelayQueueError(RuntimeError):
"""
Indicates processing errors.
"""
"""Indicates processing errors."""
pass
@@ -78,6 +76,7 @@ class DelayQueue(threading.Thread):
creation; if ``False``, should be started manually by `start` method. Defaults to True.
name (:obj:`str`, optional): Thread's name. Defaults to ``'DelayQueue-N'``, where N is
sequential number of object created.
"""
_instcnt = 0 # instance counter
@@ -105,7 +104,8 @@ class DelayQueue(threading.Thread):
def run(self):
"""
Do not use the method except for unthreaded testing purposes, the method normally is
automatically called by autostart argument .
automatically called by autostart argument.
"""
times = [] # used to store each callable processing time
@@ -134,14 +134,14 @@ class DelayQueue(threading.Thread):
self.exc_route(exc) # to prevent thread exit
def stop(self, timeout=None):
"""
Used to gently stop processor and shutdown its thread.
"""Used to gently stop processor and shutdown its thread.
Args:
timeout (:obj:`float`): Indicates maximum time to wait for processor to stop and its
thread to exit. If timeout exceeds and processor has not stopped, method silently
returns. :attr:`is_alive` could be used afterwards to check the actual status.
``timeout`` set to None, blocks until processor is shut down. Defaults to None.
"""
self.__exit_req = True # gently request
@@ -153,19 +153,20 @@ class DelayQueue(threading.Thread):
"""
Dummy exception handler which re-raises exception in thread. Could be possibly overwritten
by subclasses.
"""
raise exc
def __call__(self, func, *args, **kwargs):
"""
Used to process callbacks in throughput-limiting thread through queue.
"""Used to process callbacks in throughput-limiting thread through queue.
Args:
func (:obj:`callable`): The actual function (or any callable) that is processed through
queue.
*args (:obj:`list`): Variable-length `func` arguments.
**kwargs (:obj:`dict`): Arbitrary keyword-arguments to `func`.
"""
if not self.is_alive() or self.__exit_req:
@@ -202,6 +203,7 @@ class MessageQueue(object):
autostart (:obj:`bool`, optional): If True, processors are started immediately after
object's creation; if ``False``, should be started manually by :attr:`start` method.
Defaults to ``True``.
"""
def __init__(self,
@@ -224,9 +226,7 @@ class MessageQueue(object):
autostart=autostart)
def start(self):
"""
Method is used to manually start the ``MessageQueue`` processing.
"""
"""Method is used to manually start the ``MessageQueue`` processing."""
self._all_delayq.start()
self._group_delayq.start()
@@ -258,6 +258,7 @@ class MessageQueue(object):
Returns:
:obj:`callable`: Used as ``promise`` argument.
"""
if not is_group_msg: # ignore middle group delay
@@ -268,8 +269,7 @@ class MessageQueue(object):
def queuedmessage(method):
"""
A decorator to be used with :attr:`telegram.Bot` send* methods.
"""A decorator to be used with :attr:`telegram.Bot` send* methods.
Note:
As it probably wouldn't be a good idea to make this decorator a property, it has been coded
@@ -297,6 +297,7 @@ def queuedmessage(method):
Returns:
``telegram.utils.promise.Promise``: In case call is queued or original method's return
value if it's not.
"""
@functools.wraps(method)
+7 -9
View File
@@ -16,15 +16,14 @@
#
# 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 PreCheckoutQueryHandler class """
"""This module contains the PreCheckoutQueryHandler class."""
from telegram import Update
from .handler import Handler
class PreCheckoutQueryHandler(Handler):
"""
Handler class to handle Telegram PreCheckout callback queries.
"""Handler class to handle Telegram PreCheckout callback queries.
Attributes:
callback (:obj:`callable`): The callback function for this handler.
@@ -59,6 +58,7 @@ class PreCheckoutQueryHandler(Handler):
``user_data`` will be passed to the callback function. Default is ``False``.
pass_chat_data (:obj:`bool`, optional): If set to ``True``, a keyword argument called
``chat_data`` will be passed to the callback function. Default is ``False``.
"""
def __init__(self,
@@ -75,26 +75,24 @@ class PreCheckoutQueryHandler(Handler):
pass_chat_data=pass_chat_data)
def check_update(self, update):
"""
Determines whether an update should be passed to this handlers :attr:`callback`.
"""Determines whether an update should be passed to this handlers :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
Returns:
:obj:`bool`
"""
"""
return isinstance(update, Update) and update.pre_checkout_query
def handle_update(self, update, dispatcher):
"""
Send the update to the :attr:`callback`.
"""Send the update to the :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
dispatcher (:class:`telegram.ext.Dispatcher`): Dispatcher that originated the Update.
"""
"""
optional_args = self.collect_optional_args(dispatcher, update)
return self.callback(dispatcher.bot, update, **optional_args)
+15 -13
View File
@@ -17,7 +17,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/].
# TODO: Remove allow_edited
""" This module contains the RegexHandler class """
"""This module contains the RegexHandler class."""
import re
import warnings
@@ -29,11 +29,11 @@ from .handler import Handler
class RegexHandler(Handler):
"""
Handler class to handle Telegram updates based on a regex. It uses a
regular expression to check text messages. Read the documentation of the
``re`` module for more information. The ``re.match`` function is used to
determine if an update should be handled by this handler.
"""Handler class to handle Telegram updates based on a regex.
It uses a regular expression to check text messages. Read the documentation of the ``re``
module for more information. The ``re.match`` function is used to determine if an update should
be handled by this handler.
Attributes:
pattern (:obj:`str` | :obj:`Pattern`): The regex pattern.
@@ -91,6 +91,7 @@ class RegexHandler(Handler):
Raises:
ValueError
"""
def __init__(self,
@@ -133,31 +134,32 @@ class RegexHandler(Handler):
self.edited_updates = edited_updates
def check_update(self, update):
"""
Determines whether an update should be passed to this handlers :attr:`callback`.
"""Determines whether an update should be passed to this handlers :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
Returns:
:obj:`bool`
"""
"""
if not isinstance(update, Update) and not update.effective_message:
return False
if any([(self.message_updates and update.message),
(self.edited_updates and update.edited_message),
(self.channel_post_updates and update.channel_post)]) and (
isinstance(update, Update)):
(self.channel_post_updates and update.channel_post)]) and \
update.effective_message.text:
match = re.match(self.pattern, update.effective_message.text)
return bool(match)
return False
def handle_update(self, update, dispatcher):
"""
Send the update to the :attr:`callback`.
"""Send the update to the :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
dispatcher (:class:`telegram.ext.Dispatcher`): Dispatcher that originated the Update.
"""
optional_args = self.collect_optional_args(dispatcher, update)
+7 -9
View File
@@ -16,15 +16,14 @@
#
# 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 ShippingQueryHandler class """
"""This module contains the ShippingQueryHandler class."""
from telegram import Update
from .handler import Handler
class ShippingQueryHandler(Handler):
"""
Handler class to handle Telegram shipping callback queries.
"""Handler class to handle Telegram shipping callback queries.
Attributes:
callback (:obj:`callable`): The callback function for this handler.
@@ -59,6 +58,7 @@ class ShippingQueryHandler(Handler):
``user_data`` will be passed to the callback function. Default is ``False``.
pass_chat_data (:obj:`bool`, optional): If set to ``True``, a keyword argument called
``chat_data`` will be passed to the callback function. Default is ``False``.
"""
def __init__(self,
@@ -75,26 +75,24 @@ class ShippingQueryHandler(Handler):
pass_chat_data=pass_chat_data)
def check_update(self, update):
"""
Determines whether an update should be passed to this handlers :attr:`callback`.
"""Determines whether an update should be passed to this handlers :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
Returns:
:obj:`bool`
"""
"""
return isinstance(update, Update) and update.shipping_query
def handle_update(self, update, dispatcher):
"""
Send the update to the :attr:`callback`.
"""Send the update to the :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
dispatcher (:class:`telegram.ext.Dispatcher`): Dispatcher that originated the Update.
"""
"""
optional_args = self.collect_optional_args(dispatcher, update)
return self.callback(dispatcher.bot, update, **optional_args)
+7 -8
View File
@@ -16,7 +16,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/].
""" This module contains the StringCommandHandler class """
"""This module contains the StringCommandHandler class."""
from future.utils import string_types
@@ -24,9 +24,7 @@ from .handler import Handler
class StringCommandHandler(Handler):
"""
Handler class to handle string commands. Commands are string updates
that start with ``/``.
"""Handler class to handle string commands. Commands are string updates that start with ``/``.
Note:
This handler is not used to handle Telegram :attr:`telegram.Update`, but strings manually
@@ -60,6 +58,7 @@ class StringCommandHandler(Handler):
``job_queue`` will be passed to the callback function. It will be a
class:`telegram.ext.JobQueue` instance created by the :class:`telegram.ext.Updater`
which can be used to schedule new jobs. Default is ``False``.
"""
def __init__(self,
@@ -74,26 +73,26 @@ class StringCommandHandler(Handler):
self.pass_args = pass_args
def check_update(self, update):
"""
Determines whether an update should be passed to this handlers :attr:`callback`.
"""Determines whether an update should be passed to this handlers :attr:`callback`.
Args:
update (:obj:`str`): An incomming command.
Returns:
:obj:`bool`
"""
return (isinstance(update, string_types) and update.startswith('/')
and update[1:].split(' ')[0] == self.command)
def handle_update(self, update, dispatcher):
"""
Send the update to the :attr:`callback`.
"""Send the update to the :attr:`callback`.
Args:
update (:obj:`str`): An incomming command.
dispatcher (:class:`telegram.ext.Dispatcher`): Dispatcher that originated the command.
"""
optional_args = self.collect_optional_args(dispatcher)
+10 -12
View File
@@ -16,7 +16,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/].
""" This module contains the StringRegexHandler class """
"""This module contains the StringRegexHandler class."""
import re
@@ -26,11 +26,10 @@ from .handler import Handler
class StringRegexHandler(Handler):
"""
Handler class to handle string updates based on a regex. It uses a
regular expression to check update content. Read the documentation of the
``re`` module for more information. The ``re.match`` function is used to
determine if an update should be handled by this handler.
"""Handler class to handle string updates based on a regex which checks the update content.
Read the documentation of the ``re`` module for more information. The ``re.match`` function is
used to determine if an update should be handled by this handler.
Note:
This handler is not used to handle Telegram :attr:`telegram.Update`, but strings manually
@@ -67,6 +66,7 @@ class StringRegexHandler(Handler):
``job_queue`` will be passed to the callback function. It will be a
:class:`telegram.ext.JobQueue` instance created by the :class:`telegram.ext.Updater`
which can be used to schedule new jobs. Default is ``False``.
"""
def __init__(self,
@@ -87,27 +87,25 @@ class StringRegexHandler(Handler):
self.pass_groupdict = pass_groupdict
def check_update(self, update):
"""
Determines whether an update should be passed to this handlers :attr:`callback`.
"""Determines whether an update should be passed to this handlers :attr:`callback`.
Args:
update (:obj:`str`): An incomming command.
Returns:
:obj:`bool`
"""
"""
return isinstance(update, string_types) and bool(re.match(self.pattern, update))
def handle_update(self, update, dispatcher):
"""
Send the update to the :attr:`callback`.
"""Send the update to the :attr:`callback`.
Args:
update (:obj:`str`): An incomming command.
dispatcher (:class:`telegram.ext.Dispatcher`): Dispatcher that originated the command.
"""
"""
optional_args = self.collect_optional_args(dispatcher)
match = re.match(self.pattern, update)
+7 -8
View File
@@ -16,14 +16,13 @@
#
# 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 TypeHandler class """
"""This module contains the TypeHandler class."""
from .handler import Handler
class TypeHandler(Handler):
"""
Handler class to handle updates of custom types.
"""Handler class to handle updates of custom types.
Attributes:
type (:obj:`type`): The ``type`` of updates this handler should process.
@@ -51,6 +50,7 @@ class TypeHandler(Handler):
``job_queue`` will be passed to the callback function. It will be a
:class:`telegram.ext.JobQueue` instance created by the :class:`telegram.ext.Updater`
which can be used to schedule new jobs. Default is ``False``.
"""
def __init__(self, type, callback, strict=False, pass_update_queue=False,
@@ -61,14 +61,14 @@ class TypeHandler(Handler):
self.strict = strict
def check_update(self, update):
"""
Determines whether an update should be passed to this handlers :attr:`callback`.
"""Determines whether an update should be passed to this handlers :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
Returns:
:obj:`bool`
"""
if not self.strict:
@@ -77,14 +77,13 @@ class TypeHandler(Handler):
return type(update) is self.type
def handle_update(self, update, dispatcher):
"""
Send the update to the :attr:`callback`.
"""Send the update to the :attr:`callback`.
Args:
update (:class:`telegram.Update`): Incoming telegram update.
dispatcher (:class:`telegram.ext.Dispatcher`): Dispatcher that originated the Update.
"""
"""
optional_args = self.collect_optional_args(dispatcher)
return self.callback(dispatcher.bot, update, **optional_args)
+19 -14
View File
@@ -16,8 +16,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/].
"""This module contains the class Updater, which tries to make creating
Telegram bots intuitive."""
"""This module contains the class Updater, which tries to make creating Telegram bots intuitive."""
import logging
import os
@@ -78,6 +77,7 @@ class Updater(object):
Raises:
ValueError: If both :attr:`token` and :attr:`bot` are passed or none of them.
"""
_request = None
@@ -95,8 +95,16 @@ class Updater(object):
if (token is not None) and (bot is not None):
raise ValueError('`token` and `bot` are mutually exclusive')
self.logger = logging.getLogger(__name__)
con_pool_size = workers + 4
if bot is not None:
self.bot = bot
if bot.request.con_pool_size < con_pool_size:
self.logger.warning(
'Connection pool of Request object is smaller than optimal value (%s)',
con_pool_size)
else:
# we need a connection pool the size of:
# * for each of the workers
@@ -107,7 +115,7 @@ class Updater(object):
if request_kwargs is None:
request_kwargs = {}
if 'con_pool_size' not in request_kwargs:
request_kwargs['con_pool_size'] = workers + 4
request_kwargs['con_pool_size'] = con_pool_size
self._request = Request(**request_kwargs)
self.bot = Bot(token, base_url, request=self._request)
self.user_sig_handler = user_sig_handler
@@ -121,7 +129,6 @@ class Updater(object):
workers=workers,
exception_event=self.__exception_event)
self.last_update_id = 0
self.logger = logging.getLogger(__name__)
self.running = False
self.is_idle = False
self.httpd = None
@@ -152,8 +159,7 @@ class Updater(object):
bootstrap_retries=0,
read_latency=2.,
allowed_updates=None):
"""
Starts polling updates from Telegram.
"""Starts polling updates from Telegram.
Args:
poll_interval (:obj:`float`, optional): Time to wait between polling updates from
@@ -178,6 +184,7 @@ class Updater(object):
Returns:
:obj:`Queue`: The update queue that can be filled from the main thread.
"""
if network_delay is not None:
@@ -222,8 +229,8 @@ class Updater(object):
key (:obj:`str`, optional): Path to the SSL key file.
clean (:obj:`bool`, optional): Whether to clean any pending updates on Telegram servers
before actually starting the webhook. Default is ``False``.
bootstrap_retries (Optional[int[): Whether the bootstrapping phase of the `Updater`
will retry on failures on the Telegram server.
bootstrap_retries (:obj:`int`, optional): Whether the bootstrapping phase of the
`Updater` will retry on failures on the Telegram server.
* < 0 - retry indefinitely
* 0 - no retries (default)
@@ -236,6 +243,7 @@ class Updater(object):
Returns:
:obj:`Queue`: The update queue that can be filled from the main thread.
"""
with self.__lock:
@@ -397,9 +405,7 @@ class Updater(object):
updates = self.bot.get_updates(updates[-1].update_id + 1)
def stop(self):
"""
Stops the polling/webhook thread, the dispatcher and the job queue.
"""
"""Stops the polling/webhook thread, the dispatcher and the job queue."""
self.job_queue.stop()
with self.__lock:
@@ -447,15 +453,14 @@ class Updater(object):
os._exit(1)
def idle(self, stop_signals=(SIGINT, SIGTERM, SIGABRT)):
"""
Blocks until one of the signals are received and stops the updater.
"""Blocks until one of the signals are received and stops the updater.
Args:
stop_signals (:obj:`iterable`): Iterable containing signals from the signal module that
should be subscribed to. Updater.stop() will be called on receiving one of those
signals. Defaults to (``SIGINT``, ``SIGTERM``, ``SIGABRT``).
"""
"""
for sig in stop_signals:
signal(sig, self.signal_handler)
+2 -2
View File
@@ -22,8 +22,7 @@ from telegram import TelegramObject
class Audio(TelegramObject):
"""
This object represents an audio file to be treated as music by the Telegram clients.
"""This object represents an audio file to be treated as music by the Telegram clients.
Attributes:
file_id (:obj:`str`): Unique identifier for this file.
@@ -43,6 +42,7 @@ class Audio(TelegramObject):
mime_type (:obj:`str`, optional): MIME type of the file as defined by sender.
file_size (:obj:`int`, optional): File size.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
+2 -2
View File
@@ -24,8 +24,7 @@ from telegram import TelegramObject
class ChatPhoto(TelegramObject):
"""
This object represents a chat photo.
"""This object represents a chat photo.
Attributes:
small_file_id (:obj:`str`): Unique file identifier of small (160x160) chat photo.
@@ -38,6 +37,7 @@ class ChatPhoto(TelegramObject):
can be used only for photo download.
bot (:class:`telegram.Bot`, optional): The Bot to use for instance methods
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, small_file_id, big_file_id, bot=None, **kwargs):
+2 -2
View File
@@ -22,8 +22,7 @@ from telegram import TelegramObject
class Contact(TelegramObject):
"""
This object represents a phone contact.
"""This object represents a phone contact.
Attributes:
phone_number (:obj:`str`): Contact's phone number.
@@ -37,6 +36,7 @@ class Contact(TelegramObject):
last_name (:obj:`str`, optional): Contact's last name.
user_id (:obj:`int`, optional): Contact's user identifier in Telegram.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, phone_number, first_name, last_name=None, user_id=None, **kwargs):
+2 -3
View File
@@ -22,8 +22,7 @@ from telegram import PhotoSize, TelegramObject
class Document(TelegramObject):
"""
This object represents a general file (as opposed to photos, voice messages and audio files).
"""This object represents a general file (as opposed to photos, voice messages and audio files).
Attributes:
file_id (:obj:`str`): Unique file identifier.
@@ -39,8 +38,8 @@ class Document(TelegramObject):
mime_type (:obj:`str`, optional): MIME type of the file as defined by sender.
file_size (:obj:`int`, optional): File size.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
"""
_id_keys = ('file_id',)
def __init__(self,
+2 -1
View File
@@ -44,6 +44,7 @@ class File(TelegramObject):
file_path (:obj:`str`, optional): File path. Use :attr:`download` to get the file.
bot (:obj:`telegram.Bot`, optional): Bot to use with shortcut method.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, file_id, bot=None, file_size=None, file_path=None, **kwargs):
@@ -85,8 +86,8 @@ class File(TelegramObject):
Raises:
ValueError: If both ``custom_path`` and ``out`` are passed.
"""
"""
if custom_path is not None and out is not None:
raise ValueError('custom_path and out are mutually exclusive')
+10 -18
View File
@@ -40,8 +40,7 @@ FILE_TYPES = ('audio', 'document', 'photo', 'sticker', 'video', 'voice', 'certif
class InputFile(object):
"""
This object represents a Telegram InputFile.
"""This object represents a Telegram InputFile.
Attributes:
data (:obj:`dict`): Data containing an inputfile.
@@ -51,6 +50,7 @@ class InputFile(object):
Raises:
TelegramError
"""
def __init__(self, data):
@@ -88,28 +88,22 @@ class InputFile(object):
@property
def headers(self):
"""
:obj:`dict`: Headers.
"""
""":obj:`dict`: Headers."""
return {'User-agent': USER_AGENT, 'Content-type': self.content_type}
@property
def content_type(self):
"""
:obj:`str`: Content type
"""
""":obj:`str`: Content type"""
return 'multipart/form-data; boundary=%s' % self.boundary
def to_form(self):
"""
Transform the inputfile to multipart/form data.
"""Transform the inputfile to multipart/form data.
Returns:
:obj:`str`
"""
"""
form = []
form_boundary = '--' + self.boundary
@@ -148,16 +142,15 @@ class InputFile(object):
@staticmethod
def is_image(stream):
"""
Check if the content file is an image by analyzing its headers.
"""Check if the content file is an image by analyzing its headers.
Args:
stream (:obj:`str`): A str representing the content of a file.
Returns:
:obj:`str`: The str mime-type of an image.
"""
"""
image = imghdr.what(None, stream)
if image:
return 'image/%s' % image
@@ -166,16 +159,15 @@ class InputFile(object):
@staticmethod
def is_inputfile(data):
"""
Check if the request is a file request.
"""Check if the request is a file request.
Args:
data (Dict[:obj:`str`, :obj:`str`]): A dict of (str, str) key/value pairs.
Returns:
:obj:`bool`
"""
"""
if data:
file_type = [i for i in iter(data) if i in FILE_TYPES]
+2 -2
View File
@@ -22,8 +22,7 @@ from telegram import TelegramObject
class Location(TelegramObject):
"""
This object represents a point on the map.
"""This object represents a point on the map.
Attributes:
longitude (:obj:`float`): Longitude as defined by sender.
@@ -33,6 +32,7 @@ class Location(TelegramObject):
longitude (:obj:`float`): Longitude as defined by sender.
latitude (:obj:`float`): Latitude as defined by sender.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, longitude, latitude, **kwargs):
+2 -2
View File
@@ -22,8 +22,7 @@ from telegram import TelegramObject
class PhotoSize(TelegramObject):
"""
This object represents one size of a photo or a file/sticker thumbnail.
"""This object represents one size of a photo or a file/sticker thumbnail.
Attributes:
file_id (:obj:`str`): Unique identifier for this file.
@@ -37,6 +36,7 @@ class PhotoSize(TelegramObject):
height (:obj:`int`): Photo height.
file_size (:obj:`int`, optional): File size.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, file_id, width, height, file_size=None, **kwargs):
+6 -7
View File
@@ -22,8 +22,7 @@ from telegram import PhotoSize, TelegramObject
class Sticker(TelegramObject):
"""
This object represents a sticker.
"""This object represents a sticker.
Attributes:
file_id (:obj:`str`): Unique identifier for this file.
@@ -50,6 +49,7 @@ class Sticker(TelegramObject):
position where the mask should be placed.
file_size (:obj:`int`, optional): File size.
**kwargs (obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -96,8 +96,7 @@ class Sticker(TelegramObject):
class StickerSet(TelegramObject):
"""
This object represents a sticker set.
"""This object represents a sticker set.
Attributes:
name (:obj:`str`): Sticker set name.
@@ -110,6 +109,7 @@ class StickerSet(TelegramObject):
title (:obj:`str`): Sticker set title.
contains_masks (:obj:`bool`): True, if the sticker set contains masks.
stickers (List[:class:`telegram.Sticker`]): List of all set stickers.
"""
def __init__(self, name, title, contains_masks, stickers, bot=None, **kwargs):
@@ -140,8 +140,7 @@ class StickerSet(TelegramObject):
class MaskPosition(TelegramObject):
"""
This object describes the position on faces where a mask should be placed by default.
"""This object describes the position on faces where a mask should be placed by default.
Attributes:
point (:obj:`str`): The part of the face relative to which the mask should be placed.
@@ -164,8 +163,8 @@ class MaskPosition(TelegramObject):
size, from top to bottom. For example, 1.0 will place the mask just below the default
mask position.
scale (:obj:`float`): Mask scaling coefficient. For example, 2.0 means double size.
"""
"""
FOREHEAD = 'forehead'
""":obj:`str`: 'forehead'"""
EYES = 'eyes'
+2 -2
View File
@@ -22,8 +22,7 @@ from telegram import TelegramObject, Location
class Venue(TelegramObject):
"""
This object represents a venue.
"""This object represents a venue.
Attributes:
location (:class:`telegram.Location`): Venue location.
@@ -37,6 +36,7 @@ class Venue(TelegramObject):
address (:obj:`str`): Address of the venue.
foursquare_id (:obj:`str`, optional): Foursquare identifier of the venue.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, location, title, address, foursquare_id=None, **kwargs):
+2 -2
View File
@@ -22,8 +22,7 @@ from telegram import PhotoSize, TelegramObject
class Video(TelegramObject):
"""
This object represents a video file.
"""This object represents a video file.
Attributes:
file_id (:obj:`str`): Unique identifier for this file.
@@ -43,6 +42,7 @@ class Video(TelegramObject):
mime_type (:obj:`str`, optional): Mime type of a file as defined by sender.
file_size (:obj:`int`, optional): File size.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
+2 -2
View File
@@ -22,8 +22,7 @@ from telegram import PhotoSize, TelegramObject
class VideoNote(TelegramObject):
"""
This object represents a video message (available in Telegram apps as of v.4.0).
"""This object represents a video message (available in Telegram apps as of v.4.0).
Attributes:
file_id (:obj:`str`): Unique identifier for this file.
@@ -39,6 +38,7 @@ class VideoNote(TelegramObject):
thumb (:class:`telegram.PhotoSize`, optional): Video thumbnail.
file_size (:obj:`int`, optional): File size.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, file_id, length, duration, thumb=None, file_size=None, **kwargs):
+2 -2
View File
@@ -22,8 +22,7 @@ from telegram import TelegramObject
class Voice(TelegramObject):
"""
This object represents a voice note.
"""This object represents a voice note.
Attributes:
file_id (:obj:`str`): Unique identifier for this file.
@@ -37,6 +36,7 @@ class Voice(TelegramObject):
mime_type (:obj:`str`, optional): MIME type of the file as defined by sender.
file_size (:obj:`int`, optional): File size.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, file_id, duration, mime_type=None, file_size=None, **kwargs):
+1 -7
View File
@@ -41,6 +41,7 @@ class ForceReply(ReplyMarkup):
original message.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, force_reply=True, selective=False, **kwargs):
@@ -48,10 +49,3 @@ class ForceReply(ReplyMarkup):
self.force_reply = bool(force_reply)
# Optionals
self.selective = bool(selective)
@classmethod
def de_json(cls, data, bot):
if not data:
return None
return cls(**data)
+2 -2
View File
@@ -22,8 +22,7 @@ from telegram import TelegramObject
class Animation(TelegramObject):
"""
This object represents an animation file to be displayed in the message containing a game.
"""This object represents an animation file to be displayed in the message containing a game.
Attributes:
file_id (:obj:`str`): Unique file identifier.
@@ -39,6 +38,7 @@ class Animation(TelegramObject):
file_name (:obj:`str`, optional): Original animation filename as defined by sender.
mime_type (:obj:`str`, optional): MIME type of the file as defined by sender.
file_size (:obj:`int`, optional): File size.
"""
def __init__(self,
+1 -3
View File
@@ -22,6 +22,4 @@ from telegram import TelegramObject
class CallbackGame(TelegramObject):
"""
A placeholder, currently holds no information. Use BotFather to set up your game.
"""
"""A placeholder, currently holds no information. Use BotFather to set up your game."""
+7 -6
View File
@@ -54,6 +54,7 @@ class Game(TelegramObject):
appear in text, such as usernames, URLs, bot commands, etc.
animation (:class:`telegram.Animation`, optional): Animation that will be displayed in the
game message in chats. Upload via BotFather.
"""
def __init__(self,
@@ -68,7 +69,7 @@ class Game(TelegramObject):
self.description = description
self.photo = photo
self.text = text
self.text_entities = text_entities
self.text_entities = text_entities or list()
self.animation = animation
@classmethod
@@ -88,13 +89,13 @@ class Game(TelegramObject):
data = super(Game, self).to_dict()
data['photo'] = [p.to_dict() for p in self.photo]
data['text_entities'] = [x.to_dict() for x in self.text_entities]
if self.text_entities:
data['text_entities'] = [x.to_dict() for x in self.text_entities]
return data
def parse_text_entity(self, entity):
"""
Returns the text from a given :class:`telegram.MessageEntity`.
"""Returns the text from a given :class:`telegram.MessageEntity`.
Note:
This method is present because Telegram calculates the offset and length in
@@ -107,8 +108,8 @@ class Game(TelegramObject):
Returns:
:obj:`str`: The text of the given entity.
"""
"""
# Is it a narrow build, if so we don't need to convert
if sys.maxunicode == 0xffff:
return self.text[entity.offset:entity.offset + entity.length]
@@ -137,8 +138,8 @@ class Game(TelegramObject):
Returns:
Dict[:class:`telegram.MessageEntity`, :obj:`str`]: A dictionary of entities mapped to
the text that belongs to them, calculated based on UTF-16 codepoints.
"""
"""
if types is None:
types = MessageEntity.ALL_TYPES
+2 -2
View File
@@ -22,8 +22,7 @@ from telegram import TelegramObject, User
class GameHighScore(TelegramObject):
"""
This object represents one row of the high scores table for a game.
"""This object represents one row of the high scores table for a game.
Attributes:
position (:obj:`int`): Position in high score table for the game.
@@ -34,6 +33,7 @@ class GameHighScore(TelegramObject):
position (:obj:`int`): Position in high score table for the game.
user (:class:`telegram.User`): User.
score (:obj:`int`): Score.
"""
def __init__(self, position, user, score):
+3 -24
View File
@@ -16,15 +16,13 @@
#
# 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 an object that represents a Telegram
InlineKeyboardButton"""
"""This module contains an object that represents a Telegram InlineKeyboardButton."""
from telegram import TelegramObject
class InlineKeyboardButton(TelegramObject):
"""
This object represents one button of an inline keyboard.
"""This object represents one button of an inline keyboard.
Note:
You must use exactly one of the optional fields. Mind that :attr:`callback_game` is not
@@ -67,6 +65,7 @@ class InlineKeyboardButton(TelegramObject):
pay (:obj:`bool`, optional): Specify True, to send a Pay button. This type of button must
always be the ``first`` button in the first row.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -88,23 +87,3 @@ class InlineKeyboardButton(TelegramObject):
self.switch_inline_query_current_chat = switch_inline_query_current_chat
self.callback_game = callback_game
self.pay = pay
@classmethod
def de_json(cls, data, bot):
data = super(InlineKeyboardButton, cls).de_json(data, bot)
if not data:
return None
return cls(**data)
@classmethod
def de_list(cls, data, bot):
if not data:
return []
inline_keyboards = list()
for inline_keyboard in data:
inline_keyboards.append(cls.de_json(inline_keyboard, bot))
return inline_keyboards
+2 -15
View File
@@ -18,7 +18,7 @@
# along with this program. If not, see [http://www.gnu.org/licenses/].
"""This module contains an object that represents a Telegram InlineKeyboardMarkup."""
from telegram import ReplyMarkup, InlineKeyboardButton
from telegram import ReplyMarkup
class InlineKeyboardMarkup(ReplyMarkup):
@@ -33,26 +33,13 @@ class InlineKeyboardMarkup(ReplyMarkup):
inline_keyboard (List[List[:class:`telegram.InlineKeyboardButton`]]): Array of button rows,
each represented by an Array of InlineKeyboardButton objects.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, inline_keyboard, **kwargs):
# Required
self.inline_keyboard = inline_keyboard
@classmethod
def de_json(cls, data, bot):
data = super(InlineKeyboardMarkup, cls).de_json(data, bot)
if not data:
return None
data['inline_keyboard'] = [
InlineKeyboardButton.de_list(inline_keyboard, bot)
for inline_keyboard in data['inline_keyboard']
]
return cls(**data)
def to_dict(self):
data = super(InlineKeyboardMarkup, self).to_dict()
+5 -5
View File
@@ -17,7 +17,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/].
"""This module contains an object that represents a Telegram InlineQuery"""
"""This module contains an object that represents a Telegram InlineQuery."""
from telegram import TelegramObject, User, Location
@@ -47,6 +47,7 @@ class InlineQuery(TelegramObject):
offset (:obj:`str`): Offset of the results to be returned, can be controlled by the bot.
bot (:class:`telegram.Bot`, optional): The Bot to use for instance methods.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, id, from_user, query, offset, location=None, bot=None, **kwargs):
@@ -83,10 +84,9 @@ class InlineQuery(TelegramObject):
return data
def answer(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.answer_inline_query(update.inline_query.id, *args, **kwargs)
bot.answer_inline_query(update.inline_query.id, *args, **kwargs)
Args:
results (List[:class:`telegram.InlineQueryResult`]): A list of results for the inline
@@ -106,6 +106,6 @@ class InlineQuery(TelegramObject):
switch_pm_parameter (:obj:`str`, optional): Deep-linking parameter for the /start
message sent to the bot when user presses the switch button. 1-64 characters,
only A-Z, a-z, 0-9, _ and - are allowed.
"""
"""
return self.bot.answer_inline_query(self.id, *args, **kwargs)
+3 -3
View File
@@ -16,14 +16,13 @@
#
# 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 InlineQueryResult"""
"""This module contains the classes that represent Telegram InlineQueryResult."""
from telegram import TelegramObject
class InlineQueryResult(TelegramObject):
"""
Baseclass for the InlineQueryResult* classes.
"""Baseclass for the InlineQueryResult* classes.
Attributes:
type (:obj:`str`): Type of the result.
@@ -33,6 +32,7 @@ class InlineQueryResult(TelegramObject):
type (:obj:`str`): Type of the result.
id (:obj:`str`): Unique identifier for this result, 1-64 Bytes.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, type, id, **kwargs):
+3 -16
View File
@@ -16,10 +16,9 @@
#
# 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
InlineQueryResultArticle"""
"""This module contains the classes that represent Telegram InlineQueryResultArticle."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultArticle(InlineQueryResult):
@@ -56,6 +55,7 @@ class InlineQueryResultArticle(InlineQueryResult):
thumb_width (:obj:`int`, optional): Thumbnail width.
thumb_height (:obj:`int`, optional): Thumbnail height.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -91,16 +91,3 @@ class InlineQueryResultArticle(InlineQueryResult):
self.thumb_width = thumb_width
if thumb_height:
self.thumb_height = thumb_height
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultArticle, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
+3 -16
View File
@@ -16,10 +16,9 @@
#
# 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
InlineQueryResultAudio"""
"""This module contains the classes that represent Telegram InlineQueryResultAudio."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultAudio(InlineQueryResult):
@@ -53,6 +52,7 @@ class InlineQueryResultAudio(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the audio.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -82,16 +82,3 @@ class InlineQueryResultAudio(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultAudio, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
@@ -16,10 +16,9 @@
#
# 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
InlineQueryResultCachedAudio"""
"""This module contains the classes that represent Telegram InlineQueryResultCachedAudio."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultCachedAudio(InlineQueryResult):
@@ -47,6 +46,7 @@ class InlineQueryResultCachedAudio(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the audio.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -67,16 +67,3 @@ class InlineQueryResultCachedAudio(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultCachedAudio, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
@@ -16,9 +16,9 @@
#
# 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 InlineQueryResultCachedDocument"""
"""This module contains the classes that represent Telegram InlineQueryResultCachedDocument."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultCachedDocument(InlineQueryResult):
@@ -50,6 +50,7 @@ class InlineQueryResultCachedDocument(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the file.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -75,16 +76,3 @@ class InlineQueryResultCachedDocument(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultCachedDocument, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
+3 -16
View File
@@ -16,10 +16,9 @@
#
# 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
InlineQueryResultCachedGif"""
"""This module contains the classes that represent Telegram InlineQueryResultCachedGif."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultCachedGif(InlineQueryResult):
@@ -50,6 +49,7 @@ class InlineQueryResultCachedGif(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the gif.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -73,16 +73,3 @@ class InlineQueryResultCachedGif(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultCachedGif, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
@@ -16,10 +16,9 @@
#
# 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
InlineQueryResultMpeg4Gif"""
"""This module contains the classes that represent Telegram InlineQueryResultMpeg4Gif."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultCachedMpeg4Gif(InlineQueryResult):
@@ -50,6 +49,7 @@ class InlineQueryResultCachedMpeg4Gif(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the MPEG-4 file.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -73,16 +73,3 @@ class InlineQueryResultCachedMpeg4Gif(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultCachedMpeg4Gif, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
@@ -18,7 +18,7 @@
# along with this program. If not, see [http://www.gnu.org/licenses/].
"""This module contains the classes that represent Telegram InlineQueryResultPhoto"""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultCachedPhoto(InlineQueryResult):
@@ -51,6 +51,7 @@ class InlineQueryResultCachedPhoto(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the photo.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -77,16 +78,3 @@ class InlineQueryResultCachedPhoto(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultCachedPhoto, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
@@ -16,9 +16,9 @@
#
# 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 InlineQueryResultCachedSticker"""
"""This module contains the classes that represent Telegram InlineQueryResultCachedSticker."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultCachedSticker(InlineQueryResult):
@@ -44,6 +44,7 @@ class InlineQueryResultCachedSticker(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the sticker.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -61,16 +62,3 @@ class InlineQueryResultCachedSticker(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultCachedSticker, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
@@ -16,9 +16,9 @@
#
# 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 InlineQueryResultCachedVideo"""
"""This module contains the classes that represent Telegram InlineQueryResultCachedVideo."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultCachedVideo(InlineQueryResult):
@@ -51,6 +51,7 @@ class InlineQueryResultCachedVideo(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the video.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -76,16 +77,3 @@ class InlineQueryResultCachedVideo(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultCachedVideo, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
@@ -16,9 +16,9 @@
#
# 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 InlineQueryResultCachedVoice"""
"""This module contains the classes that represent Telegram InlineQueryResultCachedVoice."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultCachedVoice(InlineQueryResult):
@@ -48,6 +48,7 @@ class InlineQueryResultCachedVoice(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the voice.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -70,16 +71,3 @@ class InlineQueryResultCachedVoice(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultCachedVoice, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
+2 -15
View File
@@ -16,9 +16,9 @@
#
# 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 InlineQueryResultContact"""
"""This module contains the classes that represent Telegram InlineQueryResultContact."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultContact(InlineQueryResult):
@@ -86,16 +86,3 @@ class InlineQueryResultContact(InlineQueryResult):
self.thumb_width = thumb_width
if thumb_height:
self.thumb_height = thumb_height
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultContact, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
+2 -14
View File
@@ -18,7 +18,7 @@
# along with this program. If not, see [http://www.gnu.org/licenses/].
"""This module contains the classes that represent Telegram InlineQueryResultDocument"""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultDocument(InlineQueryResult):
@@ -61,6 +61,7 @@ class InlineQueryResultDocument(InlineQueryResult):
thumb_width (:obj:`int`, optional): Thumbnail width.
thumb_height (:obj:`int`, optional): Thumbnail height.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -97,16 +98,3 @@ class InlineQueryResultDocument(InlineQueryResult):
self.thumb_width = thumb_width
if thumb_height:
self.thumb_height = thumb_height
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultDocument, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
+4 -16
View File
@@ -16,15 +16,13 @@
#
# 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
InlineQueryResultGame"""
"""This module contains the classes that represent Telegram InlineQueryResultGame."""
from telegram import InlineQueryResult, InlineKeyboardMarkup
from telegram import InlineQueryResult
class InlineQueryResultGame(InlineQueryResult):
"""
Represents a Game.
"""Represents a Game.
Attributes:
type (:obj:`str`): 'game'.
@@ -39,6 +37,7 @@ class InlineQueryResultGame(InlineQueryResult):
reply_markup (:class:`telegram.InlineKeyboardMarkup`, optional): Inline keyboard attached
to the message.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, id, game_short_name, reply_markup=None, **kwargs):
@@ -49,14 +48,3 @@ class InlineQueryResultGame(InlineQueryResult):
if reply_markup:
self.reply_markup = reply_markup
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultGame, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
return cls(**data)
+3 -16
View File
@@ -16,10 +16,9 @@
#
# 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
InlineQueryResultGif"""
"""This module contains the classes that represent Telegram InlineQueryResultGif."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultGif(InlineQueryResult):
@@ -57,6 +56,7 @@ class InlineQueryResultGif(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the gif.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -92,16 +92,3 @@ class InlineQueryResultGif(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultGif, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
+2 -15
View File
@@ -16,9 +16,9 @@
#
# 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 InlineQueryResultLocation"""
"""This module contains the classes that represent Telegram InlineQueryResultLocation."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultLocation(InlineQueryResult):
@@ -85,16 +85,3 @@ class InlineQueryResultLocation(InlineQueryResult):
self.thumb_width = thumb_width
if thumb_height:
self.thumb_height = thumb_height
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultLocation, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
+3 -15
View File
@@ -16,9 +16,9 @@
#
# 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 InlineQueryResultMpeg4Gif"""
"""This module contains the classes that represent Telegram InlineQueryResultMpeg4Gif."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultMpeg4Gif(InlineQueryResult):
@@ -57,6 +57,7 @@ class InlineQueryResultMpeg4Gif(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the MPEG-4 file.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -92,16 +93,3 @@ class InlineQueryResultMpeg4Gif(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultMpeg4Gif, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
+3 -15
View File
@@ -16,9 +16,9 @@
#
# 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 InlineQueryResultPhoto"""
"""This module contains the classes that represent Telegram InlineQueryResultPhoto."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultPhoto(InlineQueryResult):
@@ -58,6 +58,7 @@ class InlineQueryResultPhoto(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the photo.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -92,16 +93,3 @@ class InlineQueryResultPhoto(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultPhoto, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
+3 -15
View File
@@ -16,9 +16,9 @@
#
# 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 InlineQueryResultVenue"""
"""This module contains the classes that represent Telegram InlineQueryResultVenue."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultVenue(InlineQueryResult):
@@ -58,6 +58,7 @@ class InlineQueryResultVenue(InlineQueryResult):
thumb_width (:obj:`int`, optional): Thumbnail width.
thumb_height (:obj:`int`, optional): Thumbnail height.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -94,16 +95,3 @@ class InlineQueryResultVenue(InlineQueryResult):
self.thumb_width = thumb_width
if thumb_height:
self.thumb_height = thumb_height
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultVenue, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
+3 -16
View File
@@ -16,10 +16,9 @@
#
# 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
InlineQueryResultVideo"""
"""This module contains the classes that represent Telegram InlineQueryResultVideo."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultVideo(InlineQueryResult):
@@ -62,6 +61,7 @@ class InlineQueryResultVideo(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the video.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -101,16 +101,3 @@ class InlineQueryResultVideo(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultVideo, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
+3 -16
View File
@@ -16,10 +16,9 @@
#
# 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
InlineQueryResultVoice"""
"""This module contains the classes that represent Telegram InlineQueryResultVoice."""
from telegram import InlineQueryResult, InlineKeyboardMarkup, InputMessageContent
from telegram import InlineQueryResult
class InlineQueryResultVoice(InlineQueryResult):
@@ -52,6 +51,7 @@ class InlineQueryResultVoice(InlineQueryResult):
input_message_content (:class:`telegram.InputMessageContent`, optional): Content of the
message to be sent instead of the voice.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -78,16 +78,3 @@ class InlineQueryResultVoice(InlineQueryResult):
self.reply_markup = reply_markup
if input_message_content:
self.input_message_content = input_message_content
@classmethod
def de_json(cls, data, bot):
data = super(InlineQueryResultVoice, cls).de_json(data, bot)
if not data:
return None
data['reply_markup'] = InlineKeyboardMarkup.de_json(data.get('reply_markup'), bot)
data['input_message_content'] = InputMessageContent.de_json(
data.get('input_message_content'), bot)
return cls(**data)
@@ -16,15 +16,13 @@
#
# 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
InputContactMessageContent"""
"""This module contains the classes that represent Telegram InputContactMessageContent."""
from telegram import InputMessageContent
class InputContactMessageContent(InputMessageContent):
"""
Represents the content of a contact message to be sent as the result of an inline query.
"""Represents the content of a contact message to be sent as the result of an inline query.
Attributes:
phone_number (:obj:`str`): Contact's phone number.
@@ -36,6 +34,7 @@ class InputContactMessageContent(InputMessageContent):
first_name (:obj:`str`): Contact's first name.
last_name (:obj:`str`, optional): Contact's last name.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, phone_number, first_name, last_name=None, **kwargs):
@@ -44,7 +43,3 @@ class InputContactMessageContent(InputMessageContent):
self.first_name = first_name
# Optionals
self.last_name = last_name
@classmethod
def de_json(cls, data, bot):
return cls(**data)
@@ -16,8 +16,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/].
"""This module contains the classes that represent Telegram
InputLocationMessageContent"""
"""This module contains the classes that represent Telegram InputLocationMessageContent."""
from telegram import InputMessageContent
@@ -34,13 +33,10 @@ class InputLocationMessageContent(InputMessageContent):
latitude (:obj:`float`): Latitude of the location in degrees.
longitude (:obj:`float`): Longitude of the location in degrees.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, latitude, longitude, **kwargs):
# Required
self.latitude = latitude
self.longitude = longitude
@classmethod
def de_json(cls, data, bot):
return cls(**data)
+5 -37
View File
@@ -16,49 +16,17 @@
#
# 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
InputMessageContent"""
"""This module contains the classes that represent Telegram InputMessageContent."""
from telegram import TelegramObject
class InputMessageContent(TelegramObject):
"""
Base class for Telegram InputMessageContent Objects
"""Base class for Telegram InputMessageContent Objects.
See: :class:`telegram.InputContactMessageContent`,
:class:`telegram.InputLocationMessageContent`, :class:`telegram.InputTextMessageContent` and
:class:`telegram.InputVenueMessageContent` for more details.
"""
@classmethod
def de_json(cls, data, bot):
data = super(InputMessageContent, cls).de_json(data, bot)
if not data:
return None
try:
from telegram import InputTextMessageContent
return InputTextMessageContent.de_json(data, bot)
except TypeError:
pass
try:
from telegram import InputVenueMessageContent
return InputVenueMessageContent.de_json(data, bot)
except TypeError:
pass
try:
from telegram import InputLocationMessageContent
return InputLocationMessageContent.de_json(data, bot)
except TypeError:
pass
try:
from telegram import InputContactMessageContent
return InputContactMessageContent.de_json(data, bot)
except TypeError:
pass
return None
pass
+2 -6
View File
@@ -16,8 +16,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/].
"""This module contains the classes that represent Telegram
InputTextMessageContent"""
"""This module contains the classes that represent Telegram InputTextMessageContent."""
from telegram import InputMessageContent
@@ -41,6 +40,7 @@ class InputTextMessageContent(InputMessageContent):
disable_web_page_preview (:obj:`bool`, optional): Disables link previews for links in the
sent message.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, message_text, parse_mode=None, disable_web_page_preview=None, **kwargs):
@@ -49,7 +49,3 @@ class InputTextMessageContent(InputMessageContent):
# Optionals
self.parse_mode = parse_mode
self.disable_web_page_preview = disable_web_page_preview
@classmethod
def de_json(cls, data, bot):
return cls(**data)
+3 -8
View File
@@ -16,15 +16,13 @@
#
# 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
InputVenueMessageContent"""
"""This module contains the classes that represent Telegram InputVenueMessageContent."""
from telegram import InputMessageContent
class InputVenueMessageContent(InputMessageContent):
"""
Represents the content of a venue message to be sent as the result of an inline query.
"""Represents the content of a venue message to be sent as the result of an inline query.
Attributes:
latitude (:obj:`float`): Latitude of the location in degrees.
@@ -40,6 +38,7 @@ class InputVenueMessageContent(InputMessageContent):
address (:obj:`str`): Address of the venue.
foursquare_id (:obj:`str`, optional): Foursquare identifier of the venue, if known.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, latitude, longitude, title, address, foursquare_id=None, **kwargs):
@@ -50,7 +49,3 @@ class InputVenueMessageContent(InputMessageContent):
self.address = address
# Optionals
self.foursquare_id = foursquare_id
@classmethod
def de_json(cls, data, bot):
return cls(**data)
+1 -18
View File
@@ -45,6 +45,7 @@ class KeyboardButton(TelegramObject):
Note:
:attr:`request_contact` and :attr:`request_location` options will only work in Telegram
versions released after 9 April, 2016. Older clients will ignore them.
"""
def __init__(self, text, request_contact=None, request_location=None, **kwargs):
@@ -53,21 +54,3 @@ class KeyboardButton(TelegramObject):
# Optionals
self.request_contact = request_contact
self.request_location = request_location
@classmethod
def de_json(cls, data, bot):
if not data:
return None
return cls(**data)
@classmethod
def de_list(cls, data, bot):
if not data:
return []
keyboards = list()
for keyboard in data:
keyboards.append(cls.de_json(keyboard, bot))
return keyboards
+172 -111
View File
@@ -27,9 +27,11 @@ from telegram.utils.deprecate import warn_deprecate_obj
from telegram.utils.helpers import escape_html, escape_markdown, to_timestamp, from_timestamp
_UNDEFINED = object()
class Message(TelegramObject):
"""
This object represents a message.
"""This object represents a message.
Note:
* In Python `from` is a reserved word, use `from_user` instead.
@@ -83,6 +85,10 @@ class Message(TelegramObject):
invoice (:class:`telegram.Invoice`): Optional. Information about the invoice.
successful_payment (:class:`telegram.SuccessfulPayment`): Optional. Information about the
payment.
forward_signature (:obj:`str`): Optional. Signature of the post author for messages
forwarded from channels.
author_signature (:obj:`str`): Optional. Signature of the post author for messages
in channels.
bot (:class:`telegram.Bot`): Optional. The Bot to use for instance methods.
Deprecated: 6.0
@@ -169,8 +175,14 @@ class Message(TelegramObject):
information about the invoice.
successful_payment (:class:`telegram.SuccessfulPayment`, optional): Message is a service
message about a successful payment, information about the payment.
forward_signature (:obj:`str`, optional): Signature of the post author for messages
forwarded from channels.
author_signature (:obj:`str`, optional): Signature of the post author for messages
in channels.
"""
_effective_attachment = _UNDEFINED
def __init__(self,
message_id,
from_user,
@@ -210,6 +222,8 @@ class Message(TelegramObject):
pinned_message=None,
invoice=None,
successful_payment=None,
forward_signature=None,
author_signature=None,
bot=None,
**kwargs):
# Required
@@ -228,7 +242,7 @@ class Message(TelegramObject):
self.audio = audio
self.game = game
self.document = document
self.photo = photo
self.photo = photo or list()
self.sticker = sticker
self.video = video
self.voice = voice
@@ -238,10 +252,10 @@ class Message(TelegramObject):
self.location = location
self.venue = venue
self._new_chat_member = new_chat_member
self.new_chat_members = new_chat_members
self.new_chat_members = new_chat_members or list()
self.left_chat_member = left_chat_member
self.new_chat_title = new_chat_title
self.new_chat_photo = new_chat_photo
self.new_chat_photo = new_chat_photo or list()
self.delete_chat_photo = bool(delete_chat_photo)
self.group_chat_created = bool(group_chat_created)
self.supergroup_chat_created = bool(supergroup_chat_created)
@@ -252,6 +266,8 @@ class Message(TelegramObject):
self.forward_from_message_id = forward_from_message_id
self.invoice = invoice
self.successful_payment = successful_payment
self.forward_signature = forward_signature
self.author_signature = author_signature
self.bot = bot
@@ -259,9 +275,7 @@ class Message(TelegramObject):
@property
def chat_id(self):
"""
:obj:`int`: Shortcut for :attr:`telegram.Chat.id` for :attr:`chat`.
"""
""":obj:`int`: Shortcut for :attr:`telegram.Chat.id` for :attr:`chat`."""
return self.chat.id
@classmethod
@@ -301,6 +315,39 @@ class Message(TelegramObject):
return cls(bot=bot, **data)
@property
def effective_attachment(self):
"""
:class:`telegram.Audio`
or :class:`telegram.Contact`
or :class:`telegram.Document`
or :class:`telegram.Game`
or :class:`telegram.Invoice`
or :class:`telegram.Location`
or List[:class:`telegram.PhotoSize`]
or :class:`telegram.Sticker`
or :class:`telegram.SuccessfulPayment`
or :class:`telegram.Venue`
or :class:`telegram.Video`
or :class:`telegram.VideoNote`
or :class:`telegram.Voice`: The attachment that this message was sent with. May be
``None`` if no attachment was sent.
"""
if self._effective_attachment is not _UNDEFINED:
return self._effective_attachment
for i in (self.audio, self.game, self.document, self.photo, self.sticker,
self.video, self.voice, self.video_note, self.contact, self.location,
self.venue, self.invoice, self.successful_payment):
if i:
self._effective_attachment = i
break
else:
self._effective_attachment = None
return self._effective_attachment
def __getitem__(self, item):
if item in self.__dict__.keys():
return self.__dict__[item]
@@ -331,7 +378,7 @@ class Message(TelegramObject):
return data
def _quote(self, kwargs):
"""Modify kwargs for replying with or without quoting"""
"""Modify kwargs for replying with or without quoting."""
if 'reply_to_message_id' in kwargs:
if 'quote' in kwargs:
del kwargs['quote']
@@ -347,8 +394,7 @@ class Message(TelegramObject):
kwargs['reply_to_message_id'] = self.message_id
def reply_text(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.send_message(update.message.chat_id, *args, **kwargs)
@@ -357,14 +403,13 @@ class Message(TelegramObject):
reply to this message. If ``reply_to_message_id`` is passed in ``kwargs``, this
parameter will be ignored. Default: ``True`` in group chats and ``False`` in
private chats.
"""
"""
self._quote(kwargs)
return self.bot.send_message(self.chat_id, *args, **kwargs)
def reply_photo(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.send_photo(update.message.chat_id, *args, **kwargs)
@@ -375,14 +420,13 @@ class Message(TelegramObject):
Returns:
:class:`telegram.Message`: On success, instance representing the message posted.
"""
"""
self._quote(kwargs)
return self.bot.send_photo(self.chat_id, *args, **kwargs)
def reply_audio(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.send_audio(update.message.chat_id, *args, **kwargs)
@@ -393,14 +437,13 @@ class Message(TelegramObject):
Returns:
:class:`telegram.Message`: On success, instance representing the message posted.
"""
"""
self._quote(kwargs)
return self.bot.send_audio(self.chat_id, *args, **kwargs)
def reply_document(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.send_document(update.message.chat_id, *args, **kwargs)
@@ -411,14 +454,13 @@ class Message(TelegramObject):
Returns:
:class:`telegram.Message`: On success, instance representing the message posted.
"""
"""
self._quote(kwargs)
return self.bot.send_document(self.chat_id, *args, **kwargs)
def reply_sticker(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.send_sticker(update.message.chat_id, *args, **kwargs)
@@ -429,16 +471,15 @@ class Message(TelegramObject):
Returns:
:class:`telegram.Message`: On success, instance representing the message posted.
"""
"""
self._quote(kwargs)
return self.bot.send_sticker(self.chat_id, *args, **kwargs)
def reply_video(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.send_video(update.message.chat_id, *args, **kwargs)
bot.send_video(update.message.chat_id, *args, **kwargs)
Keyword Args:
quote (:obj:`bool`, optional): If set to ``True``, the photo is sent as an actual reply
@@ -447,16 +488,15 @@ class Message(TelegramObject):
Returns:
:class:`telegram.Message`: On success, instance representing the message posted.
"""
"""
self._quote(kwargs)
return self.bot.send_video(self.chat_id, *args, **kwargs)
def reply_video_note(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.send_video_note(update.message.chat_id, *args, **kwargs)
bot.send_video_note(update.message.chat_id, *args, **kwargs)
Keyword Args:
quote (:obj:`bool`, optional): If set to ``True``, the photo is sent as an actual reply
@@ -465,14 +505,13 @@ class Message(TelegramObject):
Returns:
:class:`telegram.Message`: On success, instance representing the message posted.
"""
"""
self._quote(kwargs)
return self.bot.send_video_note(self.chat_id, *args, **kwargs)
def reply_voice(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.send_voice(update.message.chat_id, *args, **kwargs)
@@ -483,16 +522,15 @@ class Message(TelegramObject):
Returns:
:class:`telegram.Message`: On success, instance representing the message posted.
"""
"""
self._quote(kwargs)
return self.bot.send_voice(self.chat_id, *args, **kwargs)
def reply_location(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.send_location(update.message.chat_id, *args, **kwargs)
bot.send_location(update.message.chat_id, *args, **kwargs)
Keyword Args:
quote (:obj:`bool`, optional): If set to ``True``, the photo is sent as an actual reply
@@ -501,16 +539,15 @@ class Message(TelegramObject):
Returns:
:class:`telegram.Message`: On success, instance representing the message posted.
"""
"""
self._quote(kwargs)
return self.bot.send_location(self.chat_id, *args, **kwargs)
def reply_venue(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.send_venue(update.message.chat_id, *args, **kwargs)
bot.send_venue(update.message.chat_id, *args, **kwargs)
Keyword Args:
quote (:obj:`bool`, optional): If set to ``True``, the photo is sent as an actual reply
@@ -519,16 +556,15 @@ class Message(TelegramObject):
Returns:
:class:`telegram.Message`: On success, instance representing the message posted.
"""
"""
self._quote(kwargs)
return self.bot.send_venue(self.chat_id, *args, **kwargs)
def reply_contact(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.send_contact(update.message.chat_id, *args, **kwargs)
bot.send_contact(update.message.chat_id, *args, **kwargs)
Keyword Args:
quote (:obj:`bool`, optional): If set to ``True``, the photo is sent as an actual reply
@@ -537,24 +573,23 @@ class Message(TelegramObject):
Returns:
:class:`telegram.Message`: On success, instance representing the message posted.
"""
"""
self._quote(kwargs)
return self.bot.send_contact(self.chat_id, *args, **kwargs)
def forward(self, chat_id, disable_notification=False):
"""
Shortcut for::
"""Shortcut for::
bot.forward_message(chat_id=chat_id,
from_chat_id=update.message.chat_id,
disable_notification=disable_notification,
message_id=update.message.message_id)
bot.forward_message(chat_id=chat_id,
from_chat_id=update.message.chat_id,
disable_notification=disable_notification,
message_id=update.message.message_id)
Returns:
:class:`telegram.Message`: On success, instance representing the message forwarded.
"""
"""
return self.bot.forward_message(
chat_id=chat_id,
from_chat_id=self.chat_id,
@@ -562,13 +597,12 @@ class Message(TelegramObject):
message_id=self.message_id)
def edit_text(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.edit_message_text(chat_id=message.chat_id,
message_id=message.message_id,
*args,
**kwargs)
bot.edit_message_text(chat_id=message.chat_id,
message_id=message.message_id,
*args,
**kwargs)
Note:
You can only edit messages that the bot sent itself,
@@ -577,19 +611,18 @@ class Message(TelegramObject):
Returns:
:class:`telegram.Message`: On success, instance representing the edited message.
"""
"""
return self.bot.edit_message_text(
chat_id=self.chat_id, message_id=self.message_id, *args, **kwargs)
def edit_caption(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.edit_message_caption(chat_id=message.chat_id,
message_id=message.message_id,
*args,
**kwargs)
bot.edit_message_caption(chat_id=message.chat_id,
message_id=message.message_id,
*args,
**kwargs)
Note:
You can only edit messages that the bot sent itself,
@@ -598,19 +631,18 @@ class Message(TelegramObject):
Returns:
:class:`telegram.Message`: On success, instance representing the edited message.
"""
"""
return self.bot.edit_message_caption(
chat_id=self.chat_id, message_id=self.message_id, *args, **kwargs)
def edit_reply_markup(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.edit_message_reply_markup(chat_id=message.chat_id,
message_id=message.message_id,
*args,
**kwargs)
bot.edit_message_reply_markup(chat_id=message.chat_id,
message_id=message.message_id,
*args,
**kwargs)
Note:
You can only edit messages that the bot sent itself,
@@ -620,18 +652,16 @@ class Message(TelegramObject):
Returns:
:class:`telegram.Message`: On success, instance representing the edited message.
"""
return self.bot.edit_message_reply_markup(
chat_id=self.chat_id, message_id=self.message_id, *args, **kwargs)
def delete(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.delete_message(chat_id=message.chat_id,
message_id=message.message_id,
*args,
**kwargs)
bot.delete_message(chat_id=message.chat_id,
message_id=message.message_id,
*args,
**kwargs)
Returns:
:obj:`bool`: On success, ``True`` is returned.
@@ -641,8 +671,7 @@ class Message(TelegramObject):
chat_id=self.chat_id, message_id=self.message_id, *args, **kwargs)
def parse_entity(self, entity):
"""
Returns the text from a given :class:`telegram.MessageEntity`.
"""Returns the text from a given :class:`telegram.MessageEntity`.
Note:
This method is present because Telegram calculates the offset and length in
@@ -655,8 +684,8 @@ class Message(TelegramObject):
Returns:
str: The text of the given entity
"""
"""
# Is it a narrow build, if so we don't need to convert
if sys.maxunicode == 0xffff:
return self.text[entity.offset:entity.offset + entity.length]
@@ -687,8 +716,8 @@ class Message(TelegramObject):
Returns:
Dict[:class:`telegram.MessageEntity`, :obj:`str`]: A dictionary of entities mapped to
the text that belongs to them, calculated based on UTF-16 codepoints.
"""
"""
if types is None:
types = MessageEntity.ALL_TYPES
@@ -697,23 +726,13 @@ class Message(TelegramObject):
for entity in self.entities if entity.type in types
}
@property
def text_html(self):
"""
Creates an HTML-formatted string from the markup entities found in the message.
Use this if you want to retrieve the message text with the entities formatted as HTML.
Returns:
:obj:`str`: Message text with entities formatted as HTML.
"""
def _text_html(self, urled=False):
entities = self.parse_entities()
message_text = self.text
if not sys.maxunicode == 0xffff:
message_text = message_text.encode('utf-16-le')
markdown_text = ''
html_text = ''
last_offset = 0
for entity, text in sorted(entities.items(), key=(lambda item: item[0].offset)):
@@ -721,7 +740,7 @@ class Message(TelegramObject):
if entity.type == MessageEntity.TEXT_LINK:
insert = '<a href="{}">{}</a>'.format(entity.url, text)
elif entity.type == MessageEntity.URL:
elif (entity.type == MessageEntity.URL) and urled:
insert = '<a href="{0}">{0}</a>'.format(text)
elif entity.type == MessageEntity.BOLD:
insert = '<b>' + text + '</b>'
@@ -735,30 +754,46 @@ class Message(TelegramObject):
insert = text
if sys.maxunicode == 0xffff:
markdown_text += escape_html(message_text[last_offset:entity.offset]) + insert
html_text += escape_html(message_text[last_offset:entity.offset]) + insert
else:
markdown_text += escape_html(message_text[last_offset * 2:entity.offset * 2]
.decode('utf-16-le')) + insert
html_text += escape_html(message_text[last_offset * 2:entity.offset * 2]
.decode('utf-16-le')) + insert
last_offset = entity.offset + entity.length
if sys.maxunicode == 0xffff:
markdown_text += escape_html(message_text[last_offset:])
html_text += escape_html(message_text[last_offset:])
else:
markdown_text += escape_html(message_text[last_offset * 2:].decode('utf-16-le'))
return markdown_text
html_text += escape_html(message_text[last_offset * 2:].decode('utf-16-le'))
return html_text
@property
def text_markdown(self):
"""
Creates an Markdown-formatted string from the markup entities found in the message.
def text_html(self):
"""Creates an HTML-formatted string from the markup entities found in the message.
Use this if you want to retrieve the message text with the entities formatted as Markdown.
Use this if you want to retrieve the message text with the entities formatted as HTML in
the same way the original message was formatted.
Returns:
:obj:`str`: Message text with entities formatted as Markdown.
"""
:obj:`str`: Message text with entities formatted as HTML.
"""
return self._text_html(urled=False)
@property
def text_html_urled(self):
"""Creates an HTML-formatted string from the markup entities found in the message.
Use this if you want to retrieve the message text with the entities formatted as HTML.
This also formats :attr:`telegram.MessageEntity.URL` as a hyperlink.
Returns:
:obj:`str`: Message text with entities formatted as HTML.
"""
return self._text_html(urled=True)
def _text_markdown(self, urled=False):
entities = self.parse_entities()
message_text = self.text
if not sys.maxunicode == 0xffff:
@@ -772,7 +807,7 @@ class Message(TelegramObject):
if entity.type == MessageEntity.TEXT_LINK:
insert = '[{}]({})'.format(text, entity.url)
elif entity.type == MessageEntity.URL:
elif (entity.type == MessageEntity.URL) and urled:
insert = '[{0}]({0})'.format(text)
elif entity.type == MessageEntity.BOLD:
insert = '*' + text + '*'
@@ -798,6 +833,32 @@ class Message(TelegramObject):
markdown_text += escape_markdown(message_text[last_offset * 2:].decode('utf-16-le'))
return markdown_text
@property
def text_markdown(self):
"""Creates an Markdown-formatted string from the markup entities found in the message.
Use this if you want to retrieve the message text with the entities formatted as Markdown
in the same way the original message was formatted.
Returns:
:obj:`str`: Message text with entities formatted as Markdown.
"""
return self._text_markdown(urled=False)
@property
def text_markdown_urled(self):
"""Creates an Markdown-formatted string from the markup entities found in the message.
Use this if you want to retrieve the message text with the entities formatted as Markdown.
This also formats :attr:`telegram.MessageEntity.URL` as a hyperlink.
Returns:
:obj:`str`: Message text with entities formatted as Markdown.
"""
return self._text_markdown(urled=True)
@property
def new_chat_member(self):
"""Deprecated"""
+1
View File
@@ -43,6 +43,7 @@ class MessageEntity(TelegramObject):
url (:obj:`str`, optional): For "text_link" only, url that will be opened after usertaps on
the text.
user (:class:`telegram.User`, optional): For "text_mention" only, the mentioned user.
"""
def __init__(self, type, offset, length, url=None, user=None, **kwargs):
+2 -5
View File
@@ -17,14 +17,11 @@
#
# 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 an object that represents a Telegram
Message Parse Modes."""
"""This module contains an object that represents a Telegram Message Parse Modes."""
class ParseMode(object):
"""
This object represents a Telegram Message Parse Modes.
"""
"""This object represents a Telegram Message Parse Modes."""
MARKDOWN = 'Markdown'
""":obj:`str`: 'Markdown'"""
+2 -2
View File
@@ -22,8 +22,7 @@ from telegram import TelegramObject
class Invoice(TelegramObject):
"""
This object contains basic information about an invoice.
"""This object contains basic information about an invoice.
Attributes:
title (:obj:`str`): Product name.
@@ -41,6 +40,7 @@ class Invoice(TelegramObject):
total_amount (:obj:`int`): Total price in the smallest units of the currency (integer, not
float/double). For example, for a price of US$ 1.45 pass amount = 145.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, title, description, start_parameter, currency, total_amount, **kwargs):
+2 -20
View File
@@ -22,8 +22,7 @@ from telegram import TelegramObject
class LabeledPrice(TelegramObject):
"""
This object represents a portion of the price for goods or services.
"""This object represents a portion of the price for goods or services.
Attributes:
label (:obj:`str`): Portion label.
@@ -36,26 +35,9 @@ class LabeledPrice(TelegramObject):
parameter in currencies.json, it shows the number of digits past the decimal point for
each currency (2 for the majority of currencies).
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, label, amount, **kwargs):
self.label = label
self.amount = amount
@classmethod
def de_json(cls, data, bot):
if not data:
return None
return cls(**data)
@classmethod
def de_list(cls, data, bot):
if not data:
return []
labeled_prices = list()
for labeled_price in data:
labeled_prices.append(cls.de_json(labeled_price, bot))
return labeled_prices
+2 -2
View File
@@ -22,8 +22,7 @@ from telegram import TelegramObject, ShippingAddress
class OrderInfo(TelegramObject):
"""
This object represents information about an order.
"""This object represents information about an order.
Attributes:
name (:obj:`str`): Optional. User name.
@@ -37,6 +36,7 @@ class OrderInfo(TelegramObject):
email (:obj:`str`, optional): User email.
shipping_address (:class:`telegram.ShippingAddress`, optional): User shipping address.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, name=None, phone_number=None, email=None, shipping_address=None, **kwargs):
+5 -6
View File
@@ -22,8 +22,7 @@ from telegram import TelegramObject, User, OrderInfo
class PreCheckoutQuery(TelegramObject):
"""
This object contains information about an incoming pre-checkout query.
"""This object contains information about an incoming pre-checkout query.
Note:
* In Python `from` is a reserved word, use `from_user` instead.
@@ -53,6 +52,7 @@ class PreCheckoutQuery(TelegramObject):
order_info (:class:`telegram.OrderInfo`, optional): Order info provided by the user.
bot (:class:`telegram.Bot`, optional): The Bot to use for instance methods.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self,
@@ -97,10 +97,9 @@ class PreCheckoutQuery(TelegramObject):
return data
def answer(self, *args, **kwargs):
"""
Shortcut for::
"""Shortcut for::
bot.answer_pre_checkout_query(update.pre_checkout_query.id, *args, **kwargs)
bot.answer_pre_checkout_query(update.pre_checkout_query.id, *args, **kwargs)
Args:
ok (:obj:`bool`): Specify True if everything is alright (goods are available, etc.) and
@@ -111,6 +110,6 @@ class PreCheckoutQuery(TelegramObject):
were busy filling out your payment details. Please choose a different color or
garment!"). Telegram will display this message to the user.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
"""
return self.bot.answer_pre_checkout_query(self.id, *args, **kwargs)
+2 -2
View File
@@ -22,8 +22,7 @@ from telegram import TelegramObject
class ShippingAddress(TelegramObject):
"""
This object represents a Telegram ShippingAddress.
"""This object represents a Telegram ShippingAddress.
Attributes:
country_code (:obj:`str`): ISO 3166-1 alpha-2 country code.
@@ -41,6 +40,7 @@ class ShippingAddress(TelegramObject):
street_line2 (:obj:`str`): Second line for the address.
post_code (:obj:`str`): Address post code.
**kwargs (:obj:`dict`): Arbitrary keyword arguments.
"""
def __init__(self, country_code, state, city, street_line1, street_line2, post_code, **kwargs):

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