diff --git a/discord/webhook/async_.py b/discord/webhook/async_.py index 268cee8fa..3d485cf13 100644 --- a/discord/webhook/async_.py +++ b/discord/webhook/async_.py @@ -128,6 +128,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, @@ -233,10 +235,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, @@ -244,10 +248,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, @@ -256,10 +262,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, @@ -268,10 +284,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, @@ -279,6 +297,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, @@ -289,7 +309,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, @@ -298,6 +327,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( @@ -308,7 +339,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, @@ -317,6 +348,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, @@ -330,7 +363,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, @@ -339,6 +381,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( @@ -349,7 +393,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, @@ -357,9 +401,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, @@ -367,9 +413,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) async_context: ContextVar[AsyncWebhookAdapter] = ContextVar('async_webhook_context', default=AsyncWebhookAdapter()) @@ -869,7 +917,7 @@ class Webhook(BaseWebhook): .. versionadded:: 2.0 """ - __slots__: Tuple[str, ...] = ('session',) + __slots__: Tuple[str, ...] = ('session', 'proxy', 'proxy_auth') def __init__( self, @@ -877,9 +925,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'' @@ -981,13 +1033,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| @@ -1027,13 +1085,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| @@ -1069,9 +1146,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, @@ -1139,19 +1225,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) @@ -1339,6 +1454,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, @@ -1396,6 +1513,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) @@ -1493,6 +1612,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, @@ -1551,5 +1672,7 @@ class Webhook(BaseWebhook): self.token, message_id, session=self.session, + proxy=self.proxy, + proxy_auth=self.proxy_auth, thread_id=thread_id, )