From 096efba914fb8d798509f38846697f103948265e Mon Sep 17 00:00:00 2001 From: grey-cat-1908 Date: Fri, 27 May 2022 10:17:55 +0300 Subject: [PATCH] feat(GuildMember): new timeout() method --- melisa/models/guild/member.py | 41 ++++++++++++++++++++++++++++---- melisa/models/message/message.py | 13 ++++++---- melisa/rest.py | 9 ++++--- 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/melisa/models/guild/member.py b/melisa/models/guild/member.py index 934c1a9..590f9cd 100644 --- a/melisa/models/guild/member.py +++ b/melisa/models/guild/member.py @@ -3,13 +3,14 @@ from __future__ import annotations +import datetime from dataclasses import dataclass from typing import List, Dict, Optional, Union from melisa.utils.timestamp import Timestamp from melisa.utils.snowflake import Snowflake from melisa.models.user.user import User -from melisa.utils.types import APINullable +from melisa.utils.types import APINullable, UNDEFINED from melisa.utils.api_model import APIModelBase @@ -59,12 +60,12 @@ class GuildMember(APIModelBase): guild_avatar: APINullable[str] = None role_ids: List[Snowflake] = None joined_at: APINullable[Timestamp] = None - premium_since: APINullable[Timestamp] = None + premium_since: APINullable[datetime.datetime] = None is_deaf: bool = None is_mute: bool = None is_pending: APINullable[bool] = None permissions: APINullable[str] = None - communication_disabled_until: APINullable[Timestamp] = None + communication_disabled_until: APINullable[datetime.datetime] = None guild_id: APINullable[Snowflake] = None def make_guild_avatar_url(self, size: int = 1024) -> str: @@ -122,7 +123,37 @@ class GuildMember(APIModelBase): return self async def timeout(self, *, duration: Optional[float] = None, - until: Optional[Timestamp] = None): + until: Optional[datetime.datetime] = None): + """|coro| + + Times out the member from the guild; + until then, the member will not be able to interact with the guild. + + **Required permissions:** ``MODERATE_MEMBERS`` + + duration: Optional[class:`float`] + The duration (seconds) of the member's timeout. Set to ``None`` to remove the timeout. + Supports up to 28 days in the future. + until: Optional[:class:`datetime.datetime`] + The expiry date/time of the member's timeout. Set to ``None`` to remove the timeout. + Supports up to 28 days in the future. """ - """ + if duration is None and until is None: + await self._client.rest.modify_guild_member( + self.guild_id, + self.user.id, + communication_disabled_until=None + ) + elif duration is not None: + await self._client.rest.modify_guild_member( + self.guild_id, + self.user.id, + communication_disabled_until=datetime.datetime.utcnow() + datetime.timedelta(seconds=duration) + ) + else: + await self._client.rest.modify_guild_member( + self.guild_id, + self.user.id, + communication_disabled_until=until + ) diff --git a/melisa/models/message/message.py b/melisa/models/message/message.py index e0f44a6..95b74ff 100644 --- a/melisa/models/message/message.py +++ b/melisa/models/message/message.py @@ -291,15 +291,20 @@ class Message(APIModelBase): """ self: Message = super().__new__(cls) - _member = data.get("member") - - _member.update({"user": data.get("author")}) - self.id = data["id"] self.channel_id = Snowflake(data["channel_id"]) self.guild_id = ( Snowflake(data["guild_id"]) if data.get("guild_id") is not None else None ) + + _member = data.get("member") + + if _member is None: + _member = {} + + _member.update({"user": data.get("author")}) + _member.update({"guild_id": self.guild_id}) + self.author = GuildMember.from_dict(_member) self.content = data.get("content", "") self.timestamp = Timestamp.parse(data["timestamp"]) diff --git a/melisa/rest.py b/melisa/rest.py index 52b86e7..9ce9bc2 100644 --- a/melisa/rest.py +++ b/melisa/rest.py @@ -51,7 +51,8 @@ class RESTApp: self._http: HTTPClient = HTTPClient(token) async def fetch_user(self, user_id: Union[Snowflake, int, str]) -> User: - """ + """|coro| + [**REST API**] Fetch User from the Discord API (by id). Parameters @@ -65,7 +66,8 @@ class RESTApp: return User.from_dict(data) async def fetch_guild(self, guild_id: Union[Snowflake, int, str]) -> Guild: - """ + """|coro| + [**REST API**] Fetch Guild from the Discord API (by id). Parameters @@ -79,7 +81,8 @@ class RESTApp: return Guild.from_dict(data) async def fetch_channel(self, channel_id: Union[Snowflake, str, int]) -> Channel: - """ + """|coro| + [**REST API**] Fetch Channel from the Discord API (by id). Parameters