From 278eba03cc533ac02bdbfdb71c2fd99edfabb2b8 Mon Sep 17 00:00:00 2001 From: Vytautas Smilingis Date: Tue, 16 Jul 2024 21:34:07 +0200 Subject: [PATCH] Implemented ability to add attachments to message --- src/Components/ActionRow.php | 3 +- src/Components/Button.php | 3 +- src/Components/SelectOption.php | 3 +- src/Components/StringSelect.php | 3 +- src/Components/TextInput.php | 3 +- src/Contracts/DiscordComponent.php | 4 ++- src/Data/DiscordApplicationCommand.php | 3 +- src/Data/DiscordApplicationCommandOption.php | 3 +- src/Data/DiscordChannel.php | 3 +- src/Data/DiscordEmoji.php | 3 +- src/Data/DiscordGuild.php | 3 +- src/Data/DiscordInteraction.php | 3 +- src/Data/DiscordMember.php | 3 +- src/Data/DiscordMessage.php | 34 ++++++++++++++++++- src/Data/DiscordMessageComponent.php | 3 +- src/Data/DiscordMessageEmbed.php | 11 +++++- src/Data/DiscordMessageEmbedField.php | 3 +- src/Data/DiscordMessageEmbedImage.php | 16 +++++++++ src/Data/DiscordMessageFile.php | 19 +++++++++++ src/Data/DiscordModal.php | 3 +- src/Data/DiscordModalActionRow.php | 3 +- src/Data/DiscordModalComponent.php | 3 +- src/Data/DiscordModalTextInput.php | 3 +- src/Data/DiscordResponse.php | 3 +- src/Data/DiscordRole.php | 3 +- src/Data/DiscordUser.php | 3 +- src/Discord.php | 25 ++++++++++++-- src/Events/DiscordCommandInteractionEvent.php | 3 +- ...iscordMessageComponentInteractionEvent.php | 3 +- src/Events/DiscordModalInteractionEvent.php | 3 +- 30 files changed, 151 insertions(+), 30 deletions(-) create mode 100644 src/Data/DiscordMessageEmbedImage.php create mode 100644 src/Data/DiscordMessageFile.php diff --git a/src/Components/ActionRow.php b/src/Components/ActionRow.php index f0c91b2..f55e67c 100644 --- a/src/Components/ActionRow.php +++ b/src/Components/ActionRow.php @@ -14,7 +14,8 @@ class ActionRow extends Data implements DiscordComponent public function __construct( /** @var Collection */ public Collection $components = new Collection(), - ) {} + ) { + } public static function new(): self { diff --git a/src/Components/Button.php b/src/Components/Button.php index 5638a0b..9bb33e0 100644 --- a/src/Components/Button.php +++ b/src/Components/Button.php @@ -19,7 +19,8 @@ public function __construct( public ?bool $disabled = null, public ?string $url = null, public ButtonStyle $style = ButtonStyle::Primary, - ) {} + ) { + } public static function new(): self { diff --git a/src/Components/SelectOption.php b/src/Components/SelectOption.php index a6546f3..63cc4b2 100644 --- a/src/Components/SelectOption.php +++ b/src/Components/SelectOption.php @@ -13,7 +13,8 @@ public function __construct( public ?string $description = null, public ?DiscordEmoji $emoji = null, public ?bool $default = null, - ) {} + ) { + } public static function new(string $label, string $value): self { diff --git a/src/Components/StringSelect.php b/src/Components/StringSelect.php index 8343e01..718c1dc 100644 --- a/src/Components/StringSelect.php +++ b/src/Components/StringSelect.php @@ -19,7 +19,8 @@ public function __construct( public ?int $min_values = 1, public ?int $max_values = 1, public ?bool $disabled = false, - ) {} + ) { + } public static function new(string $custom_id): self { diff --git a/src/Components/TextInput.php b/src/Components/TextInput.php index 607dabc..6a9c795 100644 --- a/src/Components/TextInput.php +++ b/src/Components/TextInput.php @@ -21,7 +21,8 @@ public function __construct( public ?int $min_length = null, public ?int $max_length = null, public TextInputStyle $style = TextInputStyle::Short, - ) {} + ) { + } public static function new(string $custom_id, string $label): self { diff --git a/src/Contracts/DiscordComponent.php b/src/Contracts/DiscordComponent.php index b6b7401..4d1799b 100644 --- a/src/Contracts/DiscordComponent.php +++ b/src/Contracts/DiscordComponent.php @@ -2,4 +2,6 @@ namespace Plytas\Discord\Contracts; -interface DiscordComponent {} +interface DiscordComponent +{ +} diff --git a/src/Data/DiscordApplicationCommand.php b/src/Data/DiscordApplicationCommand.php index d69c063..c505c27 100644 --- a/src/Data/DiscordApplicationCommand.php +++ b/src/Data/DiscordApplicationCommand.php @@ -14,7 +14,8 @@ public function __construct( public ?string $description = null, /** @var Collection */ public ?Collection $options = null, - ) {} + ) { + } public static function new(string $name, CommandType $type): self { diff --git a/src/Data/DiscordApplicationCommandOption.php b/src/Data/DiscordApplicationCommandOption.php index d77136a..b6080e5 100644 --- a/src/Data/DiscordApplicationCommandOption.php +++ b/src/Data/DiscordApplicationCommandOption.php @@ -14,7 +14,8 @@ public function __construct( public ?string $description = null, /** @var Collection */ public ?Collection $options = null, - ) {} + ) { + } public static function new(string $name, CommandOptionType $type): self { diff --git a/src/Data/DiscordChannel.php b/src/Data/DiscordChannel.php index 8997f06..a57e89e 100644 --- a/src/Data/DiscordChannel.php +++ b/src/Data/DiscordChannel.php @@ -14,5 +14,6 @@ public function __construct( public string $guild_id, public ?string $parent_id, public int $position, - ) {} + ) { + } } diff --git a/src/Data/DiscordEmoji.php b/src/Data/DiscordEmoji.php index 2a4719c..eb0a18b 100644 --- a/src/Data/DiscordEmoji.php +++ b/src/Data/DiscordEmoji.php @@ -8,7 +8,8 @@ class DiscordEmoji extends Data { public function __construct( public string $name, - ) {} + ) { + } public static function new(string $name): self { diff --git a/src/Data/DiscordGuild.php b/src/Data/DiscordGuild.php index 1ebefec..a01e037 100644 --- a/src/Data/DiscordGuild.php +++ b/src/Data/DiscordGuild.php @@ -10,5 +10,6 @@ public function __construct( public string $id, public string $name, public ?string $icon = null, - ) {} + ) { + } } diff --git a/src/Data/DiscordInteraction.php b/src/Data/DiscordInteraction.php index fec6232..718d842 100644 --- a/src/Data/DiscordInteraction.php +++ b/src/Data/DiscordInteraction.php @@ -24,7 +24,8 @@ public function __construct( private ?DiscordApplicationCommand $applicationCommand = null, private ?DiscordMessageComponent $messageComponent = null, private ?DiscordModalComponent $modalComponent = null, - ) {} + ) { + } public function pong(): DiscordResponse { diff --git a/src/Data/DiscordMember.php b/src/Data/DiscordMember.php index 4957871..b7cb1ed 100644 --- a/src/Data/DiscordMember.php +++ b/src/Data/DiscordMember.php @@ -8,5 +8,6 @@ class DiscordMember extends Data { public function __construct( public ?DiscordUser $user = null, - ) {} + ) { + } } diff --git a/src/Data/DiscordMessage.php b/src/Data/DiscordMessage.php index 930f4ad..e9d7f40 100644 --- a/src/Data/DiscordMessage.php +++ b/src/Data/DiscordMessage.php @@ -15,7 +15,12 @@ public function __construct( public Collection $embeds = new Collection(), /** @var Collection */ public Collection $components = new Collection(), - ) {} + + public ?array $attachments = null, + /** @var Collection */ + private Collection $files = new Collection(), + ) { + } public static function new(): self { @@ -53,4 +58,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/DiscordMessageComponent.php b/src/Data/DiscordMessageComponent.php index ff77ad7..c7890b9 100644 --- a/src/Data/DiscordMessageComponent.php +++ b/src/Data/DiscordMessageComponent.php @@ -15,5 +15,6 @@ public function __construct( * @var array */ public ?array $values, - ) {} + ) { + } } diff --git a/src/Data/DiscordMessageEmbed.php b/src/Data/DiscordMessageEmbed.php index 66f180f..c932cf7 100644 --- a/src/Data/DiscordMessageEmbed.php +++ b/src/Data/DiscordMessageEmbed.php @@ -14,7 +14,9 @@ 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 +54,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/DiscordMessageEmbedField.php b/src/Data/DiscordMessageEmbedField.php index 841529d..7f00ada 100644 --- a/src/Data/DiscordMessageEmbedField.php +++ b/src/Data/DiscordMessageEmbedField.php @@ -10,5 +10,6 @@ public function __construct( public string $name, public string $value, public bool $inline = false, - ) {} + ) { + } } diff --git a/src/Data/DiscordMessageEmbedImage.php b/src/Data/DiscordMessageEmbedImage.php new file mode 100644 index 0000000..389296e --- /dev/null +++ b/src/Data/DiscordMessageEmbedImage.php @@ -0,0 +1,16 @@ + */ public Collection $components = new Collection(), - ) {} + ) { + } public static function new(string $custom_id, string $title): self { diff --git a/src/Data/DiscordModalActionRow.php b/src/Data/DiscordModalActionRow.php index 4a5583e..48a7843 100644 --- a/src/Data/DiscordModalActionRow.php +++ b/src/Data/DiscordModalActionRow.php @@ -12,5 +12,6 @@ public function __construct( public ComponentType $type, /** @var Collection */ public Collection $components, - ) {} + ) { + } } diff --git a/src/Data/DiscordModalComponent.php b/src/Data/DiscordModalComponent.php index 9301aa2..39c09b4 100644 --- a/src/Data/DiscordModalComponent.php +++ b/src/Data/DiscordModalComponent.php @@ -11,7 +11,8 @@ public function __construct( public string $custom_id, /** @var Collection */ public Collection $components, - ) {} + ) { + } /** * @return Collection diff --git a/src/Data/DiscordModalTextInput.php b/src/Data/DiscordModalTextInput.php index 7d143fd..aa85c62 100644 --- a/src/Data/DiscordModalTextInput.php +++ b/src/Data/DiscordModalTextInput.php @@ -11,5 +11,6 @@ public function __construct( public string $custom_id, public string $value, public ComponentType $type, - ) {} + ) { + } } diff --git a/src/Data/DiscordResponse.php b/src/Data/DiscordResponse.php index 7aac8aa..e8b9641 100644 --- a/src/Data/DiscordResponse.php +++ b/src/Data/DiscordResponse.php @@ -11,7 +11,8 @@ class DiscordResponse extends Data public function __construct( public ResponseType $type, public Data|Optional $data, - ) {} + ) { + } public static function pong(): self { diff --git a/src/Data/DiscordRole.php b/src/Data/DiscordRole.php index a557c26..3ab75a4 100644 --- a/src/Data/DiscordRole.php +++ b/src/Data/DiscordRole.php @@ -11,7 +11,8 @@ public function __construct( public string $name, public ?string $description, public int $color, - ) {} + ) { + } public function colorToHex(): string { diff --git a/src/Data/DiscordUser.php b/src/Data/DiscordUser.php index c6254cb..56e9c33 100644 --- a/src/Data/DiscordUser.php +++ b/src/Data/DiscordUser.php @@ -14,5 +14,6 @@ public function __construct( public ?string $avatar = null, public ?bool $bot = false, public ?bool $system = false, - ) {} + ) { + } } diff --git a/src/Discord.php b/src/Discord.php index 3b29cba..afce150 100755 --- a/src/Discord.php +++ b/src/Discord.php @@ -37,7 +37,6 @@ public function __construct() $this->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 diff --git a/src/Events/DiscordCommandInteractionEvent.php b/src/Events/DiscordCommandInteractionEvent.php index 927b184..70fbf08 100644 --- a/src/Events/DiscordCommandInteractionEvent.php +++ b/src/Events/DiscordCommandInteractionEvent.php @@ -11,5 +11,6 @@ class DiscordCommandInteractionEvent public function __construct( public DiscordInteraction $interaction - ) {} + ) { + } } diff --git a/src/Events/DiscordMessageComponentInteractionEvent.php b/src/Events/DiscordMessageComponentInteractionEvent.php index 94a211d..5160fb1 100644 --- a/src/Events/DiscordMessageComponentInteractionEvent.php +++ b/src/Events/DiscordMessageComponentInteractionEvent.php @@ -11,5 +11,6 @@ class DiscordMessageComponentInteractionEvent public function __construct( public DiscordInteraction $interaction - ) {} + ) { + } } diff --git a/src/Events/DiscordModalInteractionEvent.php b/src/Events/DiscordModalInteractionEvent.php index 58559bc..ae2c43c 100644 --- a/src/Events/DiscordModalInteractionEvent.php +++ b/src/Events/DiscordModalInteractionEvent.php @@ -11,5 +11,6 @@ class DiscordModalInteractionEvent public function __construct( public DiscordInteraction $interaction - ) {} + ) { + } }