diff --git a/aiogram/api/types/chat_member.py b/aiogram/api/types/chat_member.py index 58aa7630..593a86fb 100644 --- a/aiogram/api/types/chat_member.py +++ b/aiogram/api/types/chat_member.py @@ -4,6 +4,7 @@ import datetime from typing import TYPE_CHECKING, Optional, Union from .base import TelegramObject +from ...utils import helper if TYPE_CHECKING: # pragma: no cover from .user import User @@ -65,3 +66,25 @@ class ChatMember(TelegramObject): inline bots""" can_add_web_page_previews: Optional[bool] = None """Restricted only. True, if the user is allowed to add web page previews to their messages""" + + @property + def is_chat_admin(self) -> bool: + return self.status in {ChatMemberStatus.CREATOR, ChatMemberStatus.ADMINISTRATOR} + + @property + def is_chat_member(self) -> bool: + return self.status not in {ChatMemberStatus.LEFT, ChatMemberStatus.KICKED} + + +class ChatMemberStatus(helper.Helper): + """ + Chat member status + """ + mode = helper.HelperMode.lowercase + + CREATOR = helper.Item() # creator + ADMINISTRATOR = helper.Item() # administrator + MEMBER = helper.Item() # member + RESTRICTED = helper.Item() # restricted + LEFT = helper.Item() # left + KICKED = helper.Item() # kicked diff --git a/docs/api/types/chat_member.md b/docs/api/types/chat_member.md index 0d374b01..809f8296 100644 --- a/docs/api/types/chat_member.md +++ b/docs/api/types/chat_member.md @@ -30,12 +30,33 @@ This object contains information about one member of a chat. | `can_add_web_page_previews` | `#!python Optional[bool]` | Optional. Restricted only. True, if the user is allowed to add web page previews to their messages | +## Extensions + +| Name | Type | Description | +| - | - | - | +| `is_chat_admin` | `#!python bool` | True if the user is administrator or creator of the chat | +| `is_chat_member` | `#!python bool` | True if the user is member of the chat | + + +## ChatMemberStatus helper + +This object helps to describe user's status. + +#### Attributes: +- CREATOR +- ADMINISTRATOR +- MEMBER +- RESTRICTED +- LEFT +- KICKED + ## Location - `from aiogram.types import ChatMember` - `from aiogram.api.types import ChatMember` - `from aiogram.api.types.chat_member import ChatMember` +- `from aiogram.api.types.chat_member import ChatMemberStatus` ## Related pages: diff --git a/tests/test_api/test_types/test_chat_member.py b/tests/test_api/test_types/test_chat_member.py new file mode 100644 index 00000000..e5706e5e --- /dev/null +++ b/tests/test_api/test_types/test_chat_member.py @@ -0,0 +1,34 @@ +import pytest + +from aiogram.api.types import ChatMember, User + +user = User(id=42, is_bot=False, first_name="User", last_name=None) + + +class TestChatMember: + @pytest.mark.parametrize( + "status,result", + [ + ["administrator", True], + ["creator", True], + ["member", False] + ] + ) + def test_is_chat_admin(self, status: str, result: bool): + chat_member = ChatMember(user=user, status=status) + assert chat_member.is_chat_admin == result + + @pytest.mark.parametrize( + "status,result", + [ + ["administrator", True], + ["creator", True], + ["member", True], + ["restricted", True], + ["kicked", False], + ["left", False] + ] + ) + def test_is_chat_member(self, status: str, result: bool): + chat_member = ChatMember(user=user, status=status) + assert chat_member.is_chat_member == result