From 9543397e02cf91aa7373814a8b821214a102fc73 Mon Sep 17 00:00:00 2001 From: Filipe Gomes Arante de Souza Date: Fri, 10 May 2024 12:37:09 -0300 Subject: [PATCH 1/4] wip: change to form data --- src/DiscordChannel.php | 44 +++++++++++++++++++++++++++++++++++++++--- src/DiscordMessage.php | 32 ++++++++++++++++++++++++++---- 2 files changed, 69 insertions(+), 7 deletions(-) diff --git a/src/DiscordChannel.php b/src/DiscordChannel.php index 7364192..1678a74 100644 --- a/src/DiscordChannel.php +++ b/src/DiscordChannel.php @@ -38,17 +38,55 @@ public function send($notifiable, Notification $notification) $message = $notification->toDiscord($notifiable); $data = [ - 'content' => $message->body + [ + 'name' => 'content', + 'contents' => $message->body, + ], ]; if (count($message->embed) > 0) { - $data['embeds'] = [$message->embed]; + $data[] = [ + 'name' => 'embeds', + 'contents' => [$message->embed], + ]; } if (count($message->components) > 0) { - $data['components'] = $message->components; + $data[] = [ + 'name' => 'components', + 'contents' => $message->components, + ]; } + foreach ($message->files ?? [] as $i => $file) { + $data[] = [ + 'name' => "files[$i]", + 'contents' => $file, + ]; + } + + $data = [ + 'multipart' => $data, + ]; + return $this->discord->send($channel, $data); + +// $data = [ +// 'content' => $message->body +// ]; +// +// if (count($message->embed) > 0) { +// $data['embeds'] = [$message->embed]; +// } +// +// if (count($message->components) > 0) { +// $data['components'] = $message->components; +// } +// +// if (count($message->files) > 0) { +// $data['files'] = $message->files; +// } + +// return $this->discord->send($channel, $data); } } diff --git a/src/DiscordMessage.php b/src/DiscordMessage.php index 1985993..eab7c89 100644 --- a/src/DiscordMessage.php +++ b/src/DiscordMessage.php @@ -25,26 +25,36 @@ class DiscordMessage */ public $components; + /** + * The files to be attached to the message. + * + * @var array + */ + public $files; + /** * @param string $body * @param array|null $embed * * @return static */ - public static function create($body = '', $embed = [], $components = []) + public static function create($body = '', $embed = [], $components = [], $files = []) { - return new static($body, $embed, $components); + return new static($body, $embed, $components, $files); } /** * @param string $body * @param array $embed + * @param array $components + * @param array $files */ - public function __construct($body = '', $embed = [], $components = []) + public function __construct($body = '', $embed = [], $components = [], $files = []) { $this->body = $body; $this->embed = $embed; $this->components = $components; + $this->files = $files; } /** @@ -63,7 +73,7 @@ public function body($body) /** * Set a single embedded object. - * + * * TODO: Refactor to enable multiple embeds. * See https://discord.com/developers/docs/resources/channel#create-message * @@ -91,4 +101,18 @@ public function components($components) return $this; } + + /** + * Set the files object. + * + * @param array $files + * + * @return $this + */ + public function files($files) + { + $this->files = $files; + + return $this; + } } From 26de8561a65a73e17fb00c9fc684a6c2c549268c Mon Sep 17 00:00:00 2001 From: Filipe Gomes Arante de Souza Date: Fri, 17 May 2024 12:19:55 -0300 Subject: [PATCH 2/4] wip: convert body array to form data array --- src/DiscordChannel.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/DiscordChannel.php b/src/DiscordChannel.php index 1678a74..10fc500 100644 --- a/src/DiscordChannel.php +++ b/src/DiscordChannel.php @@ -89,4 +89,22 @@ public function send($notifiable, Notification $notification) // return $this->discord->send($channel, $data); } + + public static function toFormData($key, array $data, array $formData = []): array + { + foreach ($data as $subKey => $value) { + $subKey = "$key\[$subKey\]"; + + if (is_array($value)) { + $formData = self::toFormData($subKey, $value, $formData); + } else { + $formData[] = [ + 'name' => $subKey, + 'contents' => $value + ]; + } + } + + return $formData; + } } From 6b452a4043139cbcf4abd119307cc5bb31b7fa23 Mon Sep 17 00:00:00 2001 From: Filipe Gomes Arante de Souza Date: Mon, 20 May 2024 12:34:16 -0300 Subject: [PATCH 3/4] wip: try send form data to discord api --- src/Discord.php | 3 +- src/DiscordChannel.php | 74 ++++++++++++++---------------------------- 2 files changed, 26 insertions(+), 51 deletions(-) diff --git a/src/Discord.php b/src/Discord.php index 6f1438f..f1da89e 100644 --- a/src/Discord.php +++ b/src/Discord.php @@ -86,7 +86,8 @@ protected function request($verb, $endpoint, array $data) 'headers' => [ 'Authorization' => 'Bot '.$this->token, ], - 'json' => $data, + 'multipart' => $data, +// 'json' => $data, ]); } catch (RequestException $exception) { if ($response = $exception->getResponse()) { diff --git a/src/DiscordChannel.php b/src/DiscordChannel.php index 10fc500..db8bf2b 100644 --- a/src/DiscordChannel.php +++ b/src/DiscordChannel.php @@ -38,71 +38,45 @@ public function send($notifiable, Notification $notification) $message = $notification->toDiscord($notifiable); $data = [ - [ - 'name' => 'content', - 'contents' => $message->body, - ], + 'content' => $message->body, ]; if (count($message->embed) > 0) { - $data[] = [ - 'name' => 'embeds', - 'contents' => [$message->embed], - ]; + $data['embeds'] = [$message->embed]; } if (count($message->components) > 0) { - $data[] = [ - 'name' => 'components', - 'contents' => $message->components, - ]; + $data['components'] = $message->components; } - foreach ($message->files ?? [] as $i => $file) { - $data[] = [ - 'name' => "files[$i]", - 'contents' => $file, - ]; + if (count($message->files) > 0) { + $data['files'] = $message->files; } - $data = [ - 'multipart' => $data, - ]; + $formData = []; + + foreach ($data as $key => $value) { + $formData = array_merge($formData, self::toFormData($key, $value)); + } - return $this->discord->send($channel, $data); - -// $data = [ -// 'content' => $message->body -// ]; -// -// if (count($message->embed) > 0) { -// $data['embeds'] = [$message->embed]; -// } -// -// if (count($message->components) > 0) { -// $data['components'] = $message->components; -// } -// -// if (count($message->files) > 0) { -// $data['files'] = $message->files; -// } - -// return $this->discord->send($channel, $data); + return $this->discord->send($channel, $formData); } - public static function toFormData($key, array $data, array $formData = []): array + public static function toFormData($key, mixed $data, array &$formData = []): array { + if (! is_array($data)) { + $formData[] = [ + 'name' => $key, + 'contents' => $data, + ]; + + return $formData; + } + foreach ($data as $subKey => $value) { - $subKey = "$key\[$subKey\]"; - - if (is_array($value)) { - $formData = self::toFormData($subKey, $value, $formData); - } else { - $formData[] = [ - 'name' => $subKey, - 'contents' => $value - ]; - } + $subKey = $key . '[' . $subKey . ']'; + + self::toFormData($subKey, $value, $formData); } return $formData; From 10b7b86b1502557b34370c85845b1dabc4be9e57 Mon Sep 17 00:00:00 2001 From: Filipe Gomes Arante de Souza Date: Tue, 21 May 2024 11:37:32 -0300 Subject: [PATCH 4/4] feat: convert api body to form data --- src/Discord.php | 1 - src/DiscordChannel.php | 40 +++++++++++++++------------------------- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/Discord.php b/src/Discord.php index f1da89e..61b6d18 100644 --- a/src/Discord.php +++ b/src/Discord.php @@ -87,7 +87,6 @@ protected function request($verb, $endpoint, array $data) 'Authorization' => 'Bot '.$this->token, ], 'multipart' => $data, -// 'json' => $data, ]); } catch (RequestException $exception) { if ($response = $exception->getResponse()) { diff --git a/src/DiscordChannel.php b/src/DiscordChannel.php index db8bf2b..ffaddaa 100644 --- a/src/DiscordChannel.php +++ b/src/DiscordChannel.php @@ -36,7 +36,13 @@ public function send($notifiable, Notification $notification) } $message = $notification->toDiscord($notifiable); + $formData = $this->toFormData($message); + return $this->discord->send($channel, $formData); + } + + private function toFormData(DiscordMessage $message): array + { $data = [ 'content' => $message->body, ]; @@ -49,34 +55,18 @@ public function send($notifiable, Notification $notification) $data['components'] = $message->components; } - if (count($message->files) > 0) { - $data['files'] = $message->files; - } - - $formData = []; - - foreach ($data as $key => $value) { - $formData = array_merge($formData, self::toFormData($key, $value)); - } - - return $this->discord->send($channel, $formData); - } + $formData = [ + [ + 'name' => 'payload_json', + 'contents' => json_encode($data), + ] + ]; - public static function toFormData($key, mixed $data, array &$formData = []): array - { - if (! is_array($data)) { + foreach ($message->files as $i => $file) { $formData[] = [ - 'name' => $key, - 'contents' => $data, + 'name' => 'files[' . $i . ']', + 'contents' => $file, ]; - - return $formData; - } - - foreach ($data as $subKey => $value) { - $subKey = $key . '[' . $subKey . ']'; - - self::toFormData($subKey, $value, $formData); } return $formData;