diff --git a/src/Factory/Api/Mastodon/ScheduledStatus.php b/src/Factory/Api/Mastodon/ScheduledStatus.php index ce79cc8022..f4b805a50a 100644 --- a/src/Factory/Api/Mastodon/ScheduledStatus.php +++ b/src/Factory/Api/Mastodon/ScheduledStatus.php @@ -23,6 +23,8 @@ namespace Friendica\Factory\Api\Mastodon; use Friendica\BaseFactory; use Friendica\Database\Database; +use Friendica\Model\ItemURI; +use Friendica\Model\Photo; use Friendica\Model\Post; use Friendica\Network\HTTPException; use Psr\Log\LoggerInterface; @@ -57,6 +59,17 @@ class ScheduledStatus extends BaseFactory throw new HTTPException\NotFoundException('Scheduled status with ID ' . $id . ' not found for user ' . $uid . '.'); } - return new \Friendica\Object\Api\Mastodon\ScheduledStatus($delayed_post, $parameters); + $media_ids = []; + foreach ($parameters['attachments'] as $attachment) { + $media_ids[] = Photo::getIdForName($attachment['url']); + } + + if (isset($parameters['item']['thr-parent']) && ($parameters['item']['gravity'] ?? GRAVITY_PARENT != GRAVITY_PARENT)) { + $in_reply_to_id = ItemURI::getIdByURI($parameters['item']['thr-parent']); + } else { + $in_reply_to_id= null; + } + + return new \Friendica\Object\Api\Mastodon\ScheduledStatus($delayed_post, $parameters, $media_ids, $in_reply_to_id); } } diff --git a/src/Model/Photo.php b/src/Model/Photo.php index 30e6668987..26369a3540 100644 --- a/src/Model/Photo.php +++ b/src/Model/Photo.php @@ -841,13 +841,28 @@ class Photo * @throws \Exception */ public static function isLocal($name) + { + return (bool)self::getIdForName($name); + } + + /** + * Return the id of a local photo + * + * @param string $name Picture link + * @return int + */ + public static function getIdForName($name) { $data = self::getResourceData($name); if (empty($data)) { - return false; + return 0; } - return DBA::exists('photo', ['resource-id' => $data['guid'], 'scale' => $data['scale']]); + $photo = DBA::selectFirst('photo', ['id'], ['resource-id' => $data['guid'], 'scale' => $data['scale']]); + if (!empty($photo['id'])) { + return $photo['id']; + } + return 0; } /** diff --git a/src/Model/Post/Delayed.php b/src/Model/Post/Delayed.php index 49bf77a834..0bae1a8e2e 100644 --- a/src/Model/Post/Delayed.php +++ b/src/Model/Post/Delayed.php @@ -134,6 +134,12 @@ class Delayed return []; } + // Make sure to only publish the attachments in the dedicated array field + if (empty($parameters[3]) && !empty($parameters[0]['attachments'])) { + $parameters[3] = $parameters[0]['attachments']; + unset($parameters[0]['attachments']); + } + return [ 'parameters' => $delayed, 'item' => $parameters[0], diff --git a/src/Module/Api/Mastodon/ScheduledStatuses.php b/src/Module/Api/Mastodon/ScheduledStatuses.php index fab70738f0..d18e51d9d5 100644 --- a/src/Module/Api/Mastodon/ScheduledStatuses.php +++ b/src/Module/Api/Mastodon/ScheduledStatuses.php @@ -72,7 +72,7 @@ class ScheduledStatuses extends BaseApi $uid = self::getCurrentUserID(); if (isset($parameters['id'])) { - System::jsonExit(DI::mstdnScheduledStatus()->createFromDelayedPostId($parameters['id'], $uid)->toArray()); + System::jsonExit(DI::mstdnScheduledStatus()->createFromDelayedPostId($parameters['id'], $uid)->toArray()); } $request = self::getRequest([ diff --git a/src/Object/Api/Mastodon/ScheduledStatus.php b/src/Object/Api/Mastodon/ScheduledStatus.php index 473cd99a54..e4f702a234 100644 --- a/src/Object/Api/Mastodon/ScheduledStatus.php +++ b/src/Object/Api/Mastodon/ScheduledStatus.php @@ -59,7 +59,7 @@ class ScheduledStatus extends BaseDataTransferObject * @param array $parameters Parameters for the workerqueue entry for the delayed post * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public function __construct(array $delayed_post, array $parameters) + public function __construct(array $delayed_post, array $parameters, array $media_ids = null, int $in_reply_to_id = null) { $visibility = ['public', 'private', 'unlisted']; @@ -68,14 +68,14 @@ class ScheduledStatus extends BaseDataTransferObject $this->params = [ 'text' => BBCode::convert(BBCode::setMentionsToNicknames($parameters['item']['body'] ?? ''), false, BBCode::API), - 'media_ids' => null, + 'media_ids' => $media_ids, 'sensitive' => null, 'spoiler_text' => $parameters['item']['title'] ?? '', 'visibility' => $visibility[$parameters['item']['private']], 'scheduled_at' => $this->scheduled_at, 'poll' => null, 'idempotency' => null, - 'in_reply_to_id' => null, + 'in_reply_to_id' => $in_reply_to_id, 'application_id' => '' ];