Skip to content

Commit 0d9e52a

Browse files
committed
line break for long lines
1 parent c5af6ae commit 0d9e52a

File tree

2 files changed

+87
-54
lines changed

2 files changed

+87
-54
lines changed

discord_webhook/webhook.py

Lines changed: 72 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -30,23 +30,25 @@ class DiscordEmbed:
3030
fields: List[Dict[str, Optional[Any]]]
3131

3232
def __init__(
33-
self,
34-
title: Optional[str] = None,
35-
description: Optional[str] = None,
36-
**kwargs: Any,
33+
self,
34+
title: Optional[str] = None,
35+
description: Optional[str] = None,
36+
**kwargs: Any,
3737
) -> None:
3838
"""
3939
Init Discord Embed
4040
-----------
4141
:keyword ``title:`` title of embed\n
4242
:keyword ``description:`` description body of embed\n
43-
:keyword ``url:`` add an url to make your embedded title a clickable link\n
43+
:keyword ``url:`` add an url to make your embedded title a clickable
44+
link\n
4445
:keyword ``timestamp:`` timestamp of embed content\n
4546
:keyword ``color:`` color code of the embed as int\n
4647
:keyword ``footer:`` footer texts\n
4748
:keyword ``image:`` your image url here\n
4849
:keyword ``thumbnail:`` your thumbnail url here\n
49-
:keyword ``video:`` to apply video with embedded, your video source url here\n
50+
:keyword ``video:`` to apply video with embedded, your video source
51+
url here\n
5052
:keyword ``provider:`` provider information\n
5153
:keyword ``author:`` author information\n
5254
:keyword ``fields:`` fields information
@@ -107,7 +109,8 @@ def set_footer(self, **kwargs: str) -> None:
107109
"""
108110
set footer information of embed
109111
:keyword text: footer text
110-
:keyword icon_url: url of footer icon (only supports http(s) and attachments)
112+
:keyword icon_url: url of footer icon (only supports http(s) and
113+
attachments)
111114
:keyword proxy_icon_url: a proxied url of footer icon
112115
"""
113116
self.footer = {
@@ -134,7 +137,8 @@ def set_image(self, url: str, **kwargs: Union[str, int]) -> None:
134137
def set_thumbnail(self, url: str, **kwargs: Union[str, int]) -> None:
135138
"""
136139
set thumbnail of embed
137-
:param url: source url of thumbnail (only supports http(s) and attachments)
140+
:param url: source url of thumbnail (only supports http(s) and
141+
attachments)
138142
:keyword proxy_url: a proxied thumbnail of the image
139143
:keyword height: height of thumbnail
140144
:keyword width: width of thumbnail
@@ -175,7 +179,8 @@ def set_author(self, name: str, **kwargs: str) -> None:
175179
set author of embed
176180
:param name: name of author
177181
:keyword url: url of author
178-
:keyword icon_url: url of author icon (only supports http(s) and attachments)
182+
:keyword icon_url: url of author icon (only supports http(s) and
183+
attachments)
179184
:keyword proxy_icon_url: a proxied url of author icon
180185
"""
181186
self.author = {
@@ -234,19 +239,20 @@ class DiscordWebhook:
234239
rate_limit_retry: bool = False
235240

236241
def __init__(
237-
self,
238-
url: Optional[Union[str, List[str]]] = None,
239-
*,
240-
content: Optional[str] = None,
241-
username: Optional[str] = None,
242-
avatar_url: Optional[str] = None,
243-
tts: bool = False,
244-
files: Optional[Dict[str, Tuple[Optional[str], Union[bytes, str]]]] = None,
245-
embeds: Optional[List[Dict[str, Any]]] = None,
246-
proxies: Optional[Dict[str, str]] = None,
247-
timeout: Optional[float] = None,
248-
rate_limit_retry: bool = False,
249-
allowed_mentions: Optional[List[str]] = None,
242+
self,
243+
url: Optional[Union[str, List[str]]] = None,
244+
*,
245+
content: Optional[str] = None,
246+
username: Optional[str] = None,
247+
avatar_url: Optional[str] = None,
248+
tts: bool = False,
249+
files: Optional[
250+
Dict[str, Tuple[Optional[str], Union[bytes, str]]]] = None,
251+
embeds: Optional[List[Dict[str, Any]]] = None,
252+
proxies: Optional[Dict[str, str]] = None,
253+
timeout: Optional[float] = None,
254+
rate_limit_retry: bool = False,
255+
allowed_mentions: Optional[List[str]] = None,
250256
) -> None:
251257
"""
252258
Init Webhook for Discord
@@ -257,12 +263,15 @@ def __init__(
257263
:keyword ``avatar_url:`` override the default avatar of the webhook\n
258264
:keyword ``tts:`` true if this is a TTS message\n
259265
:keyword ``file``: to apply file(s) with message
260-
(For example: file=f.read() (here, f = variable that contain attachement path as "rb" mode))\n
261-
:keyword ``filename:`` apply custom file name on attached file content(s)\n
266+
(For example: file=f.read() (here, f = variable that contain
267+
attachement path as "rb" mode))\n
268+
:keyword ``filename:`` apply custom file name on attached file
269+
content(s)\n
262270
:keyword ``embeds:`` list of embedded rich content\n
263271
:keyword ``allowed_mentions:`` allowed mentions for the message\n
264272
:keyword ``proxies:`` dict of proxies\n
265-
:keyword ``timeout:`` (optional) amount of seconds to wait for a response from Discord
273+
:keyword ``timeout:`` (optional) amount of seconds to wait for a
274+
response from Discord
266275
"""
267276
if embeds is None:
268277
embeds = []
@@ -296,7 +305,8 @@ def add_embed(self, embed: Union[DiscordEmbed, Dict[str, Any]]) -> None:
296305
adds an embedded rich content
297306
:param embed: embed object or dict
298307
"""
299-
self.embeds.append(embed.__dict__ if isinstance(embed, DiscordEmbed) else embed)
308+
self.embeds.append(
309+
embed.__dict__ if isinstance(embed, DiscordEmbed) else embed)
300310

301311
def remove_embed(self, index: int) -> None:
302312
"""
@@ -390,14 +400,16 @@ def api_post_request(self, url: str) -> requests.Response:
390400
return response
391401

392402
def execute(
393-
self,
394-
remove_embeds: bool = False,
395-
remove_files: bool = False,
403+
self,
404+
remove_embeds: bool = False,
405+
remove_files: bool = False,
396406
) -> Union[List[requests.Response], requests.Response]:
397407
"""
398408
executes the Webhook
399-
:param remove_embeds: if set to True, calls `self.remove_embeds()` to empty `self.embeds` after webhook is executed
400-
:param remove_files: if set to True, calls `self.remove_files()` to empty `self.files` after webhook is executed
409+
:param remove_embeds: if set to True, calls `self.remove_embeds()`
410+
to empty `self.embeds` after webhook is executed
411+
:param remove_files: if set to True, calls `self.remove_files()`
412+
to empty `self.files` after webhook is executed
401413
:return: Webhook response
402414
"""
403415
webhook_urls = self.url
@@ -408,22 +420,25 @@ def execute(
408420
for i, url in enumerate(webhook_urls):
409421
response = self.api_post_request(url)
410422
if response.status_code in [200, 204]:
411-
logger.debug(f"[{i+1}/{urls_len}] Webhook executed")
423+
logger.debug(f"[{i + 1}/{urls_len}] Webhook executed")
412424
elif response.status_code == 429 and self.rate_limit_retry:
413425
while response.status_code == 429:
414426
errors = json.loads(response.content.decode("utf-8"))
415427
wh_sleep = (int(errors["retry_after"]) / 1000) + 0.15
416428
time.sleep(wh_sleep)
417429
logger.error(
418-
f"Webhook rate limited: sleeping for {wh_sleep} " "seconds..."
430+
f"Webhook rate limited: sleeping for {wh_sleep} "
431+
"seconds..."
419432
)
420433
response = self.api_post_request(url)
421434
if response.status_code in [200, 204]:
422-
logger.debug(f"[{i+1}/{urls_len}] Webhook executed")
435+
logger.debug(f"[{i + 1}/{urls_len}] Webhook executed")
423436
break
424437
else:
425438
logger.error(
426-
f"[{i+1}/{urls_len}] Webhook status code {response.status_code}: {response.content.decode('utf-8')}"
439+
f"[{i + 1}/{urls_len}] Webhook status code "
440+
f"{response.status_code}: "
441+
f"{response.content.decode('utf-8')}"
427442
)
428443
responses.append(response)
429444
if remove_embeds:
@@ -433,8 +448,8 @@ def execute(
433448
return responses[0] if len(responses) == 1 else responses
434449

435450
def edit(
436-
self,
437-
sent_webhook: Union[List[requests.Response], requests.Response],
451+
self,
452+
sent_webhook: Union[List[requests.Response], requests.Response],
438453
) -> Union[List[requests.Response], requests.Response]:
439454
"""
440455
edits the webhook passed as a response
@@ -446,9 +461,12 @@ def edit(
446461
responses: List[requests.Response] = []
447462
for i, webhook in enumerate(sent_webhook):
448463
assert isinstance(webhook.content, bytes)
449-
previous_sent_message_id = json.loads(webhook.content.decode("utf-8"))["id"]
464+
previous_sent_message_id = json.loads(
465+
webhook.content.decode("utf-8")
466+
)["id"]
450467
url = (
451-
webhook.url.split("?")[0] + "/messages/" + str(previous_sent_message_id)
468+
webhook.url.split("?")[0] + "/messages/" + str(
469+
previous_sent_message_id)
452470
)
453471
# removes any query params
454472
if bool(self.files) is False:
@@ -471,28 +489,32 @@ def edit(
471489
)
472490
response = request()
473491
if response.status_code in [200, 204]:
474-
logger.debug(f"[{i+1}/{len(sent_webhook)}] Webhook edited")
492+
logger.debug(f"[{i + 1}/{len(sent_webhook)}] Webhook edited")
475493
elif response.status_code == 429 and self.rate_limit_retry:
476494
while response.status_code == 429:
477495
errors = json.loads(response.content.decode("utf-8"))
478496
wh_sleep = (int(errors["retry_after"]) / 1000) + 0.15
479497
time.sleep(wh_sleep)
480498
logger.error(
481-
f"Webhook rate limited: sleeping for {wh_sleep} seconds..."
499+
f"Webhook rate limited: sleeping for {wh_sleep} "
500+
f"seconds..."
482501
)
483502
response = request()
484503
if response.status_code in [200, 204]:
485-
logger.debug(f"[{i + 1}/{len(sent_webhook)}] Webhook edited")
504+
logger.debug(
505+
f"[{i + 1}/{len(sent_webhook)}] Webhook edited")
486506
break
487507
else:
488508
logger.error(
489-
f"[{i+1}/{len(sent_webhook)}] Webhook status code {response.status_code}: {response.content.decode('utf-8')}"
509+
f"[{i + 1}/{len(sent_webhook)}] Webhook status code "
510+
f"{response.status_code}: "
511+
f"{response.content.decode('utf-8')}"
490512
)
491513
responses.append(response)
492514
return responses[0] if len(responses) == 1 else responses
493515

494516
def delete(
495-
self, sent_webhook: Union[List["DiscordWebhook"], "DiscordWebhook"]
517+
self, sent_webhook: Union[List["DiscordWebhook"], "DiscordWebhook"]
496518
) -> Union[List[requests.Response], requests.Response]:
497519
"""
498520
deletes the webhook passed as a response
@@ -505,17 +527,20 @@ def delete(
505527
for i, webhook in enumerate(sent_webhook):
506528
assert isinstance(webhook.content, bytes)
507529
url = webhook.url.split("?")[0] # removes any query params
508-
previous_sent_message_id = json.loads(webhook.content.decode("utf-8"))["id"]
530+
previous_sent_message_id = json.loads(
531+
webhook.content.decode("utf-8")
532+
)["id"]
509533
response = requests.delete(
510534
url + "/messages/" + str(previous_sent_message_id),
511535
proxies=self.proxies,
512536
timeout=self.timeout,
513537
)
514538
if response.status_code in [200, 204]:
515-
logger.debug(f"[{i+1}/{len(sent_webhook)}] Webhook deleted")
539+
logger.debug(f"[{i + 1}/{len(sent_webhook)}] Webhook deleted")
516540
else:
517541
logger.error(
518-
f"[{i+1}/{len(sent_webhook)}] Webhook status code {response.status_code}: {response.content.decode('utf-8')}"
542+
f"[{i + 1}/{len(sent_webhook)}] Webhook status code "
543+
f"{response.status_code}: {response.content.decode('utf-8')}"
519544
)
520545
responses.append(response)
521546
return responses[0] if len(responses) == 1 else responses

tests/test_embed.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ def test_set_embed_url(self):
2727
def test_set_embed_timestamp(self):
2828
embed_timestamp = 1658504418.5660195
2929
self.embed.set_timestamp(embed_timestamp)
30-
self.assertEqual(self.embed.timestamp, str(datetime.utcfromtimestamp(embed_timestamp)))
30+
self.assertEqual(self.embed.timestamp,
31+
str(datetime.utcfromtimestamp(embed_timestamp)))
3132

3233
def test_set_embed_color(self):
3334
embed_color_as_str = "03b2f8"
@@ -46,7 +47,8 @@ def test_embed_set_footer(self):
4647
footer_text = "footer text"
4748
footer_icon_url = "footer icon url"
4849
footer_proxy_icon_url = "proxied footer icon url"
49-
self.embed.set_footer(text=footer_text, icon_url=footer_icon_url, proxy_icon_url=footer_proxy_icon_url)
50+
self.embed.set_footer(text=footer_text, icon_url=footer_icon_url,
51+
proxy_icon_url=footer_proxy_icon_url)
5052
self.assertEqual(self.embed.footer, {
5153
"text": footer_text,
5254
"icon_url": footer_icon_url,
@@ -58,7 +60,8 @@ def test_embed_set_image(self):
5860
image_proxy_url = "image proxy url"
5961
image_height = 500
6062
image_width = 500
61-
self.embed.set_image(url=image_url, proxy_url=image_proxy_url, height=image_height, width=image_width)
63+
self.embed.set_image(url=image_url, proxy_url=image_proxy_url,
64+
height=image_height, width=image_width)
6265
self.assertEqual(self.embed.image, {
6366
"url": image_url,
6467
"proxy_url": image_proxy_url,
@@ -71,7 +74,9 @@ def test_embed_set_thumbnail(self):
7174
thumbnail_proxy_url = "thumbnail proxy url"
7275
thumbnail_height = 500
7376
thumbnail_width = 500
74-
self.embed.set_thumbnail(url=thumbnail_url, proxy_url=thumbnail_proxy_url, height=thumbnail_height, width=thumbnail_width)
77+
self.embed.set_thumbnail(url=thumbnail_url,
78+
proxy_url=thumbnail_proxy_url,
79+
height=thumbnail_height, width=thumbnail_width)
7580
self.assertEqual(self.embed.thumbnail, {
7681
"url": thumbnail_url,
7782
"proxy_url": thumbnail_proxy_url,
@@ -83,7 +88,8 @@ def test_embed_set_video(self):
8388
video_url = "video url"
8489
video_height = 500
8590
video_width = 500
86-
self.embed.set_video(url=video_url, height=video_height, width=video_width)
91+
self.embed.set_video(url=video_url, height=video_height,
92+
width=video_width)
8793
self.assertEqual(self.embed.video, {
8894
"url": video_url,
8995
"height": video_height,
@@ -104,7 +110,8 @@ def test_embed_set_author(self):
104110
author_url = "author url"
105111
author_icon_url = "author icon url"
106112
author_proxy_icon_url = "author proxy icon url"
107-
self.embed.set_author(name=author_name, url=author_url, icon_url=author_icon_url,
113+
self.embed.set_author(name=author_name, url=author_url,
114+
icon_url=author_icon_url,
108115
proxy_icon_url=author_proxy_icon_url)
109116
self.assertEqual(self.embed.author, {
110117
"name": author_name,
@@ -119,7 +126,8 @@ def test_embed_set_field(self):
119126
field_value = "field value"
120127
field_inline = False
121128
self.assertEqual(len(self.embed.fields), field_counter)
122-
self.embed.add_embed_field(name=field_name, value=field_value, inline=field_inline)
129+
self.embed.add_embed_field(name=field_name, value=field_value,
130+
inline=field_inline)
123131
self.assertEqual(len(self.embed.fields), field_counter + 1)
124132
self.assertEqual(self.embed.fields[0], {
125133
"name": field_name,

0 commit comments

Comments
 (0)