diff --git a/aiogram/dispatcher/filters/builtin.py b/aiogram/dispatcher/filters/builtin.py index f3bbdba7..d64fb97a 100644 --- a/aiogram/dispatcher/filters/builtin.py +++ b/aiogram/dispatcher/filters/builtin.py @@ -496,8 +496,8 @@ class ExceptionsFilter(BoundFilter): class IdFilter(Filter): def __init__(self, - user_id: Optional[Union[str, int]] = None, - chat_id: Optional[Union[str, int]] = None, + user_id: Optional[Union[Iterable[Union[int, str]], str, int]] = None, + chat_id: Optional[Union[Iterable[Union[int, str]], str, int]] = None, ): """ :param user_id: @@ -506,17 +506,18 @@ class IdFilter(Filter): if user_id is None and chat_id is None: raise ValueError("Both user_id and chat_id can't be None") - self.user_id = user_id - self.chat_id = chat_id - - # both params should be convertible to int if they aren't None - # here we checks it - # also, by default in Telegram chat_id and user_id are Integer, - # so for convenience we cast them to int - if self.user_id: - self.user_id = int(self.user_id) - if self.chat_id: - self.chat_id = int(self.chat_id) + self.user_id = None + self.chat_id = None + if user_id: + if isinstance(user_id, Iterable): + self.user_id = list(map(int, user_id)) + else: + self.user_id = [int(user_id), ] + if chat_id: + if isinstance(chat_id, Iterable): + self.chat_id = list(map(int, chat_id)) + else: + self.chat_id = [int(chat_id), ] @classmethod def validate(cls, full_config: typing.Dict[str, typing.Any]) -> typing.Optional[typing.Dict[str, typing.Any]]: @@ -550,10 +551,10 @@ class IdFilter(Filter): return False if self.user_id and self.chat_id: - return self.user_id == user_id and self.chat_id == chat_id + return user_id in self.user_id and chat_id in self.chat_id elif self.user_id: - return self.user_id == user_id + return user_id in self.user_id elif self.chat_id: - return self.chat_id == chat_id + return chat_id in self.chat_id return False diff --git a/examples/id-filter-example.py b/examples/id-filter-example.py index 297e23e4..b46ab056 100644 --- a/examples/id-filter-example.py +++ b/examples/id-filter-example.py @@ -42,5 +42,11 @@ async def handler5(msg: types.Message): await bot.send_message(msg.chat.id, "Hello from user= & chat_id=") + +@dp.message_handler(user=[user_id_to_test, 123]) # todo: add second id here +async def handler6(msg: types.Message): + print("Checked with list!") + + if __name__ == '__main__': executor.start_polling(dp)