From 0eb4a600b0194e75e6dad2aca928b6bf9b7c4f95 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 13 Dec 2020 12:47:49 +0000 Subject: [PATCH] Delay unprepared posts --- include/api.php | 1 - src/Model/Item.php | 4 +- src/Model/Post/Delayed.php | 61 ++++++++++++++++++++---- src/Protocol/ActivityPub/Transmitter.php | 3 -- src/Protocol/Diaspora.php | 1 - src/Protocol/Feed.php | 3 +- src/Protocol/OStatus.php | 3 -- src/Worker/DelayedPublish.php | 7 +-- 8 files changed, 58 insertions(+), 25 deletions(-) diff --git a/include/api.php b/include/api.php index dc5d640487..92d35c001e 100644 --- a/include/api.php +++ b/include/api.php @@ -67,7 +67,6 @@ use Friendica\Util\Proxy as ProxyUtils; use Friendica\Util\Strings; use Friendica\Util\XML; -require_once __DIR__ . '/../mod/share.php'; require_once __DIR__ . '/../mod/item.php'; require_once __DIR__ . '/../mod/wall_upload.php'; diff --git a/src/Model/Item.php b/src/Model/Item.php index c67399b928..dec3716d01 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -2910,8 +2910,8 @@ class Item $datarray['api_source'] = true; // We have to tell the hooks who we are - this really should be improved - $_SESSION["authenticated"] = true; - $_SESSION["uid"] = $contact['uid']; + $_SESSION['authenticated'] = true; + $_SESSION['uid'] = $contact['uid']; return (bool)$result; } diff --git a/src/Model/Post/Delayed.php b/src/Model/Post/Delayed.php index bfab406282..aa0270e640 100644 --- a/src/Model/Post/Delayed.php +++ b/src/Model/Post/Delayed.php @@ -25,37 +25,57 @@ use Friendica\Core\Logger; use Friendica\Database\DBA; use Friendica\Core\Worker; use Friendica\Database\Database; +use Friendica\DI; use Friendica\Model\Item; use Friendica\Model\Tag; +use Friendica\Util\DateTimeFormat; class Delayed { /** * Insert a new delayed post * - * @param string $delayed - * @param array $item + * @param string $uri + * @param array $item * @param integer $notify - * @param array $taglist - * @param array $attachments + * @param bool $unprepared + * @param string $delayed + * @param array $taglist + * @param array $attachments * @return bool insert success */ - public static function add(string $delayed, array $item, int $notify = 0, array $taglist = [], array $attachments = []) + public static function add(string $uri, array $item, int $notify = 0, bool $unprepared = false, string $delayed = '', array $taglist = [], array $attachments = []) { - if (empty($item['uri']) || empty($item['uid']) || self::exists($item['uri'], $item['uid'])) { + if (empty($item['uid']) || self::exists($uri, $item['uid'])) { return false; } - Logger::notice('Adding post for delayed publishing', ['uid' => $item['uid'], 'delayed' => $delayed, 'uri' => $item['uri']]); + if (empty($delayed)) { + $min_posting = DI::config()->get('system', 'minimum_posting_interval', 0); - Worker::add(['priority' => PRIORITY_HIGH, 'delayed' => $delayed], 'DelayedPublish', $item, $notify, $taglist, $attachments); - return DBA::insert('delayed-post', ['uri' => $item['uri'], 'uid' => $item['uid'], 'delayed' => $delayed], Database::INSERT_IGNORE); + $last_publish = DI::pConfig()->get($item['uid'], 'system', 'last_publish', 0, true); + $next_publish = max($last_publish + (60 * $min_posting), time()); + $delayed = date(DateTimeFormat::MYSQL, $next_publish); + } else { + $next_publish = strtotime($delayed); + } + + Logger::notice('Adding post for delayed publishing', ['uid' => $item['uid'], 'delayed' => $delayed, 'uri' => $uri]); + + if (!Worker::add(['priority' => PRIORITY_HIGH, 'delayed' => $delayed], 'DelayedPublish', $item, $notify, $taglist, $attachments, $unprepared)) { + return false; + } + + DI::pConfig()->set($item['uid'], 'system', 'last_publish', $next_publish); + + return DBA::insert('delayed-post', ['uri' => $uri, 'uid' => $item['uid'], 'delayed' => $delayed], Database::INSERT_IGNORE); } /** * Delete a delayed post * * @param string $uri + * @param int $uid * * @return bool delete success */ @@ -68,6 +88,7 @@ class Delayed * Check if an entry exists * * @param string $uri + * @param int $uid * * @return bool "true" if an entry with that URI exists */ @@ -83,10 +104,30 @@ class Delayed * @param integer $notify * @param array $taglist * @param array $attachments + * @param bool $unprepared * @return bool */ - public static function publish(array $item, int $notify = 0, array $taglist = [], array $attachments = []) + public static function publish(array $item, int $notify = 0, array $taglist = [], array $attachments = [], bool $unprepared = false) { + if ($unprepared) { + $_SESSION['authenticated'] = true; + $_SESSION['uid'] = $item['uid']; + + $_REQUEST = $item; + $_REQUEST['api_source'] = true; + $_REQUEST['profile_uid'] = $item['uid']; + $_REQUEST['title'] = $item['title'] ?? ''; + + if (!empty($item['app'])) { + $_REQUEST['source'] = $item['app']; + } + + require_once 'mod/item.php'; + $id = item_post(DI::app()); + + Logger::notice('Unprepared post stored', ['id' => $id, 'uid' => $item['uid'], 'extid' => $item['extid']]); + return; + } $id = Item::insert($item, $notify); Logger::notice('Post stored', ['id' => $id, 'uid' => $item['uid'], 'cid' => $item['contact-id']]); diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index cf0b0170d7..29a3b0ada9 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -51,9 +51,6 @@ use Friendica\Util\Map; use Friendica\Util\Network; use Friendica\Util\XML; -require_once 'include/api.php'; -require_once 'mod/share.php'; - /** * ActivityPub Transmitter Protocol class * diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index 54a8d1c1ba..5f28e092d5 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -3382,7 +3382,6 @@ class Diaspora } if ($item['author-link'] != $item['owner-link']) { - require_once 'mod/share.php'; $body = BBCode::getShareOpeningTag($item['author-name'], $item['author-link'], $item['author-avatar'], $item['plink'], $item['created']) . $body . '[/share]'; } diff --git a/src/Protocol/Feed.php b/src/Protocol/Feed.php index a2e9daaa03..f674f70815 100644 --- a/src/Protocol/Feed.php +++ b/src/Protocol/Feed.php @@ -656,8 +656,7 @@ class Feed } $publish_at = date(DateTimeFormat::MYSQL, $publish_time); - Post\Delayed::add($publish_at, $posting['item'], $posting['notify'], $posting['taglist'], $posting['attachments']); - DI::pConfig()->set($item['uid'], 'system', 'last_publish', $next_publish); + Post\Delayed::add($posting['item']['uri'], $posting['item'], $posting['notify'], false, $publish_at, $posting['taglist'], $posting['attachments']); } } diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index a6e0df4c33..8315f51130 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -46,9 +46,6 @@ use Friendica\Util\Proxy as ProxyUtils; use Friendica\Util\Strings; use Friendica\Util\XML; -require_once 'mod/share.php'; -require_once 'include/api.php'; - /** * This class contain functions for the OStatus protocol */ diff --git a/src/Worker/DelayedPublish.php b/src/Worker/DelayedPublish.php index db37ba3067..2d08b25b00 100644 --- a/src/Worker/DelayedPublish.php +++ b/src/Worker/DelayedPublish.php @@ -33,11 +33,12 @@ class DelayedPublish * @param integer $notify * @param array $taglist * @param array $attachments + * @param bool $unprepared * @return void */ - public static function execute(array $item, int $notify = 0, array $taglist = [], array $attachments = []) + public static function execute(array $item, int $notify = 0, array $taglist = [], array $attachments = [], bool $unprepared = false) { - $id = Post\Delayed::publish($item, $notify, $taglist, $attachments); - Logger::notice('Post published', ['id' => $id, 'uid' => $item['uid'], 'cid' => $item['contact-id'], 'notify' => $notify]); + $id = Post\Delayed::publish($item, $notify, $taglist, $attachments, $unprepared); + Logger::notice('Post published', ['id' => $id, 'uid' => $item['uid'], 'cid' => $item['contact-id'], 'notify' => $notify, 'unprepared' => $unprepared]); } }