30
30
from signal import signal , SIGINT , SIGTERM , SIGABRT
31
31
from telegram import Bot , TelegramError , NullHandler
32
32
from telegram .ext import dispatcher , Dispatcher , JobQueue , UpdateQueue
33
+ from telegram .error import Unauthorized , InvalidToken
33
34
from telegram .utils .webhookhandler import (WebhookServer , WebhookHandler )
34
35
35
36
logging .getLogger (__name__ ).addHandler (NullHandler ())
@@ -94,7 +95,7 @@ def __init__(self,
94
95
""":type: list[Thread]"""
95
96
96
97
def start_polling (self , poll_interval = 0.0 , timeout = 10 , network_delay = 2 ,
97
- clean = False ):
98
+ clean = False , bootstrap_retries = 0 ):
98
99
"""
99
100
Starts polling updates from Telegram.
100
101
@@ -106,6 +107,11 @@ def start_polling(self, poll_interval=0.0, timeout=10, network_delay=2,
106
107
clean (Optional[bool]): Whether to clean any pending updates on
107
108
Telegram servers before actually starting to poll. Default is
108
109
False.
110
+ bootstrap_retries (Optional[int[): Whether the bootstrapping phase
111
+ of the `Updater` will retry on failures on the Telegram server.
112
+ < 0 - retry indefinitely
113
+ 0 - no retries (default)
114
+ > 0 - retry up to X times
109
115
110
116
Returns:
111
117
Queue: The update queue that can be filled from the main thread
@@ -120,7 +126,8 @@ def start_polling(self, poll_interval=0.0, timeout=10, network_delay=2,
120
126
# Create & start threads
121
127
self ._init_thread (self .dispatcher .start , "dispatcher" )
122
128
self ._init_thread (self ._start_polling , "updater" ,
123
- poll_interval , timeout , network_delay )
129
+ poll_interval , timeout , network_delay ,
130
+ bootstrap_retries )
124
131
125
132
# Return the update queue so the main thread can insert updates
126
133
return self .update_queue
@@ -185,18 +192,18 @@ def start_webhook(self,
185
192
# Return the update queue so the main thread can insert updates
186
193
return self .update_queue
187
194
188
- def _start_polling (self , poll_interval , timeout , network_delay ):
195
+ def _start_polling (self , poll_interval , timeout , network_delay ,
196
+ bootstrap_retries ):
189
197
"""
190
198
Thread target of thread 'updater'. Runs in background, pulls
191
199
updates from Telegram and inserts them in the update queue of the
192
200
Dispatcher.
193
- """
194
201
202
+ """
195
203
cur_interval = poll_interval
196
204
self .logger .debug ('Updater thread started' )
197
205
198
- # Remove webhook
199
- self .bot .setWebhook (webhook_url = None )
206
+ self ._set_webhook (None , bootstrap_retries )
200
207
201
208
while self .running :
202
209
try :
@@ -228,6 +235,27 @@ def _start_polling(self, poll_interval, timeout, network_delay):
228
235
229
236
sleep (cur_interval )
230
237
238
+ def _set_webhook (self , webhook_url , max_retries ):
239
+ retries = 0
240
+ while 1 :
241
+ try :
242
+ # Remove webhook
243
+ self .bot .setWebhook (webhook_url = webhook_url )
244
+ except (Unauthorized , InvalidToken ):
245
+ raise
246
+ except TelegramError :
247
+ msg = 'failed to set webhook; try={0} max_retries={1}' .format (
248
+ retries , max_retries )
249
+ if max_retries < 0 or retries < max_retries :
250
+ self .logger .info (msg )
251
+ retries += 1
252
+ else :
253
+ self .logger .exception (msg )
254
+ raise
255
+ else :
256
+ break
257
+ sleep (1 )
258
+
231
259
@staticmethod
232
260
def _increase_poll_interval (current_interval ):
233
261
# increase waiting times on subsequent errors up to 30secs
0 commit comments