From ce481a9ebfeee1f6b667a65fc5905dc3f16e4527 Mon Sep 17 00:00:00 2001 From: Oleg A Date: Wed, 30 Jun 2021 14:28:26 +0300 Subject: [PATCH] feat: resolve ChatMember --- aiogram/bot/bot.py | 4 ++-- aiogram/types/chat_member.py | 29 +++++++++++++++++++++++++++++ tests/test_bot.py | 4 ++-- tests/types/test_chat_member.py | 2 +- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/aiogram/bot/bot.py b/aiogram/bot/bot.py index 27c4cb0f..435def3e 100644 --- a/aiogram/bot/bot.py +++ b/aiogram/bot/bot.py @@ -2146,7 +2146,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): payload = generate_payload(**locals()) result = await self.request(api.Methods.GET_CHAT_ADMINISTRATORS, payload) - return [types.ChatMember(**chatmember) for chatmember in result] + return [types.ChatMember.resolve(**chat_member) for chat_member in result] async def get_chat_member_count(self, chat_id: typing.Union[base.Integer, base.String]) -> base.Integer: """ @@ -2184,7 +2184,7 @@ class Bot(BaseBot, DataMixin, ContextInstanceMixin): payload = generate_payload(**locals()) result = await self.request(api.Methods.GET_CHAT_MEMBER, payload) - return types.ChatMember(**result) + return types.ChatMember.resolve(**result) async def set_chat_sticker_set(self, chat_id: typing.Union[base.Integer, base.String], sticker_set_name: base.String) -> base.Boolean: diff --git a/aiogram/types/chat_member.py b/aiogram/types/chat_member.py index 3ffb5e2c..58e4cb62 100644 --- a/aiogram/types/chat_member.py +++ b/aiogram/types/chat_member.py @@ -1,4 +1,5 @@ import datetime +from typing import Optional from . import base, fields from .user import User @@ -32,6 +33,17 @@ class ChatMemberStatus(helper.Helper): def is_chat_member(cls, role: str) -> bool: return role in (cls.MEMBER, cls.ADMINISTRATOR, cls.CREATOR, cls.RESTRICTED) + @classmethod + def get_class_by_status(cls, status: str) -> Optional["ChatMember"]: + return { + cls.OWNER: ChatMemberOwner, + cls.ADMINISTRATOR: ChatMemberAdministrator, + cls.MEMBER: ChatMemberMember, + cls.RESTRICTED: ChatMemberRestricted, + cls.LEFT: ChatMemberLeft, + cls.BANNED: ChatMemberBanned, + }.get(status) + class ChatMember(base.TelegramObject): """ @@ -52,6 +64,23 @@ class ChatMember(base.TelegramObject): def __int__(self) -> int: return self.user.id + @classmethod + def resolve(cls, **kwargs) -> "ChatMember": + status = kwargs.get("status") + mapping = { + ChatMemberStatus.OWNER: ChatMemberOwner, + ChatMemberStatus.ADMINISTRATOR: ChatMemberAdministrator, + ChatMemberStatus.MEMBER: ChatMemberMember, + ChatMemberStatus.RESTRICTED: ChatMemberRestricted, + ChatMemberStatus.LEFT: ChatMemberLeft, + ChatMemberStatus.BANNED: ChatMemberBanned, + } + class_ = mapping.get(status) + if class_ is None: + raise ValueError(f"Can't find `ChatMember` class for status `{status}`") + + return class_(**kwargs) + class ChatMemberOwner(ChatMember): """ diff --git a/tests/test_bot.py b/tests/test_bot.py index bc3a537c..61abe962 100644 --- a/tests/test_bot.py +++ b/tests/test_bot.py @@ -427,7 +427,7 @@ async def test_get_chat_administrators(bot: Bot): """ getChatAdministrators method test """ from .types.dataset import CHAT, CHAT_MEMBER chat = types.Chat(**CHAT) - member = types.ChatMember(**CHAT_MEMBER) + member = types.ChatMember.resolve(**CHAT_MEMBER) async with FakeTelegram(message_data=[CHAT_MEMBER, CHAT_MEMBER]): result = await bot.get_chat_administrators(chat_id=chat.id) @@ -450,7 +450,7 @@ async def test_get_chat_member(bot: Bot): """ getChatMember method test """ from .types.dataset import CHAT, CHAT_MEMBER chat = types.Chat(**CHAT) - member = types.ChatMember(**CHAT_MEMBER) + member = types.ChatMember.resolve(**CHAT_MEMBER) async with FakeTelegram(message_data=CHAT_MEMBER): result = await bot.get_chat_member(chat_id=chat.id, user_id=member.user.id) diff --git a/tests/types/test_chat_member.py b/tests/types/test_chat_member.py index 2cea44ce..2fe3e677 100644 --- a/tests/types/test_chat_member.py +++ b/tests/types/test_chat_member.py @@ -1,7 +1,7 @@ from aiogram import types from .dataset import CHAT_MEMBER -chat_member = types.ChatMember(**CHAT_MEMBER) +chat_member = types.ChatMember.resolve(**CHAT_MEMBER) def test_export():