Skip to content

Commit fb02236

Browse files
authored
add rate_limit_retry logic to edit method and refactor **kwargs it (#78)
1 parent 23a5864 commit fb02236

File tree

1 file changed

+28
-7
lines changed

1 file changed

+28
-7
lines changed

discord_webhook/webhook.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import requests
66
from webhook_exceptions import *
77

8-
98
logger = logging.getLogger(__name__)
109

1110

@@ -159,7 +158,7 @@ def execute(self, remove_embeds=False, remove_files=False):
159158
if response.status_code in [200, 204]:
160159
logger.debug(
161160
"[{index}/{length}] Webhook executed".format(
162-
index=i+1, length=urls_len
161+
index=i + 1, length=urls_len
163162
)
164163
)
165164
elif response.status_code == 429 and self.rate_limit_retry:
@@ -185,7 +184,7 @@ def execute(self, remove_embeds=False, remove_files=False):
185184
else:
186185
logger.error(
187186
"[{index}/{length}] Webhook status code {status_code}: {content}".format(
188-
index=i+1,
187+
index=i + 1,
189188
length=urls_len,
190189
status_code=response.status_code,
191190
content=response.content.decode("utf-8"),
@@ -208,20 +207,41 @@ def edit(self, sent_webhook):
208207
webhook_len = len(sent_webhook)
209208
responses = []
210209
for i, webhook in enumerate(sent_webhook):
211-
url = webhook.url.split('?')[0] # removes any query params
212210
previous_sent_message_id = json.loads(webhook.content.decode('utf-8'))['id']
211+
url = webhook.url.split('?')[0] + '/messages/' + str(previous_sent_message_id) # removes any query params
213212
if bool(self.files) is False:
214-
response = requests.patch(url+'/messages/'+str(previous_sent_message_id), json=self.json, proxies=self.proxies, params={'wait': True}, timeout=self.timeout)
213+
patch_kwargs = {'json': self.json, 'proxies': self.proxies, 'params': {'wait': True}, 'timeout': self.timeout}
215214
else:
216215
self.files["payload_json"] = (None, json.dumps(self.json))
217-
response = requests.patch(url+'/messages/'+str(previous_sent_message_id), files=self.files, proxies=self.proxies, timeout=self.timeout)
216+
patch_kwargs = {'files': self.files, 'proxies': self.proxies, 'timeout': self.timeout}
217+
response = requests.patch(url, **patch_kwargs)
218218
if response.status_code in [200, 204]:
219219
logger.debug(
220220
"[{index}/{length}] Webhook edited".format(
221221
index=i + 1,
222222
length=webhook_len,
223223
)
224224
)
225+
elif response.status_code == 429 and self.rate_limit_retry:
226+
while response.status_code == 429:
227+
errors = json.loads(response.content.decode('utf-8'))
228+
wh_sleep = (int(errors['retry_after']) / 1000) + 0.15
229+
time.sleep(wh_sleep)
230+
logger.error(
231+
"Webhook rate limited: sleeping for {wh_sleep} "
232+
"seconds...".format(
233+
wh_sleep=wh_sleep
234+
)
235+
)
236+
response = requests.patch(url, **patch_kwargs)
237+
if response.status_code in [200, 204]:
238+
logger.debug(
239+
"[{index}/{length}] Webhook edited".format(
240+
index=i + 1,
241+
length=webhook_len,
242+
)
243+
)
244+
break
225245
else:
226246
logger.error(
227247
"[{index}/{length}] Webhook status code {status_code}: {content}".format(
@@ -246,7 +266,8 @@ def delete(self, sent_webhook):
246266
for i, webhook in enumerate(sent_webhook):
247267
url = webhook.url.split('?')[0] # removes any query params
248268
previous_sent_message_id = json.loads(webhook.content.decode('utf-8'))['id']
249-
response = requests.delete(url+'/messages/'+str(previous_sent_message_id), proxies=self.proxies, timeout=self.timeout)
269+
response = requests.delete(url + '/messages/' + str(previous_sent_message_id), proxies=self.proxies,
270+
timeout=self.timeout)
250271
if response.status_code in [200, 204]:
251272
logger.debug(
252273
"[{index}/{length}] Webhook deleted".format(

0 commit comments

Comments
 (0)