10) { throw new TelegramException('Media array must include 2-10 items'); } $hasLocalFiles = false; $attachments = []; $processedMedia = []; foreach ($parameters['media'] as $index => $mediaItem) { if (!($mediaItem instanceof InputMedia)) { throw new TelegramException('Invalid media item type'); } $mediaArray = $mediaItem->toArray(); // Check for local files in the media if (isset($mediaArray['media']) && is_string($mediaArray['media']) && file_exists($mediaArray['media']) && is_file($mediaArray['media'])) { $hasLocalFiles = true; $attachmentKey = "file{$index}"; $attachments[$attachmentKey] = $mediaArray['media']; $mediaArray['media'] = "attach://{$attachmentKey}"; } // Check for local thumbnail if (isset($mediaArray['thumbnail']) && is_string($mediaArray['thumbnail']) && file_exists($mediaArray['thumbnail']) && is_file($mediaArray['thumbnail'])) { $hasLocalFiles = true; $thumbKey = "thumb{$index}"; $attachments[$thumbKey] = $mediaArray['thumbnail']; $mediaArray['thumbnail'] = "attach://{$thumbKey}"; } $processedMedia[] = $mediaArray; } // Update parameters with processed media $parameters['media'] = json_encode($processedMedia); // Handle reply parameters if (isset($parameters['reply_parameters']) && $parameters['reply_parameters'] instanceof ReplyParameters) { $parameters['reply_parameters'] = $parameters['reply_parameters']->toArray(); } $curl = $hasLocalFiles ? self::buildMultiUpload($bot, Methods::SEND_MEDIA_GROUP->value, $attachments, $parameters) : self::buildPost($bot, Methods::SEND_MEDIA_GROUP->value, $parameters); $result = self::executeCurl($curl); return array_map(function ($messageData) {return Message::fromArray($messageData);}, $result); } /** * @inheritDoc */ public static function getRequiredParameters(): ?array { return [ 'chat_id', 'media' ]; } /** * @inheritDoc */ public static function getOptionalParameters(): ?array { return [ 'business_connection_id', 'message_thread_id', 'disable_notification', 'protect_content', 'message_effect_id', 'reply_parameters' ]; } }