Skip to content

Commit 83e3aad

Browse files
committed
Generalize Implementation A Bit More
1 parent 7bad2f7 commit 83e3aad

File tree

5 files changed

+49
-19
lines changed

5 files changed

+49
-19
lines changed

discord/abc.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1440,6 +1440,7 @@ async def send(
14401440
poll=None,
14411441
suppress=None,
14421442
silent=None,
1443+
voice_message=None,
14431444
):
14441445
"""|coro|
14451446
@@ -1567,7 +1568,7 @@ async def send(
15671568
flags = MessageFlags(
15681569
suppress_embeds=bool(suppress),
15691570
suppress_notifications=bool(silent),
1570-
is_voice_message=True,
1571+
is_voice_message=bool(voice_message),
15711572
).value
15721573

15731574
if stickers is not None:

discord/file.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ class File:
6363
The description of a file, used by Discord to display alternative text on images.
6464
spoiler: :class:`bool`
6565
Whether the attachment is a spoiler.
66+
waveform: Optional[:class:`str`]
67+
The base64 encoded bytearray representing a sampled waveform. Currently only for voice messages
68+
duration_secs: Optional[:class:`float`]
69+
The duration of the audio file. Currently only for voice messages
6670
"""
6771

6872
__slots__ = (
@@ -90,9 +94,9 @@ def __init__(
9094
*,
9195
description: str | None = None,
9296
spoiler: bool = False,
97+
waveform: str | None = None,
98+
duration_secs: float | None = None,
9399
):
94-
self.waveform = "37WKcJ6jlLSVnaabsbeip4KPmHJXUUEbExgFJE8J7iNPFggpKQkTNl95dobFqqe2tKubnbSTX3yLVVBFS4iqd4dbKmFvMChwfVRKfWFYWRpLaV9jlYtKWWZde6mtnYiDlGNUgmFAWWdRXGNsf2NBYnNcS1uDjm+qwK2urKe8uKqjZ2KGSjtbLUpTO0iDYSBSg6CzCk1LNDVAZnOAvNiUkLu8r8vPnFw6bXZbbXcn0vUU8q2q38Olyfb0y7OhlnV9u6N4zuAH9uI="
95-
self.duration_secs = 60.0
96100

97101
if isinstance(fp, io.IOBase):
98102
if not (fp.seekable() and fp.readable()):
@@ -131,6 +135,8 @@ def __init__(
131135
self.filename is not None and self.filename.startswith("SPOILER_")
132136
)
133137
self.description = description
138+
self.waveform = waveform
139+
self.duration_secs = duration_secs
134140

135141
def reset(self, *, seek: int | bool = True) -> None:
136142
# The `seek` parameter is needed because

discord/http.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@ async def close(self) -> None:
410410
# login management
411411

412412
async def static_login(self, token: str) -> user.User:
413+
# TODO: Remove This When Testing Is Done
413414
import logging
414415

415416
async def on_request_start(session, context, params: aiohttp.TraceRequestStartParams):
@@ -418,7 +419,10 @@ async def on_request_start(session, context, params: aiohttp.TraceRequestStartPa
418419

419420
async def on_request_chunk_sent(session, context, params: aiohttp.TraceRequestChunkSentParams):
420421
with open("output.txt", "a") as file:
421-
file.write(str(params.chunk))
422+
if byte := str(params.chunk).find(r"\x", 100) != -1:
423+
file.write(str(params.chunk)[:byte] + "\n")
424+
else:
425+
file.write(str(params.chunk) + "\n")
422426
# logging.getLogger('aiohttp.client').debug(f'Sent Chunk <{params}>')
423427

424428
trace_config = aiohttp.TraceConfig()
@@ -587,8 +591,8 @@ def send_multipart_helper(
587591
"id": index,
588592
"filename": file.filename,
589593
"description": file.description,
590-
"waveform": "37WKcJ6jlLSVnaabsbeip4KPmHJXUUEbExgFJE8J7iNPFggpKQkTNl95dobFqqe2tKubnbSTX3yLVVBFS4iqd4dbKmFvMChwfVRKfWFYWRpLaV9jlYtKWWZde6mtnYiDlGNUgmFAWWdRXGNsf2NBYnNcS1uDjm+qwK2urKe8uKqjZ2KGSjtbLUpTO0iDYSBSg6CzCk1LNDVAZnOAvNiUkLu8r8vPnFw6bXZbbXcn0vUU8q2q38Olyfb0y7OhlnV9u6N4zuAH9uI=",
591-
"duration_secs": 60.0,
594+
"waveform": file.waveform,
595+
"duration_secs": file.duration_secs,
592596
}
593597
)
594598
form.append(
@@ -655,16 +659,16 @@ def edit_multipart_helper(
655659
"id": index,
656660
"filename": file.filename,
657661
"description": file.description,
658-
"waveform": "37WKcJ6jlLSVnaabsbeip4KPmHJXUUEbExgFJE8J7iNPFggpKQkTNl95dobFqqe2tKubnbSTX3yLVVBFS4iqd4dbKmFvMChwfVRKfWFYWRpLaV9jlYtKWWZde6mtnYiDlGNUgmFAWWdRXGNsf2NBYnNcS1uDjm+qwK2urKe8uKqjZ2KGSjtbLUpTO0iDYSBSg6CzCk1LNDVAZnOAvNiUkLu8r8vPnFw6bXZbbXcn0vUU8q2q38Olyfb0y7OhlnV9u6N4zuAH9uI=",
659-
"duration_secs": 60.0
662+
"waveform": "AADz/+z/Pf+jBCD8pQE++8sDOv5H/WAH6PvR/uP8mfGCGnkCnAg58y77ewGH/U79AwXc9yUGlvloFmcF5fx9+kwFMQV8+GYDaf1oAToEmfm9APcB7gWs/mYEGgB5/VT9sfv3AAYCBALl/kX9jgDsA6UCLvtABNv/g/65/QP+xf2QAxsA8gKI/J3+1f5vBcAC5/ps/mQDigGn+FcEZAIZ/lYClP3a/rwEw/2g++wDpPoMB/36jAKPAC7+2wFo/IoBMgG2Aib9ivxqBFn7JwBn/LUEHP1R/T4EYv77AIoBd/wRBRX+DvwTA+4C0/l3AHQEiv98+n8B1wPj/DkA/gGp/zr7GQJv/HwAevlPBon8UP7bAyj/uAJp/SsCjPssAif/kP7bBIn9sQHq/9j94/+aADH+KQCcASj/1gHr/uYA/P1UAiz+XgEkANL9GgG8Adr+Mv/H/w8BgP+aASf+bAAgAE0AS/4hAWUASP/VAE3/5P5tAd39fQLq/zD/wADU/sgAo//T/zQBg/6nANf/8v/IAHH/iQCd/wQAEACa/3cA8v/s/x8A4v///xkA2v8QAA8A7P8LAPz/AAABAP3/AAAAAP//AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=",
663+
"duration_secs": 10.032
660664
}
661665
)
662666
form.append(
663667
{
664668
"name": f"files[{index}]",
665669
"value": file.fp,
666670
"filename": file.filename,
667-
"content_type": "application/octet-stream",
671+
"content_type": "audio/wav",
668672
}
669673
)
670674
if "attachments" not in payload:
@@ -1291,8 +1295,6 @@ def start_forum_thread(
12911295
"id": index,
12921296
"filename": file.filename,
12931297
"description": file.description,
1294-
"waveform": "37WKcJ6jlLSVnaabsbeip4KPmHJXUUEbExgFJE8J7iNPFggpKQkTNl95dobFqqe2tKubnbSTX3yLVVBFS4iqd4dbKmFvMChwfVRKfWFYWRpLaV9jlYtKWWZde6mtnYiDlGNUgmFAWWdRXGNsf2NBYnNcS1uDjm+qwK2urKe8uKqjZ2KGSjtbLUpTO0iDYSBSg6CzCk1LNDVAZnOAvNiUkLu8r8vPnFw6bXZbbXcn0vUU8q2q38Olyfb0y7OhlnV9u6N4zuAH9uI=",
1295-
"duration_secs": 60.0
12961298
}
12971299
)
12981300
form.append(

discord/interactions.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,7 @@ async def send_message(
840840
files: list[File] = None,
841841
poll: Poll = None,
842842
delete_after: float = None,
843+
voice_message: bool = False,
843844
) -> Interaction:
844845
"""|coro|
845846
@@ -877,6 +878,10 @@ async def send_message(
877878
The poll to send.
878879
879880
.. versionadded:: 2.6
881+
voice_message: :class:`bool`
882+
If the file should be treated as a voice message.
883+
884+
.. versionadded:: 2.7
880885
881886
Returns
882887
-------
@@ -917,8 +922,9 @@ async def send_message(
917922

918923
if ephemeral:
919924
payload["flags"] = 64
925+
if voice_message:
926+
payload["flags"] = payload.setdefault("flags", 0) + 8192
920927

921-
payload["flags"] = 8192
922928

923929
if view is not None:
924930
payload["components"] = view.to_components()

discord/webhook/async_.py

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ async def request(
156156
for p in multipart:
157157
form_data.add_field(**p)
158158
to_send = form_data
159-
print(to_send)
160159
try:
161160
async with session.request(
162161
method,
@@ -513,18 +512,23 @@ def create_interaction_response(
513512
"id": index,
514513
"filename": file.filename,
515514
"description": file.description,
516-
"waveform": "37WKcJ6jlLSVnaabsbeip4KPmHJXUUEbExgFJE8J7iNPFggpKQkTNl95dobFqqe2tKubnbSTX3yLVVBFS4iqd4dbKmFvMChwfVRKfWFYWRpLaV9jlYtKWWZde6mtnYiDlGNUgmFAWWdRXGNsf2NBYnNcS1uDjm+qwK2urKe8uKqjZ2KGSjtbLUpTO0iDYSBSg6CzCk1LNDVAZnOAvNiUkLu8r8vPnFw6bXZbbXcn0vUU8q2q38Olyfb0y7OhlnV9u6N4zuAH9uI=",
517-
"duration_secs": 60.0,
515+
"duration_secs": file.duration_secs,
516+
"waveform": file.waveform,
517+
# TODO: Fix content_type
518+
#"content_type": "audio/mp3",
518519
}
519520
)
520521
form.append(
521522
{
522523
"name": f"files[{index}]",
523524
"value": file.fp,
524525
"filename": file.filename,
525-
"content_type": "application/octet-stream",
526+
# TODO: Fix content_type
527+
#"content_type": "application/octet-stream",
528+
#"content_type": "audio/mp3",
526529
}
527530
)
531+
payload["flags"] = 1 << 13
528532
payload["attachments"] = attachments
529533
form[0]["value"] = utils._to_json(payload)
530534

@@ -631,6 +635,7 @@ def handle_message_parameters(
631635
allowed_mentions: AllowedMentions | None = MISSING,
632636
previous_allowed_mentions: AllowedMentions | None = None,
633637
suppress: bool = False,
638+
voice_message: bool = False,
634639
) -> ExecuteWebhookParameters:
635640
if files is not MISSING and file is not MISSING:
636641
raise TypeError("Cannot mix file and files keyword arguments.")
@@ -661,7 +666,7 @@ def handle_message_parameters(
661666
if username:
662667
payload["username"] = username
663668

664-
flags = MessageFlags(suppress_embeds=suppress, ephemeral=ephemeral)
669+
flags = MessageFlags(suppress_embeds=suppress, ephemeral=ephemeral, is_voice_message=voice_message)
665670
payload["flags"] = flags.value
666671

667672
if applied_tags is not MISSING:
@@ -690,15 +695,17 @@ def handle_message_parameters(
690695
"value": file.fp,
691696
"filename": file.filename,
692697
"content_type": "application/octet-stream",
693-
"waveform": "37WKcJ6jlLSVnaabsbeip4KPmHJXUUEbExgFJE8J7iNPFggpKQkTNl95dobFqqe2tKubnbSTX3yLVVBFS4iqd4dbKmFvMChwfVRKfWFYWRpLaV9jlYtKWWZde6mtnYiDlGNUgmFAWWdRXGNsf2NBYnNcS1uDjm+qwK2urKe8uKqjZ2KGSjtbLUpTO0iDYSBSg6CzCk1LNDVAZnOAvNiUkLu8r8vPnFw6bXZbbXcn0vUU8q2q38Olyfb0y7OhlnV9u6N4zuAH9uI=",
694-
"duration_secs": 60.0,
695698
}
696699
)
697700
_attachments.append(
698701
{
699702
"id": index,
700703
"filename": file.filename,
701704
"description": file.description,
705+
"waveform": file.waveform,
706+
"duration_secs": file.duration_secs,
707+
# TODO: Fix content_type
708+
"content_type": "audio/wav",
702709
}
703710
)
704711

@@ -1586,6 +1593,7 @@ async def send(
15861593
thread: Snowflake = MISSING,
15871594
thread_name: str | None = None,
15881595
applied_tags: list[Snowflake] = MISSING,
1596+
voice_message: bool = MISSING,
15891597
wait: Literal[True],
15901598
delete_after: float = None,
15911599
) -> WebhookMessage: ...
@@ -1609,6 +1617,7 @@ async def send(
16091617
thread: Snowflake = MISSING,
16101618
thread_name: str | None = None,
16111619
applied_tags: list[Snowflake] = MISSING,
1620+
voice_message: bool = MISSING,
16121621
wait: Literal[False] = ...,
16131622
delete_after: float = None,
16141623
) -> None: ...
@@ -1631,6 +1640,7 @@ async def send(
16311640
thread: Snowflake = MISSING,
16321641
thread_name: str | None = None,
16331642
applied_tags: list[Snowflake] = MISSING,
1643+
voice_message: bool = MISSING,
16341644
wait: bool = False,
16351645
delete_after: float = None,
16361646
) -> WebhookMessage | None:
@@ -1713,6 +1723,10 @@ async def send(
17131723
The poll to send.
17141724
17151725
.. versionadded:: 2.6
1726+
voice_message: :class:`bool`
1727+
If the file should be treated as a voice message.
1728+
1729+
.. versionadded:: 2.7
17161730
17171731
Returns
17181732
-------
@@ -1790,6 +1804,7 @@ async def send(
17901804
applied_tags=applied_tags,
17911805
allowed_mentions=allowed_mentions,
17921806
previous_allowed_mentions=previous_mentions,
1807+
voice_message=voice_message
17931808
)
17941809
adapter = async_context.get()
17951810
thread_id: int | None = None

0 commit comments

Comments
 (0)