diff --git a/discord/http.py b/discord/http.py index 3154e67d3..bde7f0c2a 100644 --- a/discord/http.py +++ b/discord/http.py @@ -87,6 +87,7 @@ if TYPE_CHECKING: audit_log, automod, billing, + command, channel, directory, emoji, @@ -1022,6 +1023,17 @@ class HTTPClient: raise HTTPException(response, data) + async def get_preferred_voice_regions(self) -> List[dict]: + async with self.__session.get('https://latency.discord.media/rtc') as resp: + if resp.status == 200: + return await resp.json() + elif resp.status == 404: + raise NotFound(resp, 'rtc regions not found') + elif resp.status == 403: + raise Forbidden(resp, 'cannot retrieve rtc regions') + else: + raise HTTPException(resp, 'failed to get rtc regions') + # State management async def close(self) -> None: @@ -1074,7 +1086,6 @@ class HTTPClient: 'recipients': recipients, } props = ContextProperties.from_new_group_dm() # New Group DM button - return self.request(Route('POST', '/users/@me/channels'), json=payload, context_properties=props) def add_group_recipient(self, channel_id: Snowflake, user_id: Snowflake, nick: Optional[str] = None) -> Response[None]: @@ -1102,14 +1113,12 @@ class HTTPClient: 'recipients': [user_id], } props = ContextProperties.empty() # {} - return self.request(Route('POST', '/users/@me/channels'), json=payload, context_properties=props) def accept_message_request(self, channel_id: Snowflake) -> Response[channel.DMChannel]: payload = { 'consent_status': 2, } - return self.request(Route('PUT', '/channels/{channel_id}/recipients/@me', channel_id=channel_id), json=payload) def decline_message_request(self, channel_id: Snowflake) -> Response[channel.DMChannel]: @@ -1119,14 +1128,12 @@ class HTTPClient: payload = { 'consent_status': 1, } - return self.request(Route('PUT', '/channels/{channel_id}/recipients/@me', channel_id=channel_id), json=payload) def reset_message_request(self, channel_id: Snowflake) -> Response[channel.DMChannel]: payload = { 'consent_status': 0, } - return self.request(Route('PUT', '/channels/{channel_id}/recipients/@me', channel_id=channel_id), json=payload) # Message management @@ -1209,7 +1216,6 @@ class HTTPClient: def delete_read_state(self, channel_id: Snowflake, type: int) -> Response[None]: payload = {'version': 2, 'read_state_type': type} # Read state protocol version 2 - return self.request(Route('DELETE', '/channels/{channel_id}/messages/ack', channel_id=channel_id), json=payload) def delete_message( @@ -1224,14 +1230,17 @@ class HTTPClient: metadata = 'sub-10-seconds' elif difference >= datetime.timedelta(days=14): metadata = 'older-than-two-weeks' - r = Route( - 'DELETE', - '/channels/{channel_id}/messages/{message_id}', - channel_id=channel_id, - message_id=message_id, - metadata=metadata, + + return self.request( + Route( + 'DELETE', + '/channels/{channel_id}/messages/{message_id}', + channel_id=channel_id, + message_id=message_id, + metadata=metadata, + ), + reason=reason, ) - return self.request(r, reason=reason) def edit_message( self, channel_id: Snowflake, message_id: Snowflake, *, params: MultipartParameters @@ -1243,37 +1252,40 @@ class HTTPClient: return self.request(r, json=params.payload) def add_reaction(self, channel_id: Snowflake, message_id: Snowflake, emoji: str) -> Response[None]: - r = Route( - 'PUT', - '/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/@me', - channel_id=channel_id, - message_id=message_id, - emoji=emoji, + return self.request( + Route( + 'PUT', + '/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/@me', + channel_id=channel_id, + message_id=message_id, + emoji=emoji, + ) ) - return self.request(r) def remove_reaction( self, channel_id: Snowflake, message_id: Snowflake, emoji: str, member_id: Snowflake ) -> Response[None]: - r = Route( - 'DELETE', - '/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/{member_id}', - channel_id=channel_id, - message_id=message_id, - member_id=member_id, - emoji=emoji, + return self.request( + Route( + 'DELETE', + '/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/{member_id}', + channel_id=channel_id, + message_id=message_id, + member_id=member_id, + emoji=emoji, + ) ) - return self.request(r) def remove_own_reaction(self, channel_id: Snowflake, message_id: Snowflake, emoji: str) -> Response[None]: - r = Route( - 'DELETE', - '/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/@me', - channel_id=channel_id, - message_id=message_id, - emoji=emoji, + return self.request( + Route( + 'DELETE', + '/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/@me', + channel_id=channel_id, + message_id=message_id, + emoji=emoji, + ) ) - return self.request(r) def get_reaction_users( self, @@ -1283,51 +1295,50 @@ class HTTPClient: limit: int, after: Optional[Snowflake] = None, ) -> Response[List[user.User]]: - r = Route( - 'GET', - '/channels/{channel_id}/messages/{message_id}/reactions/{emoji}', - channel_id=channel_id, - message_id=message_id, - emoji=emoji, - ) params: Dict[str, Any] = { 'limit': limit, } if after: params['after'] = after - return self.request(r, params=params) + return self.request( + Route( + 'GET', + '/channels/{channel_id}/messages/{message_id}/reactions/{emoji}', + channel_id=channel_id, + message_id=message_id, + emoji=emoji, + ), + params=params, + ) def clear_reactions(self, channel_id: Snowflake, message_id: Snowflake) -> Response[None]: - r = Route( - 'DELETE', - '/channels/{channel_id}/messages/{message_id}/reactions', - channel_id=channel_id, - message_id=message_id, + return self.request( + Route( + 'DELETE', + '/channels/{channel_id}/messages/{message_id}/reactions', + channel_id=channel_id, + message_id=message_id, + ) ) - return self.request(r) def clear_single_reaction(self, channel_id: Snowflake, message_id: Snowflake, emoji: str) -> Response[None]: - r = Route( - 'DELETE', - '/channels/{channel_id}/messages/{message_id}/reactions/{emoji}', - channel_id=channel_id, - message_id=message_id, - emoji=emoji, + return self.request( + Route( + 'DELETE', + '/channels/{channel_id}/messages/{message_id}/reactions/{emoji}', + channel_id=channel_id, + message_id=message_id, + emoji=emoji, + ) ) - return self.request(r) async def get_message(self, channel_id: Snowflake, message_id: Snowflake) -> message.Message: data = await self.logs_from(channel_id, 1, around=message_id) + if not data or int(data[0]['id']) != message_id: + raise NotFound(_FakeResponse('Not Found', 404), {'code': 10008, 'message': 'Unknown Message'}) # type: ignore # Faked response - try: - msg = data[0] - except IndexError: - raise NotFound(_FakeResponse('Not Found', 404), 'message not found') # type: ignore # _FakeResponse is not a real response - if int(msg['id']) != message_id: - raise NotFound(_FakeResponse('Not Found', 404), 'message not found') # type: ignore # _FakeResponse is not a real Response - - return msg + return data[0] def get_channel(self, channel_id: Snowflake) -> Response[channel.Channel]: return self.request(Route('GET', '/channels/{channel_id}', channel_id=channel_id)) @@ -1362,31 +1373,36 @@ class HTTPClient: return self.request(Route('GET', '/users/@me/messages/search'), json=payload) def publish_message(self, channel_id: Snowflake, message_id: Snowflake) -> Response[message.Message]: - r = Route( - 'POST', - '/channels/{channel_id}/messages/{message_id}/crosspost', - channel_id=channel_id, - message_id=message_id, + return self.request( + Route( + 'POST', + '/channels/{channel_id}/messages/{message_id}/crosspost', + channel_id=channel_id, + message_id=message_id, + ) ) - return self.request(r) def pin_message(self, channel_id: Snowflake, message_id: Snowflake, reason: Optional[str] = None) -> Response[None]: - r = Route( - 'PUT', - '/channels/{channel_id}/pins/{message_id}', - channel_id=channel_id, - message_id=message_id, + return self.request( + Route( + 'PUT', + '/channels/{channel_id}/pins/{message_id}', + channel_id=channel_id, + message_id=message_id, + ), + reason=reason, ) - return self.request(r, reason=reason) def unpin_message(self, channel_id: Snowflake, message_id: Snowflake, reason: Optional[str] = None) -> Response[None]: - r = Route( - 'DELETE', - '/channels/{channel_id}/pins/{message_id}', - channel_id=channel_id, - message_id=message_id, + return self.request( + Route( + 'DELETE', + '/channels/{channel_id}/pins/{message_id}', + channel_id=channel_id, + message_id=message_id, + ), + reason=reason, ) - return self.request(r, reason=reason) def pins_from(self, channel_id: Snowflake) -> Response[List[message.Message]]: return self.request(Route('GET', '/channels/{channel_id}/pins', channel_id=channel_id)) @@ -1398,7 +1414,6 @@ class HTTPClient: self, channel_id: Snowflake, attachments: List[message.UploadedAttachment] ) -> Response[message.CloudAttachments]: payload = {'files': attachments} - return self.request(Route('POST', '/channels/{channel_id}/attachments', channel_id=channel_id), json=payload) def delete_attachment(self, uploaded_filename: str) -> Response[None]: @@ -1407,8 +1422,9 @@ class HTTPClient: # Member management def kick(self, user_id: Snowflake, guild_id: Snowflake, reason: Optional[str] = None) -> Response[None]: - r = Route('DELETE', '/guilds/{guild_id}/members/{user_id}', guild_id=guild_id, user_id=user_id) - return self.request(r, reason=reason) + return self.request( + Route('DELETE', '/guilds/{guild_id}/members/{user_id}', guild_id=guild_id, user_id=user_id), reason=reason + ) def ban( self, @@ -1417,16 +1433,19 @@ class HTTPClient: delete_message_seconds: int = 86400, # one day reason: Optional[str] = None, ) -> Response[None]: - r = Route('PUT', '/guilds/{guild_id}/bans/{user_id}', guild_id=guild_id, user_id=user_id) payload = { 'delete_message_seconds': delete_message_seconds, } - - return self.request(r, json=payload, reason=reason) + return self.request( + Route('PUT', '/guilds/{guild_id}/bans/{user_id}', guild_id=guild_id, user_id=user_id), + json=payload, + reason=reason, + ) def unban(self, user_id: Snowflake, guild_id: Snowflake, *, reason: Optional[str] = None) -> Response[None]: - r = Route('DELETE', '/guilds/{guild_id}/bans/{user_id}', guild_id=guild_id, user_id=user_id) - return self.request(r, reason=reason) + return self.request( + Route('DELETE', '/guilds/{guild_id}/bans/{user_id}', guild_id=guild_id, user_id=user_id), reason=reason + ) def guild_voice_state( self, @@ -1437,49 +1456,34 @@ class HTTPClient: deafen: Optional[bool] = None, reason: Optional[str] = None, ) -> Response[member.Member]: - r = Route('PATCH', '/guilds/{guild_id}/members/{user_id}', guild_id=guild_id, user_id=user_id) payload = {} if mute is not None: payload['mute'] = mute - if deafen is not None: payload['deaf'] = deafen - return self.request(r, json=payload, reason=reason) + return self.request( + Route('PATCH', '/guilds/{guild_id}/members/{user_id}', guild_id=guild_id, user_id=user_id), + json=payload, + reason=reason, + ) - def edit_my_voice_state(self, guild_id: Snowflake, payload: Dict[str, Any]) -> Response[None]: # TODO: remove payload - r = Route('PATCH', '/guilds/{guild_id}/voice-states/@me', guild_id=guild_id) - return self.request(r, json=payload) + def edit_my_voice_state(self, guild_id: Snowflake, payload: Dict[str, Any]) -> Response[None]: + return self.request(Route('PATCH', '/guilds/{guild_id}/voice-states/@me', guild_id=guild_id), json=payload) - def edit_voice_state( - self, guild_id: Snowflake, user_id: Snowflake, payload: Dict[str, Any] - ) -> Response[None]: # TODO: remove payload - r = Route('PATCH', '/guilds/{guild_id}/voice-states/{user_id}', guild_id=guild_id, user_id=user_id) - return self.request(r, json=payload) + def edit_voice_state(self, guild_id: Snowflake, user_id: Snowflake, payload: Dict[str, Any]) -> Response[None]: + return self.request( + Route('PATCH', '/guilds/{guild_id}/voice-states/{user_id}', guild_id=guild_id, user_id=user_id), json=payload + ) def edit_me( self, guild_id: Snowflake, *, - nick: Optional[str] = MISSING, - avatar: Optional[bytes] = MISSING, reason: Optional[str] = None, + **fields: Any, ) -> Response[member.MemberWithUser]: - payload = {} - if nick is not MISSING: - payload['nick'] = nick - if avatar is not MISSING: - r = Route('PATCH', '/guilds/{guild_id}/members/@me', guild_id=guild_id) - payload['avatar'] = avatar - else: - r = choice( - ( - Route('PATCH', '/guilds/{guild_id}/members/@me/nick', guild_id=guild_id), - Route('PATCH', '/guilds/{guild_id}/members/@me', guild_id=guild_id), - ) - ) - - return self.request(r, json=payload, reason=reason) + return self.request(Route('PATCH', '/guilds/{guild_id}/members/@me', guild_id=guild_id), json=fields, reason=reason) def edit_member( self, @@ -1487,10 +1491,13 @@ class HTTPClient: user_id: Snowflake, *, reason: Optional[str] = None, - **fields: Any, # TODO: Is this cheating + **fields: Any, ) -> Response[member.MemberWithUser]: - r = Route('PATCH', '/guilds/{guild_id}/members/{user_id}', guild_id=guild_id, user_id=user_id) - return self.request(r, json=fields, reason=reason) + return self.request( + Route('PATCH', '/guilds/{guild_id}/members/{user_id}', guild_id=guild_id, user_id=user_id), + json=fields, + reason=reason, + ) # Channel management @@ -1499,40 +1506,9 @@ class HTTPClient: channel_id: Snowflake, *, reason: Optional[str] = None, - **options: Any, # TODO: Is this cheating + **fields: Any, ) -> Response[channel.Channel]: - r = Route('PATCH', '/channels/{channel_id}', channel_id=channel_id) - valid_keys = ( # TODO: Why is this being validated? - 'name', - 'parent_id', - 'topic', - 'bitrate', - 'nsfw', - 'user_limit', - 'position', - 'permission_overwrites', - 'rate_limit_per_user', - 'type', - 'rtc_region', - 'video_quality_mode', - 'archived', - 'auto_archive_duration', - 'locked', - 'invitable', - 'default_auto_archive_duration', - 'flags', - 'icon', - 'owner', - 'default_thread_rate_limit_per_user', - 'default_reaction_emoji', - 'available_tags', - 'applied_tags', - 'default_forum_layout', - 'default_sort_order', - ) - - payload = {k: v for k, v in options.items() if k in valid_keys} - return self.request(r, reason=reason, json=payload) + return self.request(Route('PATCH', '/channels/{channel_id}', channel_id=channel_id), reason=reason, json=fields) def bulk_channel_update( self, @@ -1541,8 +1517,7 @@ class HTTPClient: *, reason: Optional[str] = None, ) -> Response[None]: - r = Route('PATCH', '/guilds/{guild_id}/channels', guild_id=guild_id) - return self.request(r, json=data, reason=reason) + return self.request(Route('PATCH', '/guilds/{guild_id}/channels', guild_id=guild_id), json=data, reason=reason) def create_channel( self, @@ -1550,32 +1525,12 @@ class HTTPClient: channel_type: channel.ChannelType, *, reason: Optional[str] = None, - **options: Any, # TODO: Is this cheating + **fields: Any, ) -> Response[channel.GuildChannel]: - payload = { # TODO: WTF is happening here?? + payload = { 'type': channel_type, + **fields, } - valid_keys = ( - 'name', - 'parent_id', - 'topic', - 'bitrate', - 'nsfw', - 'user_limit', - 'position', - 'permission_overwrites', - 'rate_limit_per_user', - 'rtc_region', - 'video_quality_mode', - 'default_auto_archive_duration', - 'default_thread_rate_limit_per_user', - 'default_sort_order', - 'default_reaction_emoji', - 'default_forum_layout', - 'available_tags', - ) - payload.update({k: v for k, v in options.items() if k in valid_keys and v is not None}) - return self.request(Route('POST', '/guilds/{guild_id}/channels', guild_id=guild_id), json=payload, reason=reason) def delete_channel( @@ -1694,9 +1649,6 @@ class HTTPClient: location: str = MISSING, reason: Optional[str] = None, ) -> Response[threads.Thread]: - route = Route( - 'POST', '/channels/{channel_id}/messages/{message_id}/threads', channel_id=channel_id, message_id=message_id - ) payload = { 'name': name, 'location': location if location is not MISSING else choice(('Message', 'Reply Chain Nudge')), @@ -1706,7 +1658,13 @@ class HTTPClient: if rate_limit_per_user is not None: payload['rate_limit_per_user'] = rate_limit_per_user - return self.request(route, json=payload, reason=reason) + return self.request( + Route( + 'POST', '/channels/{channel_id}/messages/{message_id}/threads', channel_id=channel_id, message_id=message_id + ), + json=payload, + reason=reason, + ) def start_thread_without_message( self, @@ -1719,7 +1677,6 @@ class HTTPClient: rate_limit_per_user: Optional[int] = None, reason: Optional[str] = None, ) -> Response[threads.Thread]: - r = Route('POST', '/channels/{channel_id}/threads', channel_id=channel_id) payload = { 'auto_archive_duration': auto_archive_duration, 'location': choice(('Plus Button', 'Thread Browser Toolbar')), @@ -1731,7 +1688,9 @@ class HTTPClient: if rate_limit_per_user is not None: payload['rate_limit_per_user'] = rate_limit_per_user - return self.request(r, json=payload, reason=reason) + return self.request( + Route('POST', '/channels/{channel_id}/threads', channel_id=channel_id), json=payload, reason=reason + ) def start_thread_in_forum( self, @@ -1748,63 +1707,65 @@ class HTTPClient: return self.request(r, json=params.payload, params=query, reason=reason) def join_thread(self, channel_id: Snowflake) -> Response[None]: - r = Route('POST', '/channels/{channel_id}/thread-members/@me', channel_id=channel_id) params = {'location': choice(('Banner', 'Toolbar Overflow', 'Sidebar Overflow', 'Context Menu'))} + return self.request(Route('POST', '/channels/{channel_id}/thread-members/@me', channel_id=channel_id), params=params) - return self.request(r, params=params) - - def add_user_to_thread( - self, channel_id: Snowflake, user_id: Snowflake - ) -> Response[None]: # TODO: Find a way to test private thread stuff - r = Route('PUT', '/channels/{channel_id}/thread-members/{user_id}', channel_id=channel_id, user_id=user_id) - return self.request(r) + def add_user_to_thread(self, channel_id: Snowflake, user_id: Snowflake) -> Response[None]: + return self.request( + Route('PUT', '/channels/{channel_id}/thread-members/{user_id}', channel_id=channel_id, user_id=user_id) + ) def leave_thread(self, channel_id: Snowflake) -> Response[None]: - r = Route('DELETE', '/channels/{channel_id}/thread-members/@me', channel_id=channel_id) params = {'location': choice(('Toolbar Overflow', 'Context Menu', 'Sidebar Overflow'))} - - return self.request(r, params=params) + return self.request( + Route('DELETE', '/channels/{channel_id}/thread-members/@me', channel_id=channel_id), params=params + ) def remove_user_from_thread(self, channel_id: Snowflake, user_id: Snowflake) -> Response[None]: - r = Route('DELETE', '/channels/{channel_id}/thread-members/{user_id}', channel_id=channel_id, user_id=user_id) params = {'location': 'Context Menu'} - - return self.request(r, params=params) + return self.request( + Route('DELETE', '/channels/{channel_id}/thread-members/{user_id}', channel_id=channel_id, user_id=user_id), + params=params, + ) def get_public_archived_threads( self, channel_id: Snowflake, before: Optional[Snowflake] = None, limit: int = 50 ) -> Response[threads.ThreadPaginationPayload]: - route = Route('GET', '/channels/{channel_id}/threads/archived/public', channel_id=channel_id) - params = {} if before: params['before'] = before if limit and limit != 50: params['limit'] = limit - return self.request(route, params=params) + + return self.request( + Route('GET', '/channels/{channel_id}/threads/archived/public', channel_id=channel_id), params=params + ) def get_private_archived_threads( self, channel_id: Snowflake, before: Optional[Snowflake] = None, limit: int = 50 ) -> Response[threads.ThreadPaginationPayload]: - route = Route('GET', '/channels/{channel_id}/threads/archived/private', channel_id=channel_id) - params = {} if before: params['before'] = before if limit and limit != 50: params['limit'] = limit - return self.request(route, params=params) + + return self.request( + Route('GET', '/channels/{channel_id}/threads/archived/private', channel_id=channel_id), params=params + ) def get_joined_private_archived_threads( self, channel_id: Snowflake, before: Optional[Snowflake] = None, limit: int = 50 ) -> Response[threads.ThreadPaginationPayload]: - route = Route('GET', '/channels/{channel_id}/users/@me/threads/archived/private', channel_id=channel_id) params = {} if before: params['before'] = before if limit and limit != 50: params['limit'] = limit - return self.request(route, params=params) + + return self.request( + Route('GET', '/channels/{channel_id}/users/@me/threads/archived/private', channel_id=channel_id), params=params + ) def create_forum_tag( self, @@ -1839,13 +1800,12 @@ class HTTPClient: moderated: bool = False, reason: Optional[str] = None, ) -> Response[channel.ForumChannel]: - payload: Dict[str, Any] = { + payload = { 'name': name, 'emoji_id': emoji_id, 'emoji_name': emoji_name, 'moderated': moderated, } - return self.request( Route('PUT', '/channels/{channel_id}/tags/{tag_id}', channel_id=channel_id, tag_id=tag_id), json=payload, @@ -1871,8 +1831,9 @@ class HTTPClient: if avatar is not None: payload['avatar'] = avatar - r = Route('POST', '/channels/{channel_id}/webhooks', channel_id=channel_id) - return self.request(r, json=payload, reason=reason) + return self.request( + Route('POST', '/channels/{channel_id}/webhooks', channel_id=channel_id), json=payload, reason=reason + ) def channel_webhooks(self, channel_id: Snowflake) -> Response[List[webhook.Webhook]]: return self.request(Route('GET', '/channels/{channel_id}/webhooks', channel_id=channel_id)) @@ -1889,12 +1850,12 @@ class HTTPClient: webhook_channel_id: Snowflake, reason: Optional[str] = None, ) -> Response[None]: - r = Route('POST', '/channels/{channel_id}/followers', channel_id=channel_id) payload = { 'webhook_channel_id': str(webhook_channel_id), } - - return self.request(r, json=payload, reason=reason) + return self.request( + Route('POST', '/channels/{channel_id}/followers', channel_id=channel_id), json=payload, reason=reason + ) # Guild management @@ -1930,10 +1891,8 @@ class HTTPClient: ) def leave_guild(self, guild_id: Snowflake, lurking: bool = False) -> Response[None]: - r = Route('DELETE', '/users/@me/guilds/{guild_id}', guild_id=guild_id) payload = {'lurking': lurking} - - return self.request(r, json=payload) + return self.request(Route('DELETE', '/users/@me/guilds/{guild_id}', guild_id=guild_id), json=payload) def get_guild(self, guild_id: Snowflake, with_counts: bool = True) -> Response[guild.Guild]: params = {'with_counts': str(with_counts).lower()} @@ -1955,40 +1914,15 @@ class HTTPClient: 'channels': [], 'guild_template_code': template, # API go brrr } - return self.request(Route('POST', '/guilds'), json=payload) def edit_guild(self, guild_id: Snowflake, *, reason: Optional[str] = None, **fields: Any) -> Response[guild.Guild]: - valid_keys = ( # TODO: is this necessary? - 'name', - 'icon', - 'afk_timeout', - 'owner_id', - 'afk_channel_id', - 'splash', - 'discovery_splash', - 'features', - 'verification_level', - 'system_channel_id', - 'default_message_notifications', - 'description', - 'explicit_content_filter', - 'banner', - 'system_channel_flags', - 'rules_channel_id', - 'public_updates_channel_id', - 'preferred_locale', - 'premium_progress_bar_enabled', - ) - payload = {k: v for k, v in fields.items() if k in valid_keys} - - return self.request(Route('PATCH', '/guilds/{guild_id}', guild_id=guild_id), json=payload, reason=reason) + return self.request(Route('PATCH', '/guilds/{guild_id}', guild_id=guild_id), json=fields, reason=reason) def edit_guild_mfa_level( self, guild_id: Snowflake, *, mfa_level: int, reason: Optional[str] = None ) -> Response[guild.GuildMFALevel]: payload = {'level': mfa_level} - return self.request(Route('POST', '/guilds/{guild_id}/mfa', guild_id=guild_id), json=payload, reason=reason) def edit_guild_settings(self, guild_id: Snowflake, fields): # TODO: type @@ -2007,12 +1941,6 @@ class HTTPClient: return self.request(Route('PUT', '/guilds/{guild_id}/templates/{code}', guild_id=guild_id, code=code)) def edit_template(self, guild_id: Snowflake, code: str, payload: Dict[str, Any]) -> Response[template.Template]: - valid_keys = ( - 'name', - 'description', - ) - payload = {k: v for k, v in payload.items() if k in valid_keys} - return self.request( Route('PATCH', '/guilds/{guild_id}/templates/{code}', guild_id=guild_id, code=code), json=payload ) @@ -2025,7 +1953,6 @@ class HTTPClient: 'name': name, 'icon': icon, } - return self.request(Route('POST', '/guilds/templates/{code}', code=code), json=payload) def get_bans( @@ -2053,7 +1980,6 @@ class HTTPClient: def change_vanity_code(self, guild_id: Snowflake, code: str, *, reason: Optional[str] = None) -> Response[None]: payload = {'code': code} - return self.request(Route('PATCH', '/guilds/{guild_id}/vanity-url', guild_id=guild_id), json=payload, reason=reason) def get_all_guild_channels(self, guild_id: Snowflake) -> Response[List[guild.GuildChannel]]: @@ -2148,7 +2074,6 @@ class HTTPClient: 'content_type': mime_type, } ] - for k, v in payload.items(): form.append( { @@ -2208,8 +2133,7 @@ class HTTPClient: if roles: payload['roles'] = roles - r = Route('POST', '/guilds/{guild_id}/emojis', guild_id=guild_id) - return self.request(r, json=payload, reason=reason) + return self.request(Route('POST', '/guilds/{guild_id}/emojis', guild_id=guild_id), json=payload, reason=reason) def delete_custom_emoji( self, @@ -2218,19 +2142,23 @@ class HTTPClient: *, reason: Optional[str] = None, ) -> Response[None]: - r = Route('DELETE', '/guilds/{guild_id}/emojis/{emoji_id}', guild_id=guild_id, emoji_id=emoji_id) - return self.request(r, reason=reason) + return self.request( + Route('DELETE', '/guilds/{guild_id}/emojis/{emoji_id}', guild_id=guild_id, emoji_id=emoji_id), reason=reason + ) def edit_custom_emoji( self, guild_id: Snowflake, emoji_id: Snowflake, *, - payload: Dict[str, Any], # TODO: Is this cheating? + payload: Dict[str, Any], reason: Optional[str] = None, ) -> Response[emoji.Emoji]: - r = Route('PATCH', '/guilds/{guild_id}/emojis/{emoji_id}', guild_id=guild_id, emoji_id=emoji_id) - return self.request(r, json=payload, reason=reason) + return self.request( + Route('PATCH', '/guilds/{guild_id}/emojis/{emoji_id}', guild_id=guild_id, emoji_id=emoji_id), + json=payload, + reason=reason, + ) def get_member_verification( self, guild_id: Snowflake, *, with_guild: bool = False, invite: str = MISSING @@ -2244,9 +2172,9 @@ class HTTPClient: return self.request(Route('GET', '/guilds/{guild_id}/member-verification', guild_id=guild_id), params=params) def accept_member_verification( - self, guild_id: Snowflake, **payload + self, guild_id: Snowflake, **fields ) -> Response[None]: # payload is the same as the above return type - return self.request(Route('PUT', '/guilds/{guild_id}/requests/@me', guild_id=guild_id), json=payload) + return self.request(Route('PUT', '/guilds/{guild_id}/requests/@me', guild_id=guild_id), json=fields) def get_all_integrations( self, @@ -2273,15 +2201,14 @@ class HTTPClient: 'type': type, 'id': id, } - return self.request(Route('POST', '/guilds/{guild_id}/integrations', guild_id=guild_id), json=payload, reason=reason) - def edit_integration(self, guild_id: Snowflake, integration_id: Snowflake, **payload: Any) -> Response[None]: + def edit_integration(self, guild_id: Snowflake, integration_id: Snowflake, **fields: Any) -> Response[None]: return self.request( Route( 'PATCH', '/guilds/{guild_id}/integrations/{integration_id}', guild_id=guild_id, integration_id=integration_id ), - json=payload, + json=fields, ) def sync_integration(self, guild_id: Snowflake, integration_id: Snowflake) -> Response[None]: @@ -2297,10 +2224,15 @@ class HTTPClient: def delete_integration( self, guild_id: Snowflake, integration_id: Snowflake, *, reason: Optional[str] = None ) -> Response[None]: - r = Route( - 'DELETE', '/guilds/{guild_id}/integrations/{integration_id}', guild_id=guild_id, integration_id=integration_id + return self.request( + Route( + 'DELETE', + '/guilds/{guild_id}/integrations/{integration_id}', + guild_id=guild_id, + integration_id=integration_id, + ), + reason=reason, ) - return self.request(r, reason=reason) def get_audit_logs( self, @@ -2311,7 +2243,6 @@ class HTTPClient: user_id: Optional[Snowflake] = None, action_type: Optional[audit_log.AuditLogEvent] = None, ) -> Response[audit_log.AuditLog]: - r = Route('GET', '/guilds/{guild_id}/audit-logs', guild_id=guild_id) params: Dict[str, Any] = {'limit': limit} if before: params['before'] = before @@ -2322,7 +2253,7 @@ class HTTPClient: if action_type: params['action_type'] = action_type - return self.request(r, params=params) + return self.request(Route('GET', '/guilds/{guild_id}/audit-logs', guild_id=guild_id), params=params) def get_widget(self, guild_id: Snowflake) -> Response[widget.Widget]: return self.request(Route('GET', '/guilds/{guild_id}/widget.json', guild_id=guild_id)) @@ -2354,7 +2285,7 @@ class HTTPClient: channel_id: Snowflake = MISSING, channel_type: ChannelType = MISSING, message: Optional[Message] = None, - ): # TODO: response type + ) -> Response[invite.PartialInvite]: if message: # Invite Button Embed props = ContextProperties.from_invite_button_embed( guild_id=getattr(message.guild, 'id', None), @@ -2402,7 +2333,6 @@ class HTTPClient: 'temporary': temporary, 'flags': flags, } - if unique: payload['unique'] = unique if target_user_id: @@ -2428,7 +2358,6 @@ class HTTPClient: 'max_age': max_age, } props = ContextProperties.from_group_dm_invite_create() - return self.request( Route('POST', '/channels/{channel_id}/invites', channel_id=channel_id), json=payload, context_properties=props ) @@ -2478,14 +2407,16 @@ class HTTPClient: def edit_role( self, guild_id: Snowflake, role_id: Snowflake, *, reason: Optional[str] = None, **fields: Any ) -> Response[role.Role]: - r = Route('PATCH', '/guilds/{guild_id}/roles/{role_id}', guild_id=guild_id, role_id=role_id) - valid_keys = ('name', 'permissions', 'color', 'hoist', 'icon', 'unicode_emoji', 'mentionable') - payload = {k: v for k, v in fields.items() if k in valid_keys} - return self.request(r, json=payload, reason=reason) + return self.request( + Route('PATCH', '/guilds/{guild_id}/roles/{role_id}', guild_id=guild_id, role_id=role_id), + json=fields, + reason=reason, + ) def delete_role(self, guild_id: Snowflake, role_id: Snowflake, *, reason: Optional[str] = None) -> Response[None]: - r = Route('DELETE', '/guilds/{guild_id}/roles/{role_id}', guild_id=guild_id, role_id=role_id) - return self.request(r, reason=reason) + return self.request( + Route('DELETE', '/guilds/{guild_id}/roles/{role_id}', guild_id=guild_id, role_id=role_id), reason=reason + ) def replace_roles( self, @@ -2498,8 +2429,7 @@ class HTTPClient: return self.edit_member(guild_id=guild_id, user_id=user_id, roles=role_ids, reason=reason) def create_role(self, guild_id: Snowflake, *, reason: Optional[str] = None, **fields: Any) -> Response[role.Role]: - r = Route('POST', '/guilds/{guild_id}/roles', guild_id=guild_id) - return self.request(r, json=fields, reason=reason) + return self.request(Route('POST', '/guilds/{guild_id}/roles', guild_id=guild_id), json=fields, reason=reason) def move_role_position( self, @@ -2508,32 +2438,35 @@ class HTTPClient: *, reason: Optional[str] = None, ) -> Response[List[role.Role]]: - r = Route('PATCH', '/guilds/{guild_id}/roles', guild_id=guild_id) - return self.request(r, json=positions, reason=reason) + return self.request(Route('PATCH', '/guilds/{guild_id}/roles', guild_id=guild_id), json=positions, reason=reason) def add_role( self, guild_id: Snowflake, user_id: Snowflake, role_id: Snowflake, *, reason: Optional[str] = None ) -> Response[None]: - r = Route( - 'PUT', - '/guilds/{guild_id}/members/{user_id}/roles/{role_id}', - guild_id=guild_id, - user_id=user_id, - role_id=role_id, + return self.request( + Route( + 'PUT', + '/guilds/{guild_id}/members/{user_id}/roles/{role_id}', + guild_id=guild_id, + user_id=user_id, + role_id=role_id, + ), + reason=reason, ) - return self.request(r, reason=reason) def remove_role( self, guild_id: Snowflake, user_id: Snowflake, role_id: Snowflake, *, reason: Optional[str] = None ) -> Response[None]: - r = Route( - 'DELETE', - '/guilds/{guild_id}/members/{user_id}/roles/{role_id}', - guild_id=guild_id, - user_id=user_id, - role_id=role_id, + return self.request( + Route( + 'DELETE', + '/guilds/{guild_id}/members/{user_id}/roles/{role_id}', + guild_id=guild_id, + user_id=user_id, + role_id=role_id, + ), + reason=reason, ) - return self.request(r, reason=reason) def get_role_members(self, guild_id: Snowflake, role_id: Snowflake) -> Response[List[Snowflake]]: return self.request( @@ -2544,7 +2477,6 @@ class HTTPClient: self, guild_id: Snowflake, role_id: Snowflake, member_ids: Sequence[Snowflake], *, reason: Optional[str] ) -> Response[Dict[Snowflake, member.MemberWithUser]]: payload = {'member_ids': member_ids} - return self.request( Route('PATCH', '/guilds/{guild_id}/roles/{role_id}/members', guild_id=guild_id, role_id=role_id), json=payload, @@ -2565,14 +2497,19 @@ class HTTPClient: reason: Optional[str] = None, ) -> Response[None]: payload = {'id': target, 'allow': allow, 'deny': deny, 'type': type} - r = Route('PUT', '/channels/{channel_id}/permissions/{target}', channel_id=channel_id, target=target) - return self.request(r, json=payload, reason=reason) + return self.request( + Route('PUT', '/channels/{channel_id}/permissions/{target}', channel_id=channel_id, target=target), + json=payload, + reason=reason, + ) def delete_channel_permissions( self, channel_id: Snowflake, target: Snowflake, *, reason: Optional[str] = None ) -> Response[None]: - r = Route('DELETE', '/channels/{channel_id}/permissions/{target}', channel_id=channel_id, target=target) - return self.request(r, reason=reason) + return self.request( + Route('DELETE', '/channels/{channel_id}/permissions/{target}', channel_id=channel_id, target=target), + reason=reason, + ) # Voice management @@ -2584,53 +2521,35 @@ class HTTPClient: *, reason: Optional[str] = None, ) -> Response[member.MemberWithUser]: - return self.edit_member(guild_id=guild_id, user_id=user_id, channel_id=channel_id, reason=reason) + return self.edit_member(guild_id, user_id, channel_id=channel_id, reason=reason) def get_ringability(self, channel_id: Snowflake): return self.request(Route('GET', '/channels/{channel_id}/call', channel_id=channel_id)) def ring(self, channel_id: Snowflake, *recipients: Snowflake) -> Response[None]: payload = {'recipients': recipients or None} - return self.request(Route('POST', '/channels/{channel_id}/call/ring', channel_id=channel_id), json=payload) def stop_ringing(self, channel_id: Snowflake, *recipients: Snowflake) -> Response[None]: - r = Route('POST', '/channels/{channel_id}/call/stop-ringing', channel_id=channel_id) payload = {'recipients': recipients} - - return self.request(r, json=payload) + return self.request(Route('POST', '/channels/{channel_id}/call/stop-ringing', channel_id=channel_id), json=payload) def change_call_voice_region(self, channel_id: int, voice_region: str): # TODO: return type payload = {'region': voice_region} - return self.request(Route('PATCH', '/channels/{channel_id}/call', channel_id=channel_id), json=payload) # Stage instance management - # TODO: Check all :( def get_stage_instance(self, channel_id: Snowflake) -> Response[channel.StageInstance]: return self.request(Route('GET', '/stage-instances/{channel_id}', channel_id=channel_id)) - def create_stage_instance(self, *, reason: Optional[str], **payload: Any) -> Response[channel.StageInstance]: - valid_keys = ( - 'channel_id', - 'topic', - 'privacy_level', - 'send_start_notification', - ) - payload = {k: v for k, v in payload.items() if k in valid_keys} - - return self.request(Route('POST', '/stage-instances'), json=payload, reason=reason) + def create_stage_instance(self, *, reason: Optional[str], **fields: Any) -> Response[channel.StageInstance]: + return self.request(Route('POST', '/stage-instances'), json=fields, reason=reason) - def edit_stage_instance(self, channel_id: Snowflake, *, reason: Optional[str] = None, **payload: Any) -> Response[None]: - r = Route('PATCH', '/stage-instances/{channel_id}', channel_id=channel_id) - valid_keys = ( - 'topic', - 'privacy_level', + def edit_stage_instance(self, channel_id: Snowflake, *, reason: Optional[str] = None, **fields: Any) -> Response[None]: + return self.request( + Route('PATCH', '/stage-instances/{channel_id}', channel_id=channel_id), json=fields, reason=reason ) - payload = {k: v for k, v in payload.items() if k in valid_keys} - - return self.request(r, json=payload, reason=reason) def delete_stage_instance(self, channel_id: Snowflake, *, reason: Optional[str] = None) -> Response[None]: return self.request(Route('DELETE', '/stage-instances/{channel_id}', channel_id=channel_id), reason=reason) @@ -2668,23 +2587,10 @@ class HTTPClient: return self.request(Route('GET', '/users/@me/scheduled-events'), params=params) def create_guild_scheduled_event( - self, guild_id: Snowflake, *, reason: Optional[str] = None, **payload: Any + self, guild_id: Snowflake, *, reason: Optional[str] = None, **fields: Any ) -> Response[scheduled_event.GuildScheduledEvent]: - valid_keys = ( - 'channel_id', - 'entity_metadata', - 'name', - 'privacy_level', - 'scheduled_start_time', - 'scheduled_end_time', - 'description', - 'entity_type', - 'image', - ) - payload = {k: v for k, v in payload.items() if k in valid_keys} - return self.request( - Route('POST', '/guilds/{guild_id}/scheduled-events', guild_id=guild_id), json=payload, reason=reason + Route('POST', '/guilds/{guild_id}/scheduled-events', guild_id=guild_id), json=fields, reason=reason ) @overload @@ -2720,22 +2626,8 @@ class HTTPClient: ) def edit_scheduled_event( - self, guild_id: Snowflake, guild_scheduled_event_id: Snowflake, *, reason: Optional[str] = None, **payload: Any + self, guild_id: Snowflake, guild_scheduled_event_id: Snowflake, *, reason: Optional[str] = None, **fields: Any ) -> Response[scheduled_event.GuildScheduledEvent]: - valid_keys = ( - 'channel_id', - 'entity_metadata', - 'name', - 'privacy_level', - 'scheduled_start_time', - 'scheduled_end_time', - 'status', - 'description', - 'entity_type', - 'image', - ) - payload = {k: v for k, v in payload.items() if k in valid_keys} - return self.request( Route( 'PATCH', @@ -2743,7 +2635,7 @@ class HTTPClient: guild_id=guild_id, guild_scheduled_event_id=guild_scheduled_event_id, ), - json=payload, + json=fields, reason=reason, ) @@ -2867,43 +2759,18 @@ class HTTPClient: ) def create_auto_moderation_rule( - self, guild_id: Snowflake, *, reason: Optional[str], **payload: Any + self, guild_id: Snowflake, *, reason: Optional[str], **fields: Any ) -> Response[automod.AutoModerationRule]: - valid_keys = ( - 'name', - 'event_type', - 'trigger_type', - 'trigger_metadata', - 'actions', - 'enabled', - 'exempt_roles', - 'exempt_channels', - ) - - payload = {k: v for k, v in payload.items() if k in valid_keys and v is not None} - return self.request( - Route('POST', '/guilds/{guild_id}/auto-moderation/rules', guild_id=guild_id), json=payload, reason=reason + Route('POST', '/guilds/{guild_id}/auto-moderation/rules', guild_id=guild_id), json=fields, reason=reason ) def edit_auto_moderation_rule( - self, guild_id: Snowflake, rule_id: Snowflake, *, reason: Optional[str], **payload: Any + self, guild_id: Snowflake, rule_id: Snowflake, *, reason: Optional[str], **fields: Any ) -> Response[automod.AutoModerationRule]: - valid_keys = ( - 'name', - 'event_type', - 'trigger_metadata', - 'actions', - 'enabled', - 'exempt_roles', - 'exempt_channels', - ) - - payload = {k: v for k, v in payload.items() if k in valid_keys and v is not None} - return self.request( Route('PATCH', '/guilds/{guild_id}/auto-moderation/rules/{rule_id}', guild_id=guild_id, rule_id=rule_id), - json=payload, + json=fields, reason=reason, ) @@ -2962,7 +2829,6 @@ class HTTPClient: def add_relationship( self, user_id: Snowflake, type: Optional[int] = None, *, action: RelationshipAction ) -> Response[None]: - r = Route('PUT', '/users/@me/relationships/{user_id}', user_id=user_id) payload = {} if type is not None: payload['type'] = type @@ -2998,17 +2864,15 @@ class HTTPClient: else: props = ContextProperties.empty() - return self.request(r, context_properties=props, json=payload) + return self.request(Route('PUT', '/users/@me/relationships/{user_id}', user_id=user_id), context_properties=props, json=payload) def send_friend_request(self, username: str, discriminator: Snowflake) -> Response[None]: - r = Route('POST', '/users/@me/relationships') - props = choice((ContextProperties.from_add_friend, ContextProperties.from_group_dm))() # Friends, Group DM payload = {'username': username, 'discriminator': int(discriminator) or None} + props = choice((ContextProperties.from_add_friend, ContextProperties.from_group_dm))() # Friends, Group DM + return self.request(Route('POST', '/users/@me/relationships'), json=payload, context_properties=props) - return self.request(r, json=payload, context_properties=props) - - def edit_relationship(self, user_id: Snowflake, **payload) -> Response[None]: - return self.request(Route('PATCH', '/users/@me/relationships/{user_id}', user_id=user_id), json=payload) + def edit_relationship(self, user_id: Snowflake, **fields) -> Response[None]: + return self.request(Route('PATCH', '/users/@me/relationships/{user_id}', user_id=user_id), json=fields) def get_friend_suggestions(self) -> Response[List[user.FriendSuggestion]]: return self.request(Route('GET', '/friend-suggestions')) @@ -3021,11 +2885,11 @@ class HTTPClient: def get_connections(self) -> Response[List[user.Connection]]: return self.request(Route('GET', '/users/@me/connections')) - def edit_connection(self, type: str, id: str, **payload) -> Response[user.Connection]: - return self.request(Route('PATCH', '/users/@me/connections/{type}/{id}', type=type, id=id), json=payload) + def edit_connection(self, type: str, id: str, **fields) -> Response[user.Connection]: + return self.request(Route('PATCH', '/users/@me/connections/{type}/{id}', type=type, id=id), json=fields) - def refresh_connection(self, type: str, id: str, **payload) -> Response[None]: - return self.request(Route('POST', '/users/@me/connections/{type}/{id}/refresh', type=type, id=id), json=payload) + def refresh_connection(self, type: str, id: str, **fields) -> Response[None]: + return self.request(Route('POST', '/users/@me/connections/{type}/{id}/refresh', type=type, id=id), json=fields) def delete_connection(self, type: str, id: str) -> Response[None]: return self.request(Route('DELETE', '/users/@me/connections/{type}/{id}', type=type, id=id)) @@ -3049,6 +2913,7 @@ class HTTPClient: params['two_way_user_code'] = two_way_user_code if continuation: params['continuation'] = 'true' + return self.request(Route('GET', '/connections/{type}/authorize', type=type), params=params) def add_connection( @@ -3074,7 +2939,6 @@ class HTTPClient: def get_my_applications(self, *, with_team_applications: bool = True) -> Response[List[application.Application]]: params = {'with_team_applications': str(with_team_applications).lower()} - return self.request(Route('GET', '/applications'), params=params) def get_my_application(self, app_id: Snowflake) -> Response[application.Application]: @@ -3090,7 +2954,6 @@ class HTTPClient: def transfer_application(self, app_id: Snowflake, team_id: Snowflake) -> Response[application.Application]: payload = {'team_id': team_id} - return self.request( Route('POST', '/applications/{app_id}/transfer', app_id=app_id), json=payload, super_properties_to_track=True ) @@ -3109,7 +2972,6 @@ class HTTPClient: def create_app(self, name: str, team_id: Optional[Snowflake] = None) -> Response[application.Application]: payload = {'name': name, team_id: team_id} - return self.request(Route('POST', '/applications'), json=payload) def get_app_entitlements( @@ -3297,7 +3159,6 @@ class HTTPClient: self, app_id: Snowflake, username: str, discriminator: Snowflake ) -> Response[application.WhitelistedUser]: payload = {'username': username, 'discriminator': str(discriminator) or None} - return self.request( Route('POST', '/oauth2/applications/{app_id}/allowlist', app_id=app_id), json=payload, @@ -3320,7 +3181,6 @@ class HTTPClient: def create_asset(self, app_id: Snowflake, name: str, type: int, image: str) -> Response[application.Asset]: payload = {'name': name, 'type': type, 'image': image} - return self.request( Route('POST', '/oauth2/applications/{app_id}/assets', app_id=app_id), json=payload, @@ -3365,7 +3225,6 @@ class HTTPClient: def create_team(self, name: str): payload = {'name': name} - return self.request(Route('POST', '/teams'), json=payload, super_properties_to_track=True) def get_teams(self, *, include_payout_account_status: bool = False) -> Response[List[team.Team]]: @@ -3394,7 +3253,6 @@ class HTTPClient: def invite_team_member(self, team_id: Snowflake, username: str, discriminator: Snowflake): payload = {'username': username, 'discriminator': str(discriminator) or None} - return self.request( Route('POST', '/teams/{team_id}/members', team_id=team_id), json=payload, super_properties_to_track=True ) @@ -3407,7 +3265,6 @@ class HTTPClient: def create_team_company(self, team_id: Snowflake, name: str) -> Response[application.Company]: payload = {'name': name} - return self.request( Route('POST', '/teams/{team_id}/companies', team_id=team_id), json=payload, super_properties_to_track=True ) @@ -3476,12 +3333,10 @@ class HTTPClient: def get_app_ticket(self, app_id: Snowflake, test_mode: bool = False) -> Response[application.Ticket]: payload = {'test_mode': test_mode} - return self.request(Route('POST', '/users/@me/applications/{app_id}/ticket', app_id=app_id), json=payload) def get_app_entitlement_ticket(self, app_id: Snowflake, test_mode: bool = False) -> Response[application.Ticket]: payload = {'test_mode': test_mode} - return self.request( Route('POST', '/users/@me/applications/{app_id}/entitlement-ticket', app_id=app_id), json=payload ) @@ -3505,7 +3360,6 @@ class HTTPClient: def create_app_branch(self, app_id: Snowflake, name: str) -> Response[application.Branch]: payload = {'name': name} - return self.request(Route('POST', '/applications/{app_id}/branches', app_id=app_id), json=payload) def delete_app_branch(self, app_id: Snowflake, branch_id: Snowflake) -> Response[None]: @@ -3545,7 +3399,6 @@ class HTTPClient: def get_build_ids(self, branch_ids: Sequence[Snowflake]) -> Response[List[application.Branch]]: payload = {'branch_ids': branch_ids} - return self.request(Route('POST', '/branches'), json=payload) def create_branch_build( @@ -3558,7 +3411,6 @@ class HTTPClient: def edit_build(self, app_id: Snowflake, build_id: Snowflake, status: str) -> Response[None]: payload = {'status': status} - return self.request( Route('PATCH', '/applications/{app_id}/builds/{build_id}', app_id=app_id, build_id=build_id), json=payload ) @@ -3570,7 +3422,6 @@ class HTTPClient: self, app_id: Snowflake, branch_id: Snowflake, build_id: Snowflake, manifest_ids: Sequence[Snowflake] ) -> Response[application.BranchSize]: payload = {'manifest_ids': manifest_ids} - return self.request( Route( 'POST', @@ -3587,7 +3438,6 @@ class HTTPClient: ) -> Response[Dict[str, application.DownloadSignature]]: params = {'branch_id': branch_id, 'build_id': build_id} payload = {'manifest_label_ids': manifest_label_ids} - return self.request( Route( 'POST', @@ -4032,7 +3882,6 @@ class HTTPClient: 'entitlement_starts_at': entitlement_starts_at or '', 'entitlement_ends_at': entitlement_ends_at or '', } - return self.request( Route('POST', '/applications/{app_id}/gift-code-batches', app_id=app_id), json=payload, @@ -4355,7 +4204,6 @@ class HTTPClient: def refund_payment(self, payment_id: Snowflake, reason: Optional[int] = None) -> Response[None]: payload = {'reason': reason} - return self.request( Route('POST', '/users/@me/billing/payments/{payment_id}/refund', payment_id=payment_id), json=payload ) @@ -4460,7 +4308,6 @@ class HTTPClient: self, application_id: Snowflake, channel_id: Snowflake ) -> Response[application.ActiveDeveloperResponse]: payload = {'application_id': application_id, 'channel_id': channel_id} - return self.request(Route('POST', '/developers/active-program'), json=payload, super_properties_to_track=True) def unenroll_active_developer(self) -> Response[None]: @@ -4510,12 +4357,10 @@ class HTTPClient: def set_note(self, user_id: Snowflake, *, note: Optional[str] = None) -> Response[None]: payload = {'note': note or ''} - return self.request(Route('PUT', '/users/@me/notes/{user_id}', user_id=user_id), json=payload) def change_hypesquad_house(self, house_id: int) -> Response[None]: payload = {'house_id': house_id} - return self.request(Route('POST', '/hypesquad/online'), json=payload) def leave_hypesquad_house(self) -> Response[None]: @@ -4557,10 +4402,9 @@ class HTTPClient: self, guild_id: Snowflake, channel_id: Snowflake, message_id: Snowflake, reason: str ): # TODO: return type payload = {'guild_id': guild_id, 'channel_id': channel_id, 'message_id': message_id, 'reason': reason} - return self.request(Route('POST', '/report'), json=payload) - def get_application_commands(self, app_id: Snowflake): + def get_application_commands(self, app_id: Snowflake) -> Response[List[command.ApplicationCommand]]: return self.request(Route('GET', '/applications/{application_id}/commands', application_id=app_id)) def search_application_commands( @@ -4724,7 +4568,6 @@ class HTTPClient: 'application_hash': hash, 'icon': icon, } - return self.request(Route('POST', '/unverified-applications/icons'), json=payload) # Recent Mentions @@ -4760,17 +4603,6 @@ class HTTPClient: def suppress_tutorial(self) -> Response[None]: return self.request(Route('POST', '/tutorial/indicators/suppress')) - async def get_preferred_voice_regions(self) -> List[dict]: - async with self.__session.get('https://latency.discord.media/rtc') as resp: - if resp.status == 200: - return await resp.json() - elif resp.status == 404: - raise NotFound(resp, 'rtc regions not found') - elif resp.status == 403: - raise Forbidden(resp, 'cannot retrieve rtc regions') - else: - raise HTTPException(resp, 'failed to get rtc regions') - # Experiments @overload