From 6a23b17c959e306ca7ef913fa94cc5eaf62b6fef Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 6 Aug 2021 18:49:17 +0000 Subject: [PATCH 1/2] Respect the postopts values for scheduled posts --- mod/item.php | 16 ++++++----- src/Model/Item.php | 26 ++++++++---------- src/Model/Post/Delayed.php | 41 ++++++++++++++++------------ src/Module/Api/Mastodon/Statuses.php | 2 +- src/Protocol/Feed.php | 2 +- src/Worker/DelayedPublish.php | 16 +++++------ 6 files changed, 54 insertions(+), 49 deletions(-) diff --git a/mod/item.php b/mod/item.php index 2a365f3da2..809d6a18c2 100644 --- a/mod/item.php +++ b/mod/item.php @@ -681,7 +681,11 @@ function item_post(App $a) { $o = conversation($a, [array_merge($contact_record, $datarray)], 'search', false, true); System::jsonExit(['preview' => $o]); - } elseif (!empty($_REQUEST['scheduled_at'])) { + } + + Hook::callAll('post_local',$datarray); + + if (!empty($_REQUEST['scheduled_at'])) { $scheduled_at = DateTimeFormat::convert($_REQUEST['scheduled_at'], 'UTC', $a->getTimezone()); if ($scheduled_at > DateTimeFormat::utcNow()) { unset($datarray['created']); @@ -692,16 +696,12 @@ function item_post(App $a) { unset($datarray['edit']); unset($datarray['self']); unset($datarray['api_source']); - - Post\Delayed::add($datarray['uri'], $datarray, PRIORITY_HIGH, false, $scheduled_at); + + Post\Delayed::add($datarray['uri'], $datarray, PRIORITY_HIGH, Post\Delayed::PREPARED_NO_HOOK, $scheduled_at); item_post_return(DI::baseUrl(), $api_source, $return_path); } } - $datarray['uri-id'] = ItemURI::getIdByURI($datarray['uri']); - - Hook::callAll('post_local',$datarray); - if (!empty($datarray['cancel'])) { Logger::info('mod_item: post cancelled by addon.'); if ($return_path) { @@ -716,6 +716,8 @@ function item_post(App $a) { System::jsonExit($json); } + $datarray['uri-id'] = ItemURI::getIdByURI($datarray['uri']); + if ($orig_post) { // Fill the cache field // This could be done in Item::update as well - but we have to check for the existance of some fields. diff --git a/src/Model/Item.php b/src/Model/Item.php index 3e0faddf75..441808ea91 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -706,7 +706,7 @@ class Item return GRAVITY_UNKNOWN; // Should not happen } - public static function insert($item, $notify = false, $dontcache = false) + public static function insert(array $item, bool $notify = false, bool $post_local = true) { $orig_item = $item; @@ -931,7 +931,7 @@ class Item $item["private"] = self::PRIVATE; } - if ($notify) { + if ($notify && $post_local) { $item['edit'] = false; $item['parent'] = $parent_id; @@ -953,7 +953,7 @@ class Item unset($_SESSION['authenticated']); unset($_SESSION['uid']); } - } else { + } elseif (!$notify) { Hook::callAll('post_remote', $item); } @@ -1141,15 +1141,13 @@ class Item return 0; } - if (!$dontcache) { - if ($notify) { - if (!\Friendica\Content\Feature::isEnabled($posted_item['uid'], 'explicit_mentions') && ($posted_item['gravity'] == GRAVITY_COMMENT)) { - Tag::createImplicitMentions($posted_item['uri-id'], $posted_item['thr-parent-id']); - } - Hook::callAll('post_local_end', $posted_item); - } else { - Hook::callAll('post_remote_end', $posted_item); + if ($notify) { + if (!\Friendica\Content\Feature::isEnabled($posted_item['uid'], 'explicit_mentions') && ($posted_item['gravity'] == GRAVITY_COMMENT)) { + Tag::createImplicitMentions($posted_item['uri-id'], $posted_item['thr-parent-id']); } + Hook::callAll('post_local_end', $posted_item); + } else { + Hook::callAll('post_remote_end', $posted_item); } if ($posted_item['gravity'] === GRAVITY_PARENT) { @@ -1465,7 +1463,7 @@ class Item } } - $distributed = self::insert($item, $notify, true); + $distributed = self::insert($item, $notify); if (!$distributed) { Logger::info("Distributed item wasn't stored", ['uri-id' => $item['uri-id'], 'user' => $uid]); @@ -1534,7 +1532,7 @@ class Item $item['contact-id'] = $item['author-id']; } - $public_shadow = self::insert($item, false, true); + $public_shadow = self::insert($item); Logger::info('Stored public shadow', ['thread' => $itemid, 'id' => $public_shadow]); } @@ -1593,7 +1591,7 @@ class Item unset($item['post-reason']); $item['contact-id'] = Contact::getIdForURL($item['author-link']); - $public_shadow = self::insert($item, false, true); + $public_shadow = self::insert($item); Logger::info('Stored public shadow', ['uri-id' => $item['uri-id'], 'id' => $public_shadow]); diff --git a/src/Model/Post/Delayed.php b/src/Model/Post/Delayed.php index 669c365cde..24b9989a4b 100644 --- a/src/Model/Post/Delayed.php +++ b/src/Model/Post/Delayed.php @@ -33,19 +33,23 @@ use Friendica\Util\DateTimeFormat; class Delayed { + const PREPARED = 0; + const UNPREPARED = 1; + const PREPARED_NO_HOOK = 2; + /** * Insert a new delayed post * - * @param string $uri - * @param array $item - * @param integer $notify - * @param bool $unprepared - * @param string $delayed - * @param array $taglist - * @param array $attachments - * @return int ID of the created delayed post entry + * @param string $uri + * @param array $item + * @param int $notify + * @param int $preparation_mode + * @param string $delayed + * @param array $taglist + * @param array $attachments + * @return int ID of the created delayed post entry */ - public static function add(string $uri, array $item, int $notify = 0, bool $unprepared = false, string $delayed = '', array $taglist = [], array $attachments = []) + public static function add(string $uri, array $item, int $notify = 0, int $preparation_mode = self::PREPARED, string $delayed = '', array $taglist = [], array $attachments = []) { if (empty($item['uid']) || self::exists($uri, $item['uid'])) { Logger::notice('No uid or already found'); @@ -63,7 +67,7 @@ class Delayed Logger::notice('Adding post for delayed publishing', ['uid' => $item['uid'], 'delayed' => $delayed, 'uri' => $uri]); - $wid = Worker::add(['priority' => PRIORITY_HIGH, 'delayed' => $delayed], 'DelayedPublish', $item, $notify, $taglist, $attachments, $unprepared, $uri); + $wid = Worker::add(['priority' => PRIORITY_HIGH, 'delayed' => $delayed], 'DelayedPublish', $item, $notify, $taglist, $attachments, $preparation_mode, $uri); if (!$wid) { return 0; } @@ -168,21 +172,21 @@ class Delayed /** * Publish a delayed post * - * @param array $item - * @param integer $notify - * @param array $taglist - * @param array $attachments - * @param bool $unprepared + * @param array $item + * @param int $notify + * @param array $taglist + * @param array $attachments + * @param int $preparation_mode * @param string $uri * @return bool */ - public static function publish(array $item, int $notify = 0, array $taglist = [], array $attachments = [], bool $unprepared = false, string $uri = '') + public static function publish(array $item, int $notify = 0, array $taglist = [], array $attachments = [], int $preparation_mode = self::PREPARED, string $uri = '') { if (!empty($attachments)) { $item['attachments'] = $attachments; } - if ($unprepared) { + if ($preparation_mode == self::UNPREPARED) { $_SESSION['authenticated'] = true; $_SESSION['uid'] = $item['uid']; @@ -209,7 +213,8 @@ class Delayed return $id; } - $id = Item::insert($item, $notify); + + $id = Item::insert($item, $notify, $preparation_mode == self::PREPARED); Logger::notice('Post stored', ['id' => $id, 'uid' => $item['uid'], 'cid' => $item['contact-id']]); diff --git a/src/Module/Api/Mastodon/Statuses.php b/src/Module/Api/Mastodon/Statuses.php index cd6bbda3f8..6ae0767334 100644 --- a/src/Module/Api/Mastodon/Statuses.php +++ b/src/Module/Api/Mastodon/Statuses.php @@ -186,7 +186,7 @@ class Statuses extends BaseApi if (!empty($request['scheduled_at'])) { $item['guid'] = Item::guid($item, true); $item['uri'] = Item::newURI($item['uid'], $item['guid']); - $id = Post\Delayed::add($item['uri'], $item, PRIORITY_HIGH, false, $request['scheduled_at']); + $id = Post\Delayed::add($item['uri'], $item, PRIORITY_HIGH, Post\Delayed::PREPARED, $request['scheduled_at']); if (empty($id)) { DI::mstdnError()->InternalError(); } diff --git a/src/Protocol/Feed.php b/src/Protocol/Feed.php index 69ca1bfce2..0801498f21 100644 --- a/src/Protocol/Feed.php +++ b/src/Protocol/Feed.php @@ -601,7 +601,7 @@ class Feed } $publish_at = date(DateTimeFormat::MYSQL, $publish_time); - if (Post\Delayed::add($posting['item']['uri'], $posting['item'], $posting['notify'], false, $publish_at, $posting['taglist'], $posting['attachments'])) { + if (Post\Delayed::add($posting['item']['uri'], $posting['item'], $posting['notify'], Post\Delayed::PREPARED, $publish_at, $posting['taglist'], $posting['attachments'])) { DI::pConfig()->set($item['uid'], 'system', 'last_publish', $publish_time); } } diff --git a/src/Worker/DelayedPublish.php b/src/Worker/DelayedPublish.php index 3707cf53b2..cd2bb1ff0f 100644 --- a/src/Worker/DelayedPublish.php +++ b/src/Worker/DelayedPublish.php @@ -29,17 +29,17 @@ class DelayedPublish /** * Publish a post, used for delayed postings * - * @param array $item - * @param integer $notify - * @param array $taglist - * @param array $attachments - * @param bool $unprepared + * @param array $item + * @param int $notify + * @param array $taglist + * @param array $attachments + * @param int $preparation_mode * @param string $uri * @return void */ - public static function execute(array $item, int $notify = 0, array $taglist = [], array $attachments = [], bool $unprepared = false, string $uri = '') + public static function execute(array $item, int $notify = 0, array $taglist = [], array $attachments = [], int $preparation_mode = Post\Delayed::PREPARED, string $uri = '') { - $id = Post\Delayed::publish($item, $notify, $taglist, $attachments, $unprepared, $uri); - Logger::notice('Post published', ['id' => $id, 'uid' => $item['uid'], 'notify' => $notify, 'unprepared' => $unprepared]); + $id = Post\Delayed::publish($item, $notify, $taglist, $attachments, $preparation_mode, $uri); + Logger::notice('Post published', ['id' => $id, 'uid' => $item['uid'], 'notify' => $notify, 'unprepared' => $preparation_mode]); } } From 9664efd66b36ed1737f16c53f75b9cc0dffa0a84 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 7 Aug 2021 20:09:25 +0000 Subject: [PATCH 2/2] Added some description --- src/Model/Post/Delayed.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Model/Post/Delayed.php b/src/Model/Post/Delayed.php index 24b9989a4b..0f47264c53 100644 --- a/src/Model/Post/Delayed.php +++ b/src/Model/Post/Delayed.php @@ -33,8 +33,21 @@ use Friendica\Util\DateTimeFormat; class Delayed { + /** + * The content of the post is posted as is. Connector settings are using the default settings. + * This is used for automated scheduled posts via feeds or from the API. + */ const PREPARED = 0; + /** + * The content is posted like a manual post. Means some processing of body will be done. + * Also it is posted with default permissions and default connector settings. + * This is used for mirrored connector posts. + */ const UNPREPARED = 1; + /** + * Like PREPARED, but additionally the connector settings can differ. + * This is used when manually publishing scheduled posts. + */ const PREPARED_NO_HOOK = 2; /**