Skip to content

Commit

Permalink
Merge pull request #2332 from coder2020official/bugfixes
Browse files Browse the repository at this point in the history
Error intervals to stop flooding logs & set non_stop to true by default
  • Loading branch information
Badiboy authored Jul 4, 2024
2 parents 134fda7 + 08c0894 commit 695af3f
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 11 deletions.
4 changes: 4 additions & 0 deletions telebot/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2601,6 +2601,10 @@ def send_document(
logger.warning('The parameter "thumb" is deprecated. Use "thumbnail" instead.')
thumbnail = thumb

if isinstance(document, types.InputFile) and visible_file_name:
# inputfile name ignored, warn
logger.warning('Cannot use both InputFile and visible_file_name. InputFile name will be ignored.')

return types.Message.de_json(
apihelper.send_data(
self.token, chat_id, document, 'document',
Expand Down
2 changes: 1 addition & 1 deletion telebot/apihelper.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ def _make_request(token, method_name, method='get', params=None, files=None):
# process types.InputFile
for key, value in files_copy.items():
if isinstance(value, types.InputFile):
files[key] = value.file
files[key] = (value.file_name, value.file)
elif isinstance(value, tuple) and (len(value) == 2) and isinstance(value[1], types.InputFile):
files[key] = (value[0], value[1].file)

Expand Down
34 changes: 26 additions & 8 deletions telebot/async_telebot.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ def _setup_change_detector(self, path_to_watch: str) -> None:
self.event_observer.schedule(self.event_handler, path, recursive=True)
self.event_observer.start()

async def polling(self, non_stop: bool=False, skip_pending=False, interval: int=0, timeout: int=20,
async def polling(self, non_stop: bool=True, skip_pending=False, interval: int=0, timeout: int=20,
request_timeout: Optional[int]=None, allowed_updates: Optional[List[str]]=None,
none_stop: Optional[bool]=None, restart_on_change: Optional[bool]=False, path_to_watch: Optional[str]=None):
"""
Expand All @@ -257,11 +257,6 @@ async def polling(self, non_stop: bool=False, skip_pending=False, interval: int=
Always gets updates.
.. note::
Set non_stop=True if you want your bot to continue receiving updates
if there is an error.
.. note::
Install watchdog and psutil before using restart_on_change option.
Expand Down Expand Up @@ -393,6 +388,15 @@ def __hide_token(self, message: str) -> str:
return message.replace(code, "*" * len(code))
else:
return message

async def _handle_error_interval(self, error_interval: float):
logger.debug('Waiting for %s seconds before retrying', error_interval)
await asyncio.sleep(error_interval)
if error_interval * 2 < 60: # same logic as sync
error_interval *= 2
else:
error_interval = 60
return error_interval

async def _process_polling(self, non_stop: bool=False, interval: int=0, timeout: int=20,
request_timeout: int=None, allowed_updates: Optional[List[str]]=None):
Expand Down Expand Up @@ -426,16 +430,18 @@ async def _process_polling(self, non_stop: bool=False, interval: int=0, timeout:

self._polling = True

error_interval = 0.25

try:
while self._polling:
try:

updates = await self.get_updates(offset=self.offset, allowed_updates=allowed_updates, timeout=timeout, request_timeout=request_timeout)
if updates:
self.offset = updates[-1].update_id + 1
# noinspection PyAsyncCall
asyncio.create_task(self.process_new_updates(updates)) # Seperate task for processing updates
if interval: await asyncio.sleep(interval)
error_interval = 0.25 # drop error_interval if no errors

except KeyboardInterrupt:
return
Expand All @@ -446,9 +452,11 @@ async def _process_polling(self, non_stop: bool=False, interval: int=0, timeout:
if not handled:
logger.error('Unhandled exception (full traceback for debug level): %s', self.__hide_token(str(e)))
logger.debug(self.__hide_token(traceback.format_exc()))

if non_stop:
error_interval = await self._handle_error_interval(error_interval)

if non_stop or handled:
await asyncio.sleep(2)
continue
else:
return
Expand All @@ -458,6 +466,9 @@ async def _process_polling(self, non_stop: bool=False, interval: int=0, timeout:
logger.error('Unhandled exception (full traceback for debug level): %s', self.__hide_token(str(e)))
logger.debug(self.__hide_token(traceback.format_exc()))

if non_stop:
error_interval = await self._handle_error_interval(error_interval)

if non_stop or handled:
continue
else:
Expand All @@ -468,6 +479,9 @@ async def _process_polling(self, non_stop: bool=False, interval: int=0, timeout:
logger.error('Unhandled exception (full traceback for debug level): %s', str(e))
logger.debug(traceback.format_exc())

if non_stop:
error_interval = await self._handle_error_interval(error_interval)

if non_stop or handled:
continue
else:
Expand Down Expand Up @@ -4017,6 +4031,10 @@ async def send_document(
if reply_parameters and (reply_parameters.allow_sending_without_reply is None):
reply_parameters.allow_sending_without_reply = self.allow_sending_without_reply

if isinstance(document, types.InputFile) and visible_file_name:
# inputfile name ignored, warn
logger.warning('Cannot use both InputFile and visible_file_name. InputFile name will be ignored.')

return types.Message.de_json(
await asyncio_helper.send_data(
self.token, chat_id, document, 'document',
Expand Down
2 changes: 2 additions & 0 deletions telebot/asyncio_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ def _prepare_data(params=None, files=None):
if isinstance(f, tuple):
if len(f) == 2:
file_name, file = f
if isinstance(file, types.InputFile):
file = file.file
else:
raise ValueError('Tuple must have exactly 2 elements: filename, fileobj')
elif isinstance(f, types.InputFile):
Expand Down
14 changes: 12 additions & 2 deletions telebot/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -7748,8 +7748,11 @@ class InputFile:
InputFile(pathlib.Path('/path/to/file/file.txt'))
)
"""
def __init__(self, file) -> None:
self._file, self.file_name = self._resolve_file(file)
def __init__(self, file: Union[str, IOBase, Path], file_name: Optional[str] = None):
self._file, self._file_name = self._resolve_file(file)
if file_name:
self._file_name = file_name


@staticmethod
def _resolve_file(file):
Expand All @@ -7770,6 +7773,13 @@ def file(self):
File object.
"""
return self._file

@property
def file_name(self):
"""
File name.
"""
return self._file_name


class ForumTopicCreated(JsonDeserializable):
Expand Down

0 comments on commit 695af3f

Please sign in to comment.