From 4bfbc97fa9409cc94e55d76034d3527529ee823d Mon Sep 17 00:00:00 2001 From: Vytautas Smilingis Date: Tue, 16 Jul 2024 21:39:58 +0200 Subject: [PATCH] Implemented ability to add attachments to message (#6) * Implemented ability to add attachments to message * Fix styling * Fix phpstan issue --------- Co-authored-by: Plytas --- src/Data/DiscordMessage.php | 31 +++++++++++++++++++++++++++ src/Data/DiscordMessageEmbed.php | 8 +++++++ src/Data/DiscordMessageEmbedImage.php | 15 +++++++++++++ src/Data/DiscordMessageFile.php | 18 ++++++++++++++++ src/Discord.php | 25 ++++++++++++++++++--- 5 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 src/Data/DiscordMessageEmbedImage.php create mode 100644 src/Data/DiscordMessageFile.php diff --git a/src/Data/DiscordMessage.php b/src/Data/DiscordMessage.php index 930f4ad..bd1ee3a 100644 --- a/src/Data/DiscordMessage.php +++ b/src/Data/DiscordMessage.php @@ -15,6 +15,10 @@ public function __construct( public Collection $embeds = new Collection(), /** @var Collection */ public Collection $components = new Collection(), + /** @var array */ + public ?array $attachments = null, + /** @var Collection */ + private Collection $files = new Collection(), ) {} public static function new(): self @@ -53,4 +57,31 @@ public function addComponent(DiscordComponent $component): self return $this; } + + public function removeAttachments(): self + { + $this->attachments = []; + + return $this; + } + + public function addFile(DiscordMessageFile $file): self + { + $this->files->push($file); + + return $this; + } + + /** + * @return Collection + */ + public function getFiles(): Collection + { + return $this->files; + } + + public function isMultipart(): bool + { + return $this->files->isNotEmpty(); + } } diff --git a/src/Data/DiscordMessageEmbed.php b/src/Data/DiscordMessageEmbed.php index 66f180f..a050ac8 100644 --- a/src/Data/DiscordMessageEmbed.php +++ b/src/Data/DiscordMessageEmbed.php @@ -14,6 +14,7 @@ public function __construct( public int|EmbedColor $color = EmbedColor::Default, /** @var Collection */ public Collection $fields = new Collection(), + public ?DiscordMessageEmbedImage $image = null, ) {} public static function new(): self @@ -52,4 +53,11 @@ public function addField(?DiscordMessageEmbedField $field): self return $this; } + + public function setImage(?DiscordMessageEmbedImage $image): self + { + $this->image = $image; + + return $this; + } } diff --git a/src/Data/DiscordMessageEmbedImage.php b/src/Data/DiscordMessageEmbedImage.php new file mode 100644 index 0000000..d71482d --- /dev/null +++ b/src/Data/DiscordMessageEmbedImage.php @@ -0,0 +1,15 @@ +client = Http::baseUrl('https://discord.com/api/v10') ->withUserAgent("DiscordBot ($appUrl, 1)") ->acceptJson() - ->asJson() ->withToken($botToken, 'Bot'); } @@ -64,12 +63,32 @@ public function deleteInteractionMessage(DiscordInteraction $interaction): Respo public function createMessage(string $channelId, DiscordMessage $message): Response { - return $this->client->post("/channels/{$channelId}/messages", $message->toArray()); + if ($message->isMultipart()) { + $this->client->attach('payload_json', $message->toJson()); + + foreach ($message->getFiles() as $index => $file) { + $this->client->attach("files[{$index}]", $file->content, $file->filename); + } + + return $this->client->post("/channels/{$channelId}/messages"); + } + + return $this->client->asJson()->post("/channels/{$channelId}/messages", $message->toArray()); } public function updateMessage(string $channelId, string $messageId, DiscordMessage $message): Response { - return $this->client->patch("/channels/{$channelId}/messages/{$messageId}", $message->toArray()); + if ($message->isMultipart()) { + $this->client->attach('payload_json', $message->toJson()); + + foreach ($message->getFiles() as $index => $file) { + $this->client->attach("files[{$index}]", $file->content, $file->filename); + } + + return $this->client->patch("/channels/{$channelId}/messages/{$messageId}"); + } + + return $this->client->asJson()->patch("/channels/{$channelId}/messages/{$messageId}", $message->toArray()); } public function deleteMessage(string $channelId, string $messageId): Response