#564: Added possibility to use allowed_updates argument in Polling mode

This commit is contained in:
Alex Root Junior 2021-04-12 00:32:40 +03:00
parent 79c59b34f9
commit 69e4ecc606
4 changed files with 36 additions and 9 deletions

View file

@ -43,5 +43,5 @@ __all__ = (
'utils', 'utils',
) )
__version__ = '2.12.1' __version__ = '2.12.2'
__api_version__ = '5.1' __api_version__ = '5.1'

View file

@ -340,7 +340,8 @@ class Dispatcher(DataMixin, ContextInstanceMixin):
limit=None, limit=None,
reset_webhook=None, reset_webhook=None,
fast: typing.Optional[bool] = True, fast: typing.Optional[bool] = True,
error_sleep: int = 5): error_sleep: int = 5,
allowed_updates: typing.Optional[typing.List[str]] = None):
""" """
Start long-polling Start long-polling
@ -349,6 +350,8 @@ class Dispatcher(DataMixin, ContextInstanceMixin):
:param limit: :param limit:
:param reset_webhook: :param reset_webhook:
:param fast: :param fast:
:param error_sleep:
:param allowed_updates:
:return: :return:
""" """
if self._polling: if self._polling:
@ -377,10 +380,15 @@ class Dispatcher(DataMixin, ContextInstanceMixin):
while self._polling: while self._polling:
try: try:
with self.bot.request_timeout(request_timeout): with self.bot.request_timeout(request_timeout):
updates = await self.bot.get_updates(limit=limit, offset=offset, timeout=timeout) updates = await self.bot.get_updates(
limit=limit,
offset=offset,
timeout=timeout,
allowed_updates=allowed_updates
)
except asyncio.CancelledError: except asyncio.CancelledError:
break break
except: except Exception as e:
log.exception('Cause exception while getting updates.') log.exception('Cause exception while getting updates.')
await asyncio.sleep(error_sleep) await asyncio.sleep(error_sleep)
continue continue

View file

@ -1,5 +1,7 @@
from __future__ import annotations from __future__ import annotations
from functools import lru_cache
from . import base from . import base
from . import fields from . import fields
from .callback_query import CallbackQuery from .callback_query import CallbackQuery
@ -72,3 +74,9 @@ class AllowedUpdates(helper.Helper):
"Use `CHOSEN_INLINE_RESULT`", "Use `CHOSEN_INLINE_RESULT`",
new_value_getter=lambda cls: cls.CHOSEN_INLINE_RESULT, new_value_getter=lambda cls: cls.CHOSEN_INLINE_RESULT,
) )
@classmethod
@lru_cache(1)
def default(cls):
excluded = cls.CHAT_MEMBER + cls.MY_CHAT_MEMBER
return list(filter(lambda item: item not in excluded, cls.all()))

View file

@ -2,7 +2,7 @@ import asyncio
import datetime import datetime
import functools import functools
import secrets import secrets
from typing import Callable, Union, Optional, Any from typing import Callable, Union, Optional, Any, List
from warnings import warn from warnings import warn
from aiohttp import web from aiohttp import web
@ -23,7 +23,8 @@ def _setup_callbacks(executor: 'Executor', on_startup=None, on_shutdown=None):
def start_polling(dispatcher, *, loop=None, skip_updates=False, reset_webhook=True, def start_polling(dispatcher, *, loop=None, skip_updates=False, reset_webhook=True,
on_startup=None, on_shutdown=None, timeout=20, relax=0.1, fast=True): on_startup=None, on_shutdown=None, timeout=20, relax=0.1, fast=True,
allowed_updates: Optional[List[str]] = None):
""" """
Start bot in long-polling mode Start bot in long-polling mode
@ -34,11 +35,20 @@ def start_polling(dispatcher, *, loop=None, skip_updates=False, reset_webhook=Tr
:param on_startup: :param on_startup:
:param on_shutdown: :param on_shutdown:
:param timeout: :param timeout:
:param relax:
:param fast:
:param allowed_updates:
""" """
executor = Executor(dispatcher, skip_updates=skip_updates, loop=loop) executor = Executor(dispatcher, skip_updates=skip_updates, loop=loop)
_setup_callbacks(executor, on_startup, on_shutdown) _setup_callbacks(executor, on_startup, on_shutdown)
executor.start_polling(reset_webhook=reset_webhook, timeout=timeout, relax=relax, fast=fast) executor.start_polling(
reset_webhook=reset_webhook,
timeout=timeout,
relax=relax,
fast=fast,
allowed_updates=allowed_updates
)
def set_webhook(dispatcher: Dispatcher, webhook_path: str, *, loop: Optional[asyncio.AbstractEventLoop] = None, def set_webhook(dispatcher: Dispatcher, webhook_path: str, *, loop: Optional[asyncio.AbstractEventLoop] = None,
@ -295,7 +305,8 @@ class Executor:
self.set_webhook(webhook_path=webhook_path, request_handler=request_handler, route_name=route_name) self.set_webhook(webhook_path=webhook_path, request_handler=request_handler, route_name=route_name)
self.run_app(**kwargs) self.run_app(**kwargs)
def start_polling(self, reset_webhook=None, timeout=20, relax=0.1, fast=True): def start_polling(self, reset_webhook=None, timeout=20, relax=0.1, fast=True,
allowed_updates: Optional[List[str]] = None):
""" """
Start bot in long-polling mode Start bot in long-polling mode
@ -308,7 +319,7 @@ class Executor:
try: try:
loop.run_until_complete(self._startup_polling()) loop.run_until_complete(self._startup_polling())
loop.create_task(self.dispatcher.start_polling(reset_webhook=reset_webhook, timeout=timeout, loop.create_task(self.dispatcher.start_polling(reset_webhook=reset_webhook, timeout=timeout,
relax=relax, fast=fast)) relax=relax, fast=fast, allowed_updates=allowed_updates))
loop.run_forever() loop.run_forever()
except (KeyboardInterrupt, SystemExit): except (KeyboardInterrupt, SystemExit):
# loop.stop() # loop.stop()