mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-11 09:55:21 +00:00
commit
0a7aa2eb31
6 changed files with 51 additions and 43 deletions
|
|
@ -239,7 +239,7 @@ class BaseBot:
|
|||
setattr(self, '_parse_mode', None)
|
||||
else:
|
||||
if not isinstance(value, str):
|
||||
raise TypeError(f"Parse mode must be an 'str' not {type(value)}")
|
||||
raise TypeError(f"Parse mode must be str, not {type(value)}")
|
||||
value = value.lower()
|
||||
if value not in ParseMode.all():
|
||||
raise ValueError(f"Parse mode must be one of {ParseMode.all()}")
|
||||
|
|
|
|||
|
|
@ -378,9 +378,9 @@ async def migrate_redis1_to_redis2(storage1: RedisStorage, storage2: RedisStorag
|
|||
:return:
|
||||
"""
|
||||
if not isinstance(storage1, RedisStorage): # better than assertion
|
||||
raise TypeError(f'{type(storage1)} is not RedisStorage instance.')
|
||||
raise TypeError(f"{type(storage1)} is not RedisStorage instance.")
|
||||
if not isinstance(storage2, RedisStorage):
|
||||
raise TypeError(f'{type(storage2)} is not RedisStorage instance.')
|
||||
raise TypeError(f"{type(storage2)} is not RedisStorage instance.")
|
||||
|
||||
log = logging.getLogger('aiogram.RedisStorage')
|
||||
|
||||
|
|
|
|||
|
|
@ -5,11 +5,12 @@ import logging
|
|||
import time
|
||||
import typing
|
||||
|
||||
from .filters import CommandsFilter, ContentTypeFilter, ExceptionsFilter, RegexpFilter, USER_STATE, \
|
||||
generate_default_filters
|
||||
from .filters import CommandsFilter, ContentTypeFilter, ExceptionsFilter, RegexpFilter, \
|
||||
USER_STATE, generate_default_filters
|
||||
from .handler import CancelHandler, Handler, SkipHandler
|
||||
from .middlewares import MiddlewareManager
|
||||
from .storage import BaseStorage, DELTA, DisabledStorage, EXCEEDED_COUNT, FSMContext, LAST_CALL, RATE_LIMIT, RESULT
|
||||
from .storage import BaseStorage, DELTA, DisabledStorage, EXCEEDED_COUNT, FSMContext, \
|
||||
LAST_CALL, RATE_LIMIT, RESULT
|
||||
from .webhook import BaseResponse
|
||||
from ..bot import Bot
|
||||
from ..types.message import ContentType
|
||||
|
|
@ -30,9 +31,8 @@ class Dispatcher:
|
|||
"""
|
||||
Simple Updates dispatcher
|
||||
|
||||
It will be can process incoming updates, messages, edited messages, channel posts, edited channels posts,
|
||||
inline query, chosen inline result, callback query, shipping query, pre-checkout query.
|
||||
Provide next step handler and etc.
|
||||
It will process incoming updates: messages, edited messages, channel posts, edited channel posts,
|
||||
inline queries, chosen inline results, callback queries, shipping queries, pre-checkout queries.
|
||||
"""
|
||||
|
||||
def __init__(self, bot, loop=None, storage: typing.Optional[BaseStorage] = None,
|
||||
|
|
@ -181,7 +181,6 @@ class Dispatcher:
|
|||
state=state)
|
||||
return await self.pre_checkout_query_handlers.notify(update.pre_checkout_query)
|
||||
except Exception as e:
|
||||
success = False
|
||||
err = await self.errors_handlers.notify(self, update, e)
|
||||
if err:
|
||||
return err
|
||||
|
|
@ -293,7 +292,7 @@ class Dispatcher:
|
|||
|
||||
async def wait_closed(self):
|
||||
"""
|
||||
Wait closing the long polling
|
||||
Wait for the long-polling to close
|
||||
|
||||
:return:
|
||||
"""
|
||||
|
|
@ -305,7 +304,7 @@ class Dispatcher:
|
|||
|
||||
def is_polling(self):
|
||||
"""
|
||||
Check polling is enabled?
|
||||
Check if polling is enabled
|
||||
|
||||
:return:
|
||||
"""
|
||||
|
|
@ -314,18 +313,18 @@ class Dispatcher:
|
|||
def register_message_handler(self, callback, *, commands=None, regexp=None, content_types=None, func=None,
|
||||
state=None, custom_filters=None, run_task=None, **kwargs):
|
||||
"""
|
||||
You can register messages handler by this method
|
||||
Register handler for message
|
||||
|
||||
.. code-block:: python3
|
||||
|
||||
# This handler works only is state is None (by default).
|
||||
# This handler works only if state is None (by default).
|
||||
dp.register_message_handler(cmd_start, commands=['start', 'about'])
|
||||
dp.register_message_handler(entry_point, commands=['setup'])
|
||||
|
||||
# That handler works only if current state is "first_step"
|
||||
# This handler works only if current state is "first_step"
|
||||
dp.register_message_handler(step_handler_1, state="first_step")
|
||||
|
||||
# If you want to handle all states by one handler then use state="*".
|
||||
# If you want to handle all states by one handler then use `state="*"`.
|
||||
dp.register_message_handler(cancel_handler, commands=['cancel'], state="*")
|
||||
dp.register_message_handler(cancel_handler, func=lambda msg: msg.text.lower() == 'cancel', state="*")
|
||||
|
||||
|
|
@ -357,7 +356,7 @@ class Dispatcher:
|
|||
def message_handler(self, *custom_filters, commands=None, regexp=None, content_types=None, func=None, state=None,
|
||||
run_task=None, **kwargs):
|
||||
"""
|
||||
Decorator for messages handler
|
||||
Decorator for message handler
|
||||
|
||||
Examples:
|
||||
|
||||
|
|
@ -375,6 +374,13 @@ class Dispatcher:
|
|||
@dp.messages_handler(rexexp='^[a-z]+-[0-9]+')
|
||||
async def msg_handler(message: types.Message):
|
||||
|
||||
Filter messages by command regular expression:
|
||||
|
||||
.. code-block:: python3
|
||||
|
||||
@dp.message_handler(filters.RegexpCommandsFilter(regexp_commands=['item_([0-9]*)']))
|
||||
async def send_welcome(message: types.Message):
|
||||
|
||||
Filter by content type:
|
||||
|
||||
.. code-block:: python3
|
||||
|
|
@ -431,7 +437,7 @@ class Dispatcher:
|
|||
def register_edited_message_handler(self, callback, *, commands=None, regexp=None, content_types=None, func=None,
|
||||
state=None, custom_filters=None, run_task=None, **kwargs):
|
||||
"""
|
||||
Analog of message_handler but only for edited messages
|
||||
Register handler for edited message
|
||||
|
||||
:param callback:
|
||||
:param commands: list of commands
|
||||
|
|
@ -462,7 +468,7 @@ class Dispatcher:
|
|||
def edited_message_handler(self, *custom_filters, commands=None, regexp=None, content_types=None, func=None,
|
||||
state=None, run_task=None, **kwargs):
|
||||
"""
|
||||
Analog of message_handler but only for edited messages
|
||||
Decorator for edited message handler
|
||||
|
||||
You can use combination of different handlers
|
||||
|
||||
|
|
@ -494,7 +500,7 @@ class Dispatcher:
|
|||
def register_channel_post_handler(self, callback, *, commands=None, regexp=None, content_types=None, func=None,
|
||||
state=None, custom_filters=None, run_task=None, **kwargs):
|
||||
"""
|
||||
Register channels posts handler
|
||||
Register handler for channel post
|
||||
|
||||
:param callback:
|
||||
:param commands: list of commands
|
||||
|
|
@ -525,7 +531,7 @@ class Dispatcher:
|
|||
def channel_post_handler(self, *custom_filters, commands=None, regexp=None, content_types=None, func=None,
|
||||
state=None, run_task=None, **kwargs):
|
||||
"""
|
||||
Register channels posts handler
|
||||
Decorator for channel post handler
|
||||
|
||||
:param commands: list of commands
|
||||
:param regexp: REGEXP
|
||||
|
|
@ -549,7 +555,7 @@ class Dispatcher:
|
|||
def register_edited_channel_post_handler(self, callback, *, commands=None, regexp=None, content_types=None,
|
||||
func=None, state=None, custom_filters=None, run_task=None, **kwargs):
|
||||
"""
|
||||
Register handler for edited channels posts
|
||||
Register handler for edited channel post
|
||||
|
||||
:param callback:
|
||||
:param commands: list of commands
|
||||
|
|
@ -580,7 +586,7 @@ class Dispatcher:
|
|||
def edited_channel_post_handler(self, *custom_filters, commands=None, regexp=None, content_types=None, func=None,
|
||||
state=None, run_task=None, **kwargs):
|
||||
"""
|
||||
Register handler for edited channels posts
|
||||
Decorator for edited channel post handler
|
||||
|
||||
:param commands: list of commands
|
||||
:param regexp: REGEXP
|
||||
|
|
@ -603,7 +609,7 @@ class Dispatcher:
|
|||
|
||||
def register_inline_handler(self, callback, *, func=None, state=None, custom_filters=None, run_task=None, **kwargs):
|
||||
"""
|
||||
Handle inline query
|
||||
Register handler for inline query
|
||||
|
||||
Example:
|
||||
|
||||
|
|
@ -631,7 +637,7 @@ class Dispatcher:
|
|||
|
||||
def inline_handler(self, *custom_filters, func=None, state=None, run_task=None, **kwargs):
|
||||
"""
|
||||
Handle inline query
|
||||
Decorator for inline query handler
|
||||
|
||||
Example:
|
||||
|
||||
|
|
@ -658,7 +664,7 @@ class Dispatcher:
|
|||
def register_chosen_inline_handler(self, callback, *, func=None, state=None, custom_filters=None, run_task=None,
|
||||
**kwargs):
|
||||
"""
|
||||
Register chosen inline handler
|
||||
Register handler for chosen inline query
|
||||
|
||||
Example:
|
||||
|
||||
|
|
@ -686,7 +692,7 @@ class Dispatcher:
|
|||
|
||||
def chosen_inline_handler(self, *custom_filters, func=None, state=None, run_task=None, **kwargs):
|
||||
"""
|
||||
Register chosen inline handler
|
||||
Decorator for chosen inline query handler
|
||||
|
||||
Example:
|
||||
|
||||
|
|
@ -713,7 +719,7 @@ class Dispatcher:
|
|||
def register_callback_query_handler(self, callback, *, func=None, state=None, custom_filters=None, run_task=None,
|
||||
**kwargs):
|
||||
"""
|
||||
Add callback query handler
|
||||
Register handler for callback query
|
||||
|
||||
Example:
|
||||
|
||||
|
|
@ -740,7 +746,7 @@ class Dispatcher:
|
|||
|
||||
def callback_query_handler(self, *custom_filters, func=None, state=None, run_task=None, **kwargs):
|
||||
"""
|
||||
Add callback query handler
|
||||
Decorator for callback query handler
|
||||
|
||||
Example:
|
||||
|
||||
|
|
@ -766,7 +772,7 @@ class Dispatcher:
|
|||
def register_shipping_query_handler(self, callback, *, func=None, state=None, custom_filters=None, run_task=None,
|
||||
**kwargs):
|
||||
"""
|
||||
Add shipping query handler
|
||||
Register handler for shipping query
|
||||
|
||||
Example:
|
||||
|
||||
|
|
@ -793,7 +799,7 @@ class Dispatcher:
|
|||
|
||||
def shipping_query_handler(self, *custom_filters, func=None, state=None, run_task=None, **kwargs):
|
||||
"""
|
||||
Add shipping query handler
|
||||
Decorator for shipping query handler
|
||||
|
||||
Example:
|
||||
|
||||
|
|
@ -819,7 +825,7 @@ class Dispatcher:
|
|||
def register_pre_checkout_query_handler(self, callback, *, func=None, state=None, custom_filters=None,
|
||||
run_task=None, **kwargs):
|
||||
"""
|
||||
Add shipping query handler
|
||||
Register handler for pre-checkout query
|
||||
|
||||
Example:
|
||||
|
||||
|
|
@ -846,7 +852,7 @@ class Dispatcher:
|
|||
|
||||
def pre_checkout_query_handler(self, *custom_filters, func=None, state=None, run_task=None, **kwargs):
|
||||
"""
|
||||
Add shipping query handler
|
||||
Decorator for pre-checkout query handler
|
||||
|
||||
Example:
|
||||
|
||||
|
|
@ -871,7 +877,7 @@ class Dispatcher:
|
|||
|
||||
def register_errors_handler(self, callback, *, func=None, exception=None, run_task=None):
|
||||
"""
|
||||
Register errors handler
|
||||
Register handler for errors
|
||||
|
||||
:param callback:
|
||||
:param func:
|
||||
|
|
@ -887,7 +893,7 @@ class Dispatcher:
|
|||
|
||||
def errors_handler(self, func=None, exception=None, run_task=None):
|
||||
"""
|
||||
Decorator for registering errors handler
|
||||
Decorator for errors handler
|
||||
|
||||
:param func:
|
||||
:param exception: you can make handler for specific errors type
|
||||
|
|
@ -932,10 +938,10 @@ class Dispatcher:
|
|||
async def throttle(self, key, *, rate=None, user=None, chat=None, no_error=None) -> bool:
|
||||
"""
|
||||
Execute throttling manager.
|
||||
Return True limit is not exceeded otherwise raise ThrottleError or return False
|
||||
Returns True if limit has not exceeded otherwise raises ThrottleError or returns False
|
||||
|
||||
:param key: key in storage
|
||||
:param rate: limit (by default is equals with default rate limit)
|
||||
:param rate: limit (by default is equal to default rate limit)
|
||||
:param user: user id
|
||||
:param chat: chat id
|
||||
:param no_error: return boolean value instead of raising error
|
||||
|
|
@ -983,7 +989,7 @@ class Dispatcher:
|
|||
await self.storage.set_bucket(chat=chat, user=user, bucket=bucket)
|
||||
|
||||
if not result and not no_error:
|
||||
# Raise if that is allowed
|
||||
# Raise if it is allowed
|
||||
raise Throttled(key=key, chat=chat, user=user, **data)
|
||||
return result
|
||||
|
||||
|
|
@ -1035,7 +1041,7 @@ class Dispatcher:
|
|||
def async_task(self, func):
|
||||
"""
|
||||
Execute handler as task and return None.
|
||||
Use that decorator for slow handlers (with timeouts)
|
||||
Use this decorator for slow handlers (with timeouts)
|
||||
|
||||
.. code-block:: python3
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,8 @@ class MiddlewareManager:
|
|||
:param middleware:
|
||||
:return:
|
||||
"""
|
||||
assert isinstance(middleware, BaseMiddleware)
|
||||
if not isinstance(middleware, BaseMiddleware):
|
||||
raise TypeError(f"`middleware` must be an instance of BaseMiddleware, not {type(middleware)}")
|
||||
if middleware.is_configured():
|
||||
raise ValueError('That middleware is already used!')
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,8 @@ class Version:
|
|||
|
||||
@version.setter
|
||||
def version(self, version):
|
||||
assert isinstance(version, (tuple, list))
|
||||
if not isinstance(version, (tuple, list)):
|
||||
raise TypeError(f"`version` must be an instance of tuple/list, not {type(version)}")
|
||||
self.__raw_version = version
|
||||
self.__version = None
|
||||
|
||||
|
|
|
|||
|
|
@ -84,12 +84,12 @@ async def cmd_id(message: types.Message):
|
|||
chat = message.chat
|
||||
|
||||
result_msg = [hbold('Info about user:'),
|
||||
f'First name: {target.first_name}']
|
||||
f"First name: {target.first_name}"]
|
||||
if target.last_name:
|
||||
result_msg.append(f"Last name: {target.last_name}")
|
||||
if target.username:
|
||||
result_msg.append(f"Username: {target.mention}")
|
||||
result_msg.append(f'User ID: {target.id}')
|
||||
result_msg.append(f"User ID: {target.id}")
|
||||
|
||||
result_msg.extend([hbold('Chat:'),
|
||||
f"Type: {chat.type}",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue