diff --git a/.travis.yml b/.travis.yml index bd742f71c..6009539b9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,9 +7,11 @@ python: - "pypy" - "pypy3" install: - - pip install coveralls + - pip install pylint flake8 coveralls - pip install -r requirements.txt script: - nosetests --with-coverage --cover-package telegram/ + - nosetests --with-coverage --cover-package telegram/ + - flake8 telegram + - 'if [[ $TRAVIS_PYTHON_VERSION != 2.6 ]]; then pylint -E telegram; fi' after_success: coveralls diff --git a/CHANGES.rst b/CHANGES.rst index 74031d835..7f8527ba2 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,9 @@ +**2015-11-11** + +*Released 2.9.2* + +- Error handling on request timeouts has been improved + **2015-11-10** *Released 2.9.1* diff --git a/docs/source/conf.py b/docs/source/conf.py index 5d717915e..ab68ae745 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -60,7 +60,7 @@ author = u'Leandro Toledo' # The short X.Y version. version = '2.9' # The full version, including alpha/beta/rc tags. -release = '2.9.1' +release = '2.9.2' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/examples/echobot.py b/examples/echobot.py index c9e9992e3..949b0255a 100644 --- a/examples/echobot.py +++ b/examples/echobot.py @@ -1,6 +1,7 @@ #!/usr/bin/env python +# -*- coding: utf-8 -*- # -# Simple Bot to reply Telegram messages +# Simple Bot to reply to Telegram messages # Copyright (C) 2015 Leandro Toledo de Souza # # This program is free software: you can redistribute it and/or modify @@ -19,13 +20,16 @@ import logging import telegram +from time import sleep - -LAST_UPDATE_ID = None +try: + from urllib.error import URLError +except ImportError: + from urllib2 import URLError # python 2 def main(): - global LAST_UPDATE_ID + update_id = None logging.basicConfig( format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') @@ -33,33 +37,35 @@ def main(): # Telegram Bot Authorization Token bot = telegram.Bot('TOKEN') - # This will be our global variable to keep the latest update_id when requesting - # for updates. It starts with the latest update_id if available. - try: - LAST_UPDATE_ID = bot.getUpdates()[-1].update_id - except IndexError: - LAST_UPDATE_ID = None - while True: - echo(bot) + try: + update_id = echo(bot, update_id) + except telegram.TelegramError as e: + # These are network problems with Telegram. + if e.message in ("Bad Gateway", "Timed out"): + sleep(1) + else: + raise e + except URLError as e: + # These are network problems on our end. + sleep(1) -def echo(bot): - global LAST_UPDATE_ID +def echo(bot, update_id): - # Request updates after the last updated_id - for update in bot.getUpdates(offset=LAST_UPDATE_ID, timeout=10): - # chat_id is required to reply any message + # Request updates after the last update_id + for update in bot.getUpdates(offset=update_id, timeout=10): + # chat_id is required to reply to any message chat_id = update.message.chat_id - reply_text = update.message.text + update_id = update.update_id + 1 + message = update.message.text - if reply_text: - # Reply the message + if message: + # Reply to the message bot.sendMessage(chat_id=chat_id, - text=reply_text) + text=message) - # Updates global offset to get the new updates - LAST_UPDATE_ID = update.update_id + 1 + return update_id if __name__ == '__main__': diff --git a/setup.py b/setup.py index a12c9936d..317d47da9 100644 --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ def requirements(): setup( name='python-telegram-bot', - version='2.9.1', + version='2.9.2', author='Leandro Toledo', author_email='leandrotoledodesouza@gmail.com', license='LGPLv3', diff --git a/telegram/utils/request.py b/telegram/utils/request.py index 87ccccc4c..430d98482 100644 --- a/telegram/utils/request.py +++ b/telegram/utils/request.py @@ -110,7 +110,11 @@ def post(url, if error.getcode() == 502: raise TelegramError('Bad Gateway') - message = _parse(error.read()) + try: + message = _parse(error.read()) + except ValueError: + message = 'Unknown HTTPError' + raise TelegramError(message) except (SSLError, socket.timeout) as error: if "operation timed out" in str(error):