aboutsummaryrefslogtreecommitdiff
path: root/discord/webhook.py
diff options
context:
space:
mode:
Diffstat (limited to 'discord/webhook.py')
-rw-r--r--discord/webhook.py40
1 files changed, 29 insertions, 11 deletions
diff --git a/discord/webhook.py b/discord/webhook.py
index 64136b9e..317c54c4 100644
--- a/discord/webhook.py
+++ b/discord/webhook.py
@@ -28,6 +28,7 @@ import asyncio
import json
import time
import re
+from urllib.parse import quote as _uriquote
import aiohttp
@@ -84,11 +85,11 @@ class WebhookAdapter:
"""
raise NotImplementedError()
- def delete_webhook(self):
- return self.request('DELETE', self._request_url)
+ def delete_webhook(self, *, reason=None):
+ return self.request('DELETE', self._request_url, reason=reason)
- def edit_webhook(self, **payload):
- return self.request('PATCH', self._request_url, payload=payload)
+ def edit_webhook(self, *, reason=None, **payload):
+ return self.request('PATCH', self._request_url, payload=payload, reason=reason)
def handle_execution_response(self, data, *, wait):
"""Transforms the webhook execution response into something
@@ -174,13 +175,16 @@ class AsyncWebhookAdapter(WebhookAdapter):
self.session = session
self.loop = asyncio.get_event_loop()
- async def request(self, verb, url, payload=None, multipart=None, *, files=None):
+ async def request(self, verb, url, payload=None, multipart=None, *, files=None, reason=None):
headers = {}
data = None
files = files or []
if payload:
headers['Content-Type'] = 'application/json'
data = utils.to_json(payload)
+
+ if reason:
+ headers['X-Audit-Log-Reason'] = _uriquote(reason, safe='/ ')
if multipart:
data = aiohttp.FormData()
@@ -260,13 +264,16 @@ class RequestsWebhookAdapter(WebhookAdapter):
self.session = session or requests
self.sleep = sleep
- def request(self, verb, url, payload=None, multipart=None, *, files=None):
+ def request(self, verb, url, payload=None, multipart=None, *, files=None, reason=None):
headers = {}
data = None
files = files or []
if payload:
headers['Content-Type'] = 'application/json'
data = utils.to_json(payload)
+
+ if reason:
+ headers['X-Audit-Log-Reason'] = _uriquote(reason, safe='/ ')
if multipart is not None:
data = {'payload_json': multipart.pop('payload_json')}
@@ -640,7 +647,7 @@ class Webhook(Hashable):
url = '/avatars/{0.id}/{0.avatar}.{1}?size={2}'.format(self, format, size)
return Asset(self._state, url)
- def delete(self):
+ def delete(self, *, reason=None):
"""|maybecoro|
Deletes this Webhook.
@@ -648,6 +655,13 @@ class Webhook(Hashable):
If the webhook is constructed with a :class:`RequestsWebhookAdapter` then this is
not a coroutine.
+ Parameters
+ ------------
+ reason: Optional[:class:`str`]
+ The reason for deleting this webhook. Shows up on the audit log.
+
+ .. versionadded:: 1.4
+
Raises
-------
HTTPException
@@ -662,9 +676,9 @@ class Webhook(Hashable):
if self.token is None:
raise InvalidArgument('This webhook does not have a token associated with it')
- return self._adapter.delete_webhook()
+ return self._adapter.delete_webhook(reason=reason)
- def edit(self, **kwargs):
+ def edit(self, *, reason=None, **kwargs):
"""|maybecoro|
Edits this Webhook.
@@ -673,11 +687,15 @@ class Webhook(Hashable):
not a coroutine.
Parameters
- -------------
+ ------------
name: Optional[:class:`str`]
The webhook's new default name.
avatar: Optional[:class:`bytes`]
A :term:`py:bytes-like object` representing the webhook's new default avatar.
+ reason: Optional[:class:`str`]
+ The reason for deleting this webhook. Shows up on the audit log.
+
+ .. versionadded:: 1.4
Raises
-------
@@ -713,7 +731,7 @@ class Webhook(Hashable):
else:
payload['avatar'] = None
- return self._adapter.edit_webhook(**payload)
+ return self._adapter.edit_webhook(reason=reason, **payload)
def send(self, content=None, *, wait=False, username=None, avatar_url=None, tts=False,
file=None, files=None, embed=None, embeds=None, allowed_mentions=None):