Browse Source

Pass proxy information to interactions and webhooks

Fix #7918
pull/10109/head
Rapptz 3 years ago
committed by dolfies
parent
commit
97aacb4635
  1. 171
      discord/webhook/async_.py

171
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'<Webhook id={self.id!r}>'
@ -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,
)

Loading…
Cancel
Save