mirror of
https://github.com/aiogram/aiogram.git
synced 2026-04-08 16:37:47 +00:00
feat: resolve ChatMember
This commit is contained in:
parent
153090457a
commit
ce481a9ebf
4 changed files with 34 additions and 5 deletions
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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():
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue