From 8b28ba8fc4581a3d1cdd8dc47c37386beb5dc116 Mon Sep 17 00:00:00 2001 From: Alex Root Junior Date: Wed, 15 Nov 2017 23:42:14 +0200 Subject: [PATCH] Add more filters. --- aiogram/dispatcher/__init__.py | 28 ++++++++--------- aiogram/dispatcher/filters.py | 20 +++++++++++- aiogram/types/chat.py | 56 ++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 15 deletions(-) diff --git a/aiogram/dispatcher/__init__.py b/aiogram/dispatcher/__init__.py index f4e7f581..54c3080c 100644 --- a/aiogram/dispatcher/__init__.py +++ b/aiogram/dispatcher/__init__.py @@ -305,8 +305,8 @@ class Dispatcher: **kwargs) self.message_handlers.register(callback, filters_set) - def message_handler(self, *, commands=None, regexp=None, content_types=None, func=None, state=None, - custom_filters=None, **kwargs): + def message_handler(self, *custom_filters, commands=None, regexp=None, content_types=None, func=None, state=None, + **kwargs): """ Decorator for messages handler @@ -409,8 +409,8 @@ class Dispatcher: **kwargs) self.edited_message_handlers.register(callback, filters_set) - def edited_message_handler(self, *, commands=None, regexp=None, content_types=None, func=None, state=None, - custom_filters=None, **kwargs): + def edited_message_handler(self, *custom_filters, commands=None, regexp=None, content_types=None, func=None, state=None, + **kwargs): """ Analog of message_handler but only for edited messages @@ -472,8 +472,8 @@ class Dispatcher: **kwargs) self.channel_post_handlers.register(callback, filters_set) - def channel_post_handler(self, *, commands=None, regexp=None, content_types=None, func=None, state=None, - custom_filters=None, **kwargs): + def channel_post_handler(self, *custom_filters, commands=None, regexp=None, content_types=None, func=None, state=None, + **kwargs): """ Register channels posts handler @@ -526,8 +526,8 @@ class Dispatcher: **kwargs) self.edited_channel_post_handlers.register(callback, filters_set) - def edited_channel_post_handler(self, *, commands=None, regexp=None, content_types=None, func=None, state=None, - custom_filters=None, **kwargs): + def edited_channel_post_handler(self, *custom_filters, commands=None, regexp=None, content_types=None, func=None, state=None, + **kwargs): """ Register handler for edited channels posts @@ -576,7 +576,7 @@ class Dispatcher: **kwargs) self.inline_query_handlers.register(callback, filters_set) - def inline_handler(self, *, func=None, state=None, custom_filters=None, **kwargs): + def inline_handler(self, *custom_filters, func=None, state=None, **kwargs): """ Handle inline query @@ -627,7 +627,7 @@ class Dispatcher: **kwargs) self.chosen_inline_result_handlers.register(callback, filters_set) - def chosen_inline_handler(self, *, func=None, state=None, custom_filters=None, **kwargs): + def chosen_inline_handler(self, *custom_filters, func=None, state=None, **kwargs): """ Register chosen inline handler @@ -678,7 +678,7 @@ class Dispatcher: **kwargs) self.callback_query_handlers.register(callback, filters_set) - def callback_query_handler(self, *, func=None, state=None, custom_filters=None, **kwargs): + def callback_query_handler(self, *custom_filters, func=None, state=None, **kwargs): """ Add callback query handler @@ -728,7 +728,7 @@ class Dispatcher: **kwargs) self.shipping_query_handlers.register(callback, filters_set) - def shipping_query_handler(self, *, func=None, state=None, custom_filters=None, **kwargs): + def shipping_query_handler(self, *custom_filters, func=None, state=None, **kwargs): """ Add shipping query handler @@ -778,7 +778,7 @@ class Dispatcher: **kwargs) self.pre_checkout_query_handlers.register(callback, filters_set) - def pre_checkout_query_handler(self, *, func=None, state=None, custom_filters=None, **kwargs): + def pre_checkout_query_handler(self, *custom_filters, func=None, state=None, **kwargs): """ Add shipping query handler @@ -817,7 +817,7 @@ class Dispatcher: filters_set.append(ExceptionsFilter(exception)) self.errors_handlers.register(callback, filters_set) - def errors_handler(self, *, func=None, exception=None): + def errors_handler(self, func=None, exception=None): """ Decorator for registering errors handler diff --git a/aiogram/dispatcher/filters.py b/aiogram/dispatcher/filters.py index c92f3b15..b431ae67 100644 --- a/aiogram/dispatcher/filters.py +++ b/aiogram/dispatcher/filters.py @@ -1,3 +1,4 @@ +import asyncio import inspect import re @@ -46,6 +47,23 @@ class AsyncFilter(Filter): pass +class AnyFilter(AsyncFilter): + def __init__(self, *filters: callable): + self.filters = filters + + async def check(self, *args, **kwargs): + f = (check_filter(filter_, args, kwargs) for filter_ in self.filters) + return any(await asyncio.gather(*f)) + + +class NotFilter(AsyncFilter): + def __init__(self, filter_: callable): + self.filter = filter_ + + async def check(self, *args, **kwargs): + return not await check_filter(self.filter, args, kwargs) + + class CommandsFilter(AsyncFilter): def __init__(self, commands): self.commands = commands @@ -81,7 +99,7 @@ class ContentTypeFilter(Filter): def check(self, message): return ContentType.ANY[0] in self.content_types or \ - message.content_type in self.content_types + message.content_type in self.content_types class CancelFilter(Filter): diff --git a/aiogram/types/chat.py b/aiogram/types/chat.py index 37602d82..deae55b9 100644 --- a/aiogram/types/chat.py +++ b/aiogram/types/chat.py @@ -121,6 +121,62 @@ class ChatType(helper.Helper): SUPER_GROUP = helper.Item() # supergroup CHANNEL = helper.Item() # channel + @staticmethod + def _check(obj, chat_types) -> bool: + if not hasattr(obj, 'chat'): + return False + return obj.chat.type in chat_types + + @classmethod + def is_private(cls, obj) -> bool: + """ + Check chat is private + + :param obj: + :return: + """ + return cls._check(obj, [cls.PRIVATE]) + + @classmethod + def is_group(cls, obj) -> bool: + """ + Check chat is group + + :param obj: + :return: + """ + return cls._check(obj, [cls.GROUP]) + + @classmethod + def is_super_group(cls, obj) -> bool: + """ + Check chat is super-group + + :param obj: + :return: + """ + return cls._check(obj, [cls.SUPER_GROUP]) + + @classmethod + def is_group_or_super_group(cls, obj) -> bool: + """ + Check chat is group or super-group + + :param obj: + :return: + """ + return cls._check(obj, [cls.GROUP, cls.SUPER_GROUP]) + + @classmethod + def is_channel(cls, obj) -> bool: + """ + Check chat is channel + + :param obj: + :return: + """ + return cls._check(obj, [cls.CHANNEL]) + class ChatActions(helper.Helper): """