From fbdd3f8b5d4ec1e37560d7bc7d2f09d26b3dfa60 Mon Sep 17 00:00:00 2001 From: Valithor Obsidion Date: Fri, 7 Nov 2025 13:33:33 -0500 Subject: [PATCH 1/6] MessageRepository::build --- .../Repository/Channel/MessageRepository.php | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/Discord/Repository/Channel/MessageRepository.php b/src/Discord/Repository/Channel/MessageRepository.php index 4271857d7..6ab688deb 100755 --- a/src/Discord/Repository/Channel/MessageRepository.php +++ b/src/Discord/Repository/Channel/MessageRepository.php @@ -13,9 +13,15 @@ namespace Discord\Repository\Channel; +use Discord\Builders\MessageBuilder; use Discord\Http\Endpoint; +use Discord\Http\Exceptions\NoPermissionsException; +use Discord\Parts\Channel\Channel; use Discord\Parts\Channel\Message; use Discord\Repository\AbstractRepository; +use React\Promise\PromiseInterface; + +use function React\Promise\reject; /** * Contains messages sent to a channel. @@ -57,4 +63,49 @@ public function __construct($discord, array $vars = []) unset($vars['thread_id']); // For thread parent::__construct($discord, $vars); } + + /** + * Attempts to create a message in a channel. + * + * @since 10.41.0 + * + * @link https://discord.com/developers/docs/resources/message#create-message + * + * @param Channel|string $channel Channel ID or Channel object. + * @param MessageBuilder $message MessageBuilder instance. + * @param string|null $reason Optional audit log reason. + + * @return PromiseInterface + */ + public function build($channel, MessageBuilder $message, ?string $reason = null): PromiseInterface + { + if (! is_string($channel)) { + if (method_exists($channel, 'getBotPermissions')) { + $botperms = $channel->getBotPermissions(); + if ($botperms && ! $botperms->send_messages) { + return reject(new NoPermissionsException("You do not have permission to send messages in channel {$channel->id}.")); + } + } + $channelId = $channel->id; + } else { + $channelId = $channel; + } + + $headers = []; + if ($reason !== null) { + $headers['X-Audit-Log-Reason'] = $reason; + } + + $endpoint = Endpoint::bind(Endpoint::CHANNEL_MESSAGES, $channelId); + + if ($message->requiresMultipart()) { + $multipart = $message->toMultipart(); + + return $this->http->post($endpoint, (string) $multipart, array_merge($headers, $multipart->getHeaders())) + ->then(fn ($response) => $this->factory->part($this->class, (array) $response, true)); + } + + return $this->http->post($endpoint, $message->jsonSerialize(), $headers) + ->then(fn ($response) => $this->factory->part($this->class, (array) $response, true)); + } } From d3c8723a55b77d8e4f6bd28f30a5116222cf494a Mon Sep 17 00:00:00 2001 From: Valithor Obsidion Date: Fri, 7 Nov 2025 14:19:10 -0500 Subject: [PATCH 2/6] X-Audit-Log-Reason header isn't supported --- src/Discord/Repository/Channel/MessageRepository.php | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/Discord/Repository/Channel/MessageRepository.php b/src/Discord/Repository/Channel/MessageRepository.php index 6ab688deb..b5d4640ac 100755 --- a/src/Discord/Repository/Channel/MessageRepository.php +++ b/src/Discord/Repository/Channel/MessageRepository.php @@ -73,11 +73,10 @@ public function __construct($discord, array $vars = []) * * @param Channel|string $channel Channel ID or Channel object. * @param MessageBuilder $message MessageBuilder instance. - * @param string|null $reason Optional audit log reason. * @return PromiseInterface */ - public function build($channel, MessageBuilder $message, ?string $reason = null): PromiseInterface + public function build($channel, MessageBuilder $message): PromiseInterface { if (! is_string($channel)) { if (method_exists($channel, 'getBotPermissions')) { @@ -91,21 +90,16 @@ public function build($channel, MessageBuilder $message, ?string $reason = null) $channelId = $channel; } - $headers = []; - if ($reason !== null) { - $headers['X-Audit-Log-Reason'] = $reason; - } - $endpoint = Endpoint::bind(Endpoint::CHANNEL_MESSAGES, $channelId); if ($message->requiresMultipart()) { $multipart = $message->toMultipart(); - return $this->http->post($endpoint, (string) $multipart, array_merge($headers, $multipart->getHeaders())) + return $this->http->post($endpoint, (string) $multipart, $multipart->getHeaders()) ->then(fn ($response) => $this->factory->part($this->class, (array) $response, true)); } - return $this->http->post($endpoint, $message->jsonSerialize(), $headers) + return $this->http->post($endpoint, $message) ->then(fn ($response) => $this->factory->part($this->class, (array) $response, true)); } } From 505b44088c8d712c643c8af41b585f75291036ae Mon Sep 17 00:00:00 2001 From: Valithor Obsidion Date: Sat, 8 Nov 2025 10:15:14 -0500 Subject: [PATCH 3/6] Optimization --- .../Repository/Channel/MessageRepository.php | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/Discord/Repository/Channel/MessageRepository.php b/src/Discord/Repository/Channel/MessageRepository.php index b5d4640ac..d6869a18c 100755 --- a/src/Discord/Repository/Channel/MessageRepository.php +++ b/src/Discord/Repository/Channel/MessageRepository.php @@ -18,6 +18,7 @@ use Discord\Http\Exceptions\NoPermissionsException; use Discord\Parts\Channel\Channel; use Discord\Parts\Channel\Message; +use Discord\Parts\Thread\Thread; use Discord\Repository\AbstractRepository; use React\Promise\PromiseInterface; @@ -79,18 +80,16 @@ public function __construct($discord, array $vars = []) public function build($channel, MessageBuilder $message): PromiseInterface { if (! is_string($channel)) { - if (method_exists($channel, 'getBotPermissions')) { - $botperms = $channel->getBotPermissions(); - if ($botperms && ! $botperms->send_messages) { - return reject(new NoPermissionsException("You do not have permission to send messages in channel {$channel->id}.")); - } + if (! $channel instanceof Channel || $channel instanceof Thread) { + return reject(new \InvalidArgumentException('The $channel parameter must be a Channel or Thread instance or a string channel ID.')); + } + $botperms = $channel->getBotPermissions(); + if ($botperms && ! $botperms->send_messages) { + return reject(new NoPermissionsException("You do not have permission to send messages in channel {$channel->id}.")); } - $channelId = $channel->id; - } else { - $channelId = $channel; } - $endpoint = Endpoint::bind(Endpoint::CHANNEL_MESSAGES, $channelId); + $endpoint = Endpoint::bind(Endpoint::CHANNEL_MESSAGES, $channel); if ($message->requiresMultipart()) { $multipart = $message->toMultipart(); From 10ba09595436dd392363e969ff5231ecc3b7b99a Mon Sep 17 00:00:00 2001 From: Valithor Obsidion Date: Sat, 8 Nov 2025 10:44:41 -0500 Subject: [PATCH 4/6] PHPDocs --- src/Discord/Repository/Channel/MessageRepository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord/Repository/Channel/MessageRepository.php b/src/Discord/Repository/Channel/MessageRepository.php index d6869a18c..ea8f6fd4f 100755 --- a/src/Discord/Repository/Channel/MessageRepository.php +++ b/src/Discord/Repository/Channel/MessageRepository.php @@ -72,7 +72,7 @@ public function __construct($discord, array $vars = []) * * @link https://discord.com/developers/docs/resources/message#create-message * - * @param Channel|string $channel Channel ID or Channel object. + * @param Channel|string $channel Channel or Thread object, or channel ID. * @param MessageBuilder $message MessageBuilder instance. * @return PromiseInterface From 1b716771c9ed97053f513ac638f8edd87e947c59 Mon Sep 17 00:00:00 2001 From: Valithor Obsidion Date: Sat, 8 Nov 2025 22:52:31 -0500 Subject: [PATCH 5/6] Fix or --- src/Discord/Repository/Channel/MessageRepository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord/Repository/Channel/MessageRepository.php b/src/Discord/Repository/Channel/MessageRepository.php index ea8f6fd4f..5e8b381d0 100755 --- a/src/Discord/Repository/Channel/MessageRepository.php +++ b/src/Discord/Repository/Channel/MessageRepository.php @@ -80,7 +80,7 @@ public function __construct($discord, array $vars = []) public function build($channel, MessageBuilder $message): PromiseInterface { if (! is_string($channel)) { - if (! $channel instanceof Channel || $channel instanceof Thread) { + if (! $channel instanceof Channel || ! $channel instanceof Thread) { return reject(new \InvalidArgumentException('The $channel parameter must be a Channel or Thread instance or a string channel ID.')); } $botperms = $channel->getBotPermissions(); From 1d2002cf6dda46541a80a789421231853800c25a Mon Sep 17 00:00:00 2001 From: Valithor Obsidion Date: Sun, 9 Nov 2025 13:24:39 -0500 Subject: [PATCH 6/6] Tweak reject message --- src/Discord/Repository/Channel/MessageRepository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Discord/Repository/Channel/MessageRepository.php b/src/Discord/Repository/Channel/MessageRepository.php index 5e8b381d0..b7997edf6 100755 --- a/src/Discord/Repository/Channel/MessageRepository.php +++ b/src/Discord/Repository/Channel/MessageRepository.php @@ -81,7 +81,7 @@ public function build($channel, MessageBuilder $message): PromiseInterface { if (! is_string($channel)) { if (! $channel instanceof Channel || ! $channel instanceof Thread) { - return reject(new \InvalidArgumentException('The $channel parameter must be a Channel or Thread instance or a string channel ID.')); + return reject(new \InvalidArgumentException('Channel must be a Channel or Thread instance or a string channel ID.')); } $botperms = $channel->getBotPermissions(); if ($botperms && ! $botperms->send_messages) {