diff --git a/discord/interactions.py b/discord/interactions.py index bc54324df..8a8d0c9d5 100644 --- a/discord/interactions.py +++ b/discord/interactions.py @@ -356,10 +356,13 @@ class Interaction: raise ClientException('Channel for message could not be resolved') adapter = async_context.get() + http = self._state.http data = await adapter.get_original_interaction_response( application_id=self.application_id, token=self.token, session=self._session, + proxy=http.proxy, + proxy_auth=http.proxy_auth, ) state = _InteractionMessageState(self, self._state) # The state and channel parameters are mocked here @@ -441,10 +444,13 @@ class Interaction: previous_allowed_mentions=previous_mentions, ) adapter = async_context.get() + http = self._state.http data = await adapter.edit_original_interaction_response( self.application_id, self.token, session=self._session, + proxy=http.proxy, + proxy_auth=http.proxy_auth, payload=params.payload, multipart=params.multipart, files=params.files, @@ -475,10 +481,13 @@ class Interaction: Deleted a message that is not yours. """ adapter = async_context.get() + http = self._state.http await adapter.delete_original_interaction_response( self.application_id, self.token, session=self._session, + proxy=http.proxy, + proxy_auth=http.proxy_auth, ) @@ -561,7 +570,15 @@ class InteractionResponse: if defer_type: adapter = async_context.get() params = interaction_response_params(type=defer_type, data=data) - await adapter.create_interaction_response(parent.id, parent.token, session=parent._session, params=params) + http = parent._state.http + await adapter.create_interaction_response( + parent.id, + parent.token, + session=parent._session, + proxy=http.proxy, + proxy_auth=http.proxy_auth, + params=params, + ) self._responded = True async def pong(self) -> None: @@ -585,7 +602,15 @@ class InteractionResponse: if parent.type is InteractionType.ping: adapter = async_context.get() params = interaction_response_params(InteractionResponseType.pong.value) - await adapter.create_interaction_response(parent.id, parent.token, session=parent._session, params=params) + http = parent._state.http + await adapter.create_interaction_response( + parent.id, + parent.token, + session=parent._session, + proxy=http.proxy, + proxy_auth=http.proxy_auth, + params=params, + ) self._responded = True async def send_message( @@ -671,10 +696,13 @@ class InteractionResponse: view=view, ) + http = parent._state.http await adapter.create_interaction_response( parent.id, parent.token, session=parent._session, + proxy=http.proxy, + proxy_auth=http.proxy_auth, params=params, ) @@ -762,10 +790,13 @@ class InteractionResponse: allowed_mentions=allowed_mentions, ) + http = parent._state.http await adapter.create_interaction_response( parent.id, parent.token, session=parent._session, + proxy=http.proxy, + proxy_auth=http.proxy_auth, params=params, ) @@ -797,12 +828,15 @@ class InteractionResponse: parent = self._parent adapter = async_context.get() + http = parent._state.http params = interaction_response_params(InteractionResponseType.modal.value, modal.to_dict()) await adapter.create_interaction_response( parent.id, parent.token, session=parent._session, + proxy=http.proxy, + proxy_auth=http.proxy_auth, params=params, ) @@ -840,11 +874,14 @@ class InteractionResponse: raise ValueError('cannot respond to this interaction with autocomplete.') adapter = async_context.get() + http = parent._state.http params = interaction_response_params(type=InteractionResponseType.autocomplete_result.value, data=payload) await adapter.create_interaction_response( parent.id, parent.token, session=parent._session, + proxy=http.proxy, + proxy_auth=http.proxy_auth, params=params, ) diff --git a/discord/webhook/async_.py b/discord/webhook/async_.py index 649f5f604..e2b5ef298 100644 --- a/discord/webhook/async_.py +++ b/discord/webhook/async_.py @@ -129,6 +129,8 @@ class AsyncWebhookAdapter: *, payload: Optional[Dict[str, Any]] = None, multipart: Optional[List[Dict[str, Any]]] = None, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, files: Optional[Sequence[File]] = None, reason: Optional[str] = None, auth_token: Optional[str] = None, @@ -234,10 +236,12 @@ class AsyncWebhookAdapter: *, token: Optional[str] = None, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, reason: Optional[str] = None, ) -> Response[None]: route = Route('DELETE', '/webhooks/{webhook_id}', webhook_id=webhook_id) - return self.request(route, session, reason=reason, auth_token=token) + return self.request(route, session=session, proxy=proxy, proxy_auth=proxy_auth, reason=reason, auth_token=token) def delete_webhook_with_token( self, @@ -245,10 +249,12 @@ class AsyncWebhookAdapter: token: str, *, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, reason: Optional[str] = None, ) -> Response[None]: route = Route('DELETE', '/webhooks/{webhook_id}/{webhook_token}', webhook_id=webhook_id, webhook_token=token) - return self.request(route, session, reason=reason) + return self.request(route, session=session, proxy=proxy, proxy_auth=proxy_auth, reason=reason) def edit_webhook( self, @@ -257,10 +263,20 @@ class AsyncWebhookAdapter: payload: Dict[str, Any], *, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, reason: Optional[str] = None, ) -> Response[WebhookPayload]: route = Route('PATCH', '/webhooks/{webhook_id}', webhook_id=webhook_id) - return self.request(route, session, reason=reason, payload=payload, auth_token=token) + return self.request( + route, + session=session, + proxy=proxy, + proxy_auth=proxy_auth, + reason=reason, + payload=payload, + auth_token=token, + ) def edit_webhook_with_token( self, @@ -269,10 +285,12 @@ class AsyncWebhookAdapter: payload: Dict[str, Any], *, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, reason: Optional[str] = None, ) -> Response[WebhookPayload]: route = Route('PATCH', '/webhooks/{webhook_id}/{webhook_token}', webhook_id=webhook_id, webhook_token=token) - return self.request(route, session, reason=reason, payload=payload) + return self.request(route, session=session, proxy=proxy, proxy_auth=proxy_auth, reason=reason, payload=payload) def execute_webhook( self, @@ -280,6 +298,8 @@ class AsyncWebhookAdapter: token: str, *, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, payload: Optional[Dict[str, Any]] = None, multipart: Optional[List[Dict[str, Any]]] = None, files: Optional[Sequence[File]] = None, @@ -290,7 +310,16 @@ class AsyncWebhookAdapter: if thread_id: params['thread_id'] = thread_id route = Route('POST', '/webhooks/{webhook_id}/{webhook_token}', webhook_id=webhook_id, webhook_token=token) - return self.request(route, session, payload=payload, multipart=multipart, files=files, params=params) + return self.request( + route, + session=session, + proxy=proxy, + proxy_auth=proxy_auth, + payload=payload, + multipart=multipart, + files=files, + params=params, + ) def get_webhook_message( self, @@ -299,6 +328,8 @@ class AsyncWebhookAdapter: message_id: int, *, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, thread_id: Optional[int] = None, ) -> Response[MessagePayload]: route = Route( @@ -309,7 +340,7 @@ class AsyncWebhookAdapter: message_id=message_id, ) params = None if thread_id is None else {'thread_id': thread_id} - return self.request(route, session, params=params) + return self.request(route, session=session, proxy=proxy, proxy_auth=proxy_auth, params=params) def edit_webhook_message( self, @@ -318,6 +349,8 @@ class AsyncWebhookAdapter: message_id: int, *, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, payload: Optional[Dict[str, Any]] = None, multipart: Optional[List[Dict[str, Any]]] = None, files: Optional[Sequence[File]] = None, @@ -331,7 +364,16 @@ class AsyncWebhookAdapter: message_id=message_id, ) params = None if thread_id is None else {'thread_id': thread_id} - return self.request(route, session, payload=payload, multipart=multipart, files=files, params=params) + return self.request( + route, + session=session, + proxy=proxy, + proxy_auth=proxy_auth, + payload=payload, + multipart=multipart, + files=files, + params=params, + ) def delete_webhook_message( self, @@ -340,6 +382,8 @@ class AsyncWebhookAdapter: message_id: int, *, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, thread_id: Optional[int] = None, ) -> Response[None]: route = Route( @@ -350,7 +394,7 @@ class AsyncWebhookAdapter: message_id=message_id, ) params = None if thread_id is None else {'thread_id': thread_id} - return self.request(route, session, params=params) + return self.request(route, session=session, proxy=proxy, proxy_auth=proxy_auth, params=params) def fetch_webhook( self, @@ -358,9 +402,11 @@ class AsyncWebhookAdapter: token: str, *, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, ) -> Response[WebhookPayload]: route = Route('GET', '/webhooks/{webhook_id}', webhook_id=webhook_id) - return self.request(route, session=session, auth_token=token) + return self.request(route, session=session, proxy=proxy, proxy_auth=proxy_auth, auth_token=token) def fetch_webhook_with_token( self, @@ -368,9 +414,11 @@ class AsyncWebhookAdapter: token: str, *, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, ) -> Response[WebhookPayload]: route = Route('GET', '/webhooks/{webhook_id}/{webhook_token}', webhook_id=webhook_id, webhook_token=token) - return self.request(route, session=session) + return self.request(route, session=session, proxy=proxy, proxy_auth=proxy_auth) def create_interaction_response( self, @@ -378,6 +426,8 @@ class AsyncWebhookAdapter: token: str, *, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, params: MultipartParameters, ) -> Response[None]: route = Route( @@ -388,9 +438,16 @@ class AsyncWebhookAdapter: ) if params.files: - return self.request(route, session=session, files=params.files, multipart=params.multipart) + return self.request( + route, + session=session, + proxy=proxy, + proxy_auth=proxy_auth, + files=params.files, + multipart=params.multipart, + ) else: - return self.request(route, session=session, payload=params.payload) + return self.request(route, session=session, proxy=proxy, proxy_auth=proxy_auth, payload=params.payload) def get_original_interaction_response( self, @@ -398,6 +455,8 @@ class AsyncWebhookAdapter: token: str, *, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, ) -> Response[MessagePayload]: r = Route( 'GET', @@ -405,7 +464,7 @@ class AsyncWebhookAdapter: webhook_id=application_id, webhook_token=token, ) - return self.request(r, session=session) + return self.request(r, session=session, proxy=proxy, proxy_auth=proxy_auth) def edit_original_interaction_response( self, @@ -413,6 +472,8 @@ class AsyncWebhookAdapter: token: str, *, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, payload: Optional[Dict[str, Any]] = None, multipart: Optional[List[Dict[str, Any]]] = None, files: Optional[Sequence[File]] = None, @@ -423,7 +484,15 @@ class AsyncWebhookAdapter: webhook_id=application_id, webhook_token=token, ) - return self.request(r, session, payload=payload, multipart=multipart, files=files) + return self.request( + r, + session=session, + proxy=proxy, + proxy_auth=proxy_auth, + payload=payload, + multipart=multipart, + files=files, + ) def delete_original_interaction_response( self, @@ -431,6 +500,8 @@ class AsyncWebhookAdapter: token: str, *, session: aiohttp.ClientSession, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, ) -> Response[None]: r = Route( 'DELETE', @@ -438,7 +509,7 @@ class AsyncWebhookAdapter: webhook_id=application_id, webhook_token=token, ) - return self.request(r, session=session) + return self.request(r, session=session, proxy=proxy, proxy_auth=proxy_auth) def interaction_response_params(type: int, data: Optional[Dict[str, Any]] = None) -> MultipartParameters: @@ -1058,7 +1129,7 @@ class Webhook(BaseWebhook): .. versionadded:: 2.0 """ - __slots__: Tuple[str, ...] = ('session',) + __slots__: Tuple[str, ...] = ('session', 'proxy', 'proxy_auth') def __init__( self, @@ -1066,9 +1137,13 @@ class Webhook(BaseWebhook): session: aiohttp.ClientSession, token: Optional[str] = None, state: Optional[_State] = None, + proxy: Optional[str] = None, + proxy_auth: Optional[aiohttp.BasicAuth] = None, ) -> None: super().__init__(data, token, state) self.session: aiohttp.ClientSession = session + self.proxy: Optional[str] = proxy + self.proxy_auth: Optional[aiohttp.BasicAuth] = proxy_auth def __repr__(self) -> str: return f'' @@ -1170,13 +1245,19 @@ class Webhook(BaseWebhook): } state = channel._state - session = channel._state.http._HTTPClient__session - return cls(feed, session=session, state=state, token=state.http.token) + http = state.http + session = http._HTTPClient__session + proxy_auth = http.proxy_auth + proxy = http.proxy + return cls(feed, session=session, state=state, proxy_auth=proxy_auth, proxy=proxy, token=state.http.token) @classmethod def from_state(cls, data: WebhookPayload, state: ConnectionState) -> Self: - session = state.http._HTTPClient__session # type: ignore - return cls(data, session=session, state=state, token=state.http.token) + http = state.http + session = http._HTTPClient__session # type: ignore + proxy_auth = http.proxy_auth + proxy = http.proxy + return cls(data, session=session, state=state, proxy_auth=proxy_auth, proxy=proxy, token=state.http.token) async def fetch(self, *, prefer_auth: bool = True) -> Webhook: """|coro| @@ -1216,13 +1297,32 @@ class Webhook(BaseWebhook): adapter = async_context.get() if prefer_auth and self.auth_token: - data = await adapter.fetch_webhook(self.id, self.auth_token, session=self.session) + data = await adapter.fetch_webhook( + self.id, + self.auth_token, + session=self.session, + proxy=self.proxy, + proxy_auth=self.proxy_auth, + ) elif self.token: - data = await adapter.fetch_webhook_with_token(self.id, self.token, session=self.session) + data = await adapter.fetch_webhook_with_token( + self.id, + self.token, + session=self.session, + proxy=self.proxy, + proxy_auth=self.proxy_auth, + ) else: raise ValueError('This webhook does not have a token associated with it') - return Webhook(data, self.session, token=self.auth_token, state=self._state) + return Webhook( + data, + session=self.session, + proxy=self.proxy, + proxy_auth=self.proxy_auth, + token=self.auth_token, + state=self._state, + ) async def delete(self, *, reason: Optional[str] = None, prefer_auth: bool = True) -> None: """|coro| @@ -1258,9 +1358,18 @@ class Webhook(BaseWebhook): adapter = async_context.get() if prefer_auth and self.auth_token: - await adapter.delete_webhook(self.id, token=self.auth_token, session=self.session, reason=reason) + await adapter.delete_webhook( + self.id, + token=self.auth_token, + session=self.session, + proxy=self.proxy, + proxy_auth=self.proxy_auth, + reason=reason, + ) elif self.token: - await adapter.delete_webhook_with_token(self.id, self.token, session=self.session, reason=reason) + await adapter.delete_webhook_with_token( + self.id, self.token, session=self.session, proxy=self.proxy, proxy_auth=self.proxy_auth, reason=reason, + ) async def edit( self, @@ -1328,19 +1437,48 @@ class Webhook(BaseWebhook): raise ValueError('Editing channel requires authenticated webhook') payload['channel_id'] = channel.id - data = await adapter.edit_webhook(self.id, self.auth_token, payload=payload, session=self.session, reason=reason) + data = await adapter.edit_webhook( + self.id, + self.auth_token, + payload=payload, + session=self.session, + proxy=self.proxy, + proxy_auth=self.proxy_auth, + reason=reason, + ) if prefer_auth and self.auth_token: - data = await adapter.edit_webhook(self.id, self.auth_token, payload=payload, session=self.session, reason=reason) + data = await adapter.edit_webhook( + self.id, + self.auth_token, + payload=payload, + session=self.session, + proxy=self.proxy, + proxy_auth=self.proxy_auth, + reason=reason, + ) elif self.token: data = await adapter.edit_webhook_with_token( - self.id, self.token, payload=payload, session=self.session, reason=reason + self.id, + self.token, + payload=payload, + session=self.session, + proxy=self.proxy, + proxy_auth=self.proxy_auth, + reason=reason, ) if data is None: raise RuntimeError('Unreachable code hit: data was not assigned') - return Webhook(data=data, session=self.session, token=self.auth_token, state=self._state) + return Webhook( + data, + session=self.session, + proxy=self.proxy, + proxy_auth=self.proxy_auth, + token=self.auth_token, + state=self._state, + ) def _create_message(self, data, *, thread: Snowflake): state = _WebhookState(self, parent=self._state, thread=thread) @@ -1566,6 +1704,8 @@ class Webhook(BaseWebhook): self.id, self.token, session=self.session, + proxy=self.proxy, + proxy_auth=self.proxy_auth, payload=params.payload, multipart=params.multipart, files=params.files, @@ -1627,6 +1767,8 @@ class Webhook(BaseWebhook): self.token, id, session=self.session, + proxy=self.proxy, + proxy_auth=self.proxy_auth, thread_id=thread_id, ) return self._create_message(data, thread=thread) @@ -1738,6 +1880,8 @@ class Webhook(BaseWebhook): self.token, message_id, session=self.session, + proxy=self.proxy, + proxy_auth=self.proxy_auth, payload=params.payload, multipart=params.multipart, files=params.files, @@ -1798,5 +1942,7 @@ class Webhook(BaseWebhook): self.token, message_id, session=self.session, + proxy=self.proxy, + proxy_auth=self.proxy_auth, thread_id=thread_id, )