use Friendica\Core\Logger;
use Friendica\Core\Protocol;
use Friendica\Core\Renderer;
-use Friendica\Core\Session;
use Friendica\Core\System;
use Friendica\Model\Tag;
use Friendica\Core\Worker;
'commented', 'created', 'edited', 'received', 'verb', 'object-type', 'postopts', 'plink',
'wall', 'private', 'starred', 'origin', 'parent-origin', 'title', 'body', 'language',
'content-warning', 'location', 'coord', 'app', 'rendered-hash', 'rendered-html', 'object',
- 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'mention', 'global',
+ 'quote-uri', 'quote-uri-id', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'mention', 'global',
'author-id', 'author-link', 'author-name', 'author-avatar', 'author-network', 'author-updated', 'author-gsid', 'author-addr', 'author-uri-id',
'owner-id', 'owner-link', 'owner-name', 'owner-avatar', 'owner-network', 'owner-contact-type', 'owner-updated',
'causer-id', 'causer-link', 'causer-name', 'causer-avatar', 'causer-contact-type', 'causer-network',
'private', 'title', 'body', 'raw-body', 'location', 'coord', 'app',
'inform', 'deleted', 'extid', 'post-type', 'post-reason', 'gravity',
'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid',
- 'author-id', 'author-link', 'author-name', 'author-avatar', 'owner-id', 'owner-link', 'contact-uid',
+ 'author-id', 'author-addr', 'author-link', 'author-name', 'author-avatar', 'owner-id', 'owner-link', 'contact-uid',
'signed_text', 'network', 'wall', 'contact-id', 'plink', 'origin',
- 'thr-parent-id', 'parent-uri-id', 'postopts', 'pubmail',
+ 'thr-parent-id', 'parent-uri-id', 'quote-uri', 'quote-uri-id', 'postopts', 'pubmail',
'event-created', 'event-edited', 'event-start', 'event-finish',
'event-summary', 'event-desc', 'event-location', 'event-type',
'event-nofinish', 'event-ignore', 'event-id'];
// All fields in the item table
const ITEM_FIELDLIST = ['id', 'uid', 'parent', 'uri', 'parent-uri', 'thr-parent',
'guid', 'uri-id', 'parent-uri-id', 'thr-parent-id', 'conversation', 'vid',
- 'contact-id', 'wall', 'gravity', 'extid', 'psid',
+ 'quote-uri', 'quote-uri-id', 'contact-id', 'wall', 'gravity', 'extid', 'psid',
'created', 'edited', 'commented', 'received', 'changed', 'verb',
'postopts', 'plink', 'resource-id', 'event-id', 'inform',
'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'post-type', 'post-reason',
const PRIVATE = 1;
const UNLISTED = 2;
+ // Item weight for query ordering
+ const GRAVITY_PARENT = 0;
+ const GRAVITY_ACTIVITY = 3;
+ const GRAVITY_COMMENT = 6;
+ const GRAVITY_UNKNOWN = 9;
+
/**
* Update existing item entries
*
$notify_items = [];
while ($item = DBA::fetch($items)) {
- ActivityPub\PageCache::deleteByUriId($item['uri-id']);
-
if (!empty($fields['body'])) {
Post\Media::insertFromAttachmentData($item['uri-id'], $fields['body']);
foreach ($notify_items as $notify_item) {
$post = Post::selectFirst(['uri-id', 'uid'], ['id' => $notify_item]);
- Worker::add(PRIORITY_HIGH, 'Notifier', Delivery::POST, (int)$post['uri-id'], (int)$post['uid']);
+ Worker::add(Worker::PRIORITY_HIGH, 'Notifier', Delivery::POST, (int)$post['uri-id'], (int)$post['uid']);
}
return $rows;
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
- public static function markForDeletion(array $condition, int $priority = PRIORITY_HIGH)
+ public static function markForDeletion(array $condition, int $priority = Worker::PRIORITY_HIGH)
{
$items = Post::select(['id'], $condition);
while ($item = Post::fetch($items)) {
}
if ($item['uid'] == $uid) {
- self::markForDeletionById($item['id'], PRIORITY_HIGH);
+ self::markForDeletionById($item['id'], Worker::PRIORITY_HIGH);
} elseif ($item['uid'] != 0) {
Logger::warning('Wrong ownership. Not deleting item', ['id' => $item['id']]);
}
* @return boolean success
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
- public static function markForDeletionById(int $item_id, int $priority = PRIORITY_HIGH): bool
+ public static function markForDeletionById(int $item_id, int $priority = Worker::PRIORITY_HIGH): bool
{
Logger::info('Mark item for deletion by id', ['id' => $item_id, 'callstack' => System::callstack()]);
// locate item to be deleted
// clean up categories and tags so they don't end up as orphans
Post\Category::deleteByURIId($item['uri-id'], $item['uid']);
- ActivityPub\PageCache::deleteByUriId($item['uri-id']);
-
/*
* If item is a link to a photo resource, nuke all the associated photos
* (visitors will not have photo resources)
Post\DeliveryData::delete($item['uri-id']);
// If it's the parent of a comment thread, kill all the kids
- if ($item['gravity'] == GRAVITY_PARENT) {
+ if ($item['gravity'] == self::GRAVITY_PARENT) {
self::markForDeletion(['parent' => $item['parent'], 'deleted' => false], $priority);
}
}
}
- if ($item['gravity'] == GRAVITY_PARENT) {
+ if ($item['gravity'] == self::GRAVITY_PARENT) {
if (Contact::isSharingByURL($item['owner-link'], $item['uid'], true)) {
$contact_id = Contact::getIdForURL($item['owner-link'], $item['uid']);
} else {
return 0;
}
+ /**
+ * Fetch the uri-id of the parent for the given uri-id
+ *
+ * @param integer $uriid
+ * @return integer
+ */
+ public static function getParent(int $uriid): int
+ {
+ $thread_parent = Post::selectFirstPost(['thr-parent-id', 'gravity'], ['uri-id' => $uriid]);
+ if (empty($thread_parent)) {
+ return 0;
+ }
+
+ if ($thread_parent['gravity'] == Item::GRAVITY_PARENT) {
+ return $uriid;
+ }
+
+ return self::getParent($thread_parent['thr-parent-id']);
+ }
+
/**
* Fetch top-level parent data for the given item array
*
if (isset($item['gravity'])) {
return intval($item['gravity']);
} elseif ($item['parent-uri-id'] === $item['uri-id']) {
- return GRAVITY_PARENT;
+ return self::GRAVITY_PARENT;
} elseif ($activity->match($item['verb'], Activity::POST)) {
- return GRAVITY_COMMENT;
+ return self::GRAVITY_COMMENT;
} elseif ($activity->match($item['verb'], Activity::FOLLOW)) {
- return GRAVITY_ACTIVITY;
+ return self::GRAVITY_ACTIVITY;
} elseif ($activity->match($item['verb'], Activity::ANNOUNCE)) {
- return GRAVITY_ACTIVITY;
+ return self::GRAVITY_ACTIVITY;
}
Logger::info('Unknown gravity for verb', ['verb' => $item['verb']]);
- return GRAVITY_UNKNOWN; // Should not happen
+ return self::GRAVITY_UNKNOWN; // Should not happen
}
/**
{
$orig_item = $item;
- $priority = PRIORITY_HIGH;
+ $priority = Worker::PRIORITY_HIGH;
// If it is a posting where users should get notifications, then define it as wall posting
if ($notify) {
$item['protocol'] = Conversation::PARCEL_DIRECT;
$item['direction'] = Conversation::PUSH;
- if (is_int($notify) && in_array($notify, PRIORITIES)) {
+ if (is_int($notify) && in_array($notify, Worker::PRIORITIES)) {
$priority = $notify;
}
} else {
return 0;
}
- if ($item['gravity'] !== GRAVITY_PARENT) {
+ if ($item['gravity'] !== self::GRAVITY_PARENT) {
$toplevel_parent = self::getTopLevelParent($item);
if (empty($toplevel_parent)) {
return 0;
}
// We have to tell the hooks who we are - this really should be improved
- if (!local_user()) {
+ if (!DI::userSession()->getLocalUserId()) {
$_SESSION['authenticated'] = true;
$_SESSION['uid'] = $uid;
$dummy_session = true;
$item['raw-body'] = Post\Media::insertFromBody($item['uri-id'], $item['raw-body']);
$item['raw-body'] = self::setHashtags($item['raw-body']);
+ $quote_id = self::getQuoteUriId($item['body']);
+
+ if (!empty($quote_id) && Post::exists(['uri-id' => $quote_id, 'network' => Protocol::FEDERATED])) {
+ $item['quote-uri-id'] = $quote_id;
+ $item['raw-body'] = BBCode::removeSharedData($item['raw-body']);
+ }
+
if (!DBA::exists('contact', ['id' => $item['author-id'], 'network' => Protocol::DFRN])) {
Post\Media::insertFromRelevantUrl($item['uri-id'], $item['raw-body']);
}
Post::insert($item['uri-id'], $item);
- if ($item['gravity'] == GRAVITY_PARENT) {
+ if ($item['gravity'] == self::GRAVITY_PARENT) {
Post\Thread::insert($item['uri-id'], $item);
}
}
// Create Diaspora signature
- if ($item['origin'] && empty($item['diaspora_signed_text']) && ($item['gravity'] != GRAVITY_PARENT)) {
+ if ($item['origin'] && empty($item['diaspora_signed_text']) && ($item['gravity'] != self::GRAVITY_PARENT)) {
$signed = Diaspora::createCommentSignature($item);
if (!empty($signed)) {
$item['diaspora_signed_text'] = json_encode($signed);
return 0;
}
- if ($item['gravity'] == GRAVITY_PARENT) {
+ if ($item['gravity'] == self::GRAVITY_PARENT) {
$item['post-user-id'] = $post_user_id;
Post\ThreadUser::insert($item['uri-id'], $item['uid'], $item);
}
// update the commented timestamp on the parent
if (DI::config()->get('system', 'like_no_comment')) {
// Update when it is a comment
- $update_commented = in_array($posted_item['gravity'], [GRAVITY_PARENT, GRAVITY_COMMENT]);
+ $update_commented = in_array($posted_item['gravity'], [self::GRAVITY_PARENT, self::GRAVITY_COMMENT]);
} else {
// Update when it isn't a follow or tag verb
$update_commented = !in_array($posted_item['verb'], [Activity::FOLLOW, Activity::TAG]);
}
if ($notify) {
- if (!\Friendica\Content\Feature::isEnabled($posted_item['uid'], 'explicit_mentions') && ($posted_item['gravity'] == GRAVITY_COMMENT)) {
+ if (!\Friendica\Content\Feature::isEnabled($posted_item['uid'], 'explicit_mentions') && ($posted_item['gravity'] == self::GRAVITY_COMMENT)) {
Tag::createImplicitMentions($posted_item['uri-id'], $posted_item['thr-parent-id']);
}
Hook::callAll('post_local_end', $posted_item);
Hook::callAll('post_remote_end', $posted_item);
}
- if ($posted_item['gravity'] === GRAVITY_PARENT) {
+ if ($posted_item['gravity'] === self::GRAVITY_PARENT) {
self::addShadow($post_user_id);
} else {
self::addShadowPost($post_user_id);
}
// Fill the cache with the rendered content.
- if (in_array($posted_item['gravity'], [GRAVITY_PARENT, GRAVITY_COMMENT]) && ($posted_item['uid'] == 0)) {
+ if (in_array($posted_item['gravity'], [self::GRAVITY_PARENT, self::GRAVITY_COMMENT]) && ($posted_item['uid'] == 0)) {
self::updateDisplayCache($posted_item['uri-id']);
}
*/
public static function getPostReason(array $item): int
{
- $actor = ($item['gravity'] == GRAVITY_PARENT) ? $item['owner-id'] : $item['author-id'];
+ $actor = ($item['gravity'] == self::GRAVITY_PARENT) ? $item['owner-id'] : $item['author-id'];
if (empty($item['origin']) && ($item['uid'] != 0) && Contact::isSharing($actor, $item['uid'])) {
return self::PR_FOLLOWER;
}
*/
private static function distributeByTags(array $item)
{
- if (($item['uid'] != 0) || ($item['gravity'] != GRAVITY_PARENT) || !in_array($item['network'], Protocol::FEDERATED)) {
+ if (($item['uid'] != 0) || ($item['gravity'] != self::GRAVITY_PARENT) || !in_array($item['network'], Protocol::FEDERATED)) {
return;
}
return 0;
}
- if (($uid != 0) && ($item['gravity'] == GRAVITY_PARENT)) {
+ if (($uid != 0) && ($item['gravity'] == self::GRAVITY_PARENT)) {
$owner = User::getOwnerDataById($uid);
if (($owner['contact-type'] == User::ACCOUNT_TYPE_COMMUNITY) && !Tag::isMentioned($uri_id, $owner['url'])) {
Logger::info('Target user is a forum but is not mentioned here, thread will not be stored', ['uid' => $uid, 'uri-id' => $uri_id]);
$item = array_merge($item, $fields);
- $item['post-reason'] = self::getPostReason($item);
+ if (($uid != 0) && Contact::isSharing(($item['gravity'] == Item::GRAVITY_PARENT) ? $item['owner-id'] : $item['author-id'], $uid)) {
+ $item['post-reason'] = self::PR_FOLLOWER;
+ }
- $is_reshare = ($item['gravity'] == GRAVITY_ACTIVITY) && ($item['verb'] == Activity::ANNOUNCE);
+ $is_reshare = ($item['gravity'] == self::GRAVITY_ACTIVITY) && ($item['verb'] == Activity::ANNOUNCE);
- if (($uid != 0) && (($item['gravity'] == GRAVITY_PARENT) || $is_reshare) &&
+ if (($uid != 0) && (($item['gravity'] == self::GRAVITY_PARENT) || $is_reshare) &&
DI::pConfig()->get($uid, 'system', 'accept_only_sharer') == self::COMPLETION_NONE &&
!in_array($item['post-reason'], [self::PR_FOLLOWER, self::PR_TAG, self::PR_TO, self::PR_CC])) {
- Logger::info('Contact is not a follower, thread will not be stored', ['author' => $item['author-link'], 'uid' => $uid, 'uri-id' => $uri_id]);
+ Logger::info('Contact is not a follower, thread will not be stored', ['author' => $item['author-link'], 'uid' => $uid, 'uri-id' => $uri_id, 'post-reason' => $item['post-reason']]);
return 0;
}
$causer = $item['causer-id'] ?: $item['author-id'];
- if (($uri_id != $item['parent-uri-id']) && ($item['gravity'] == GRAVITY_COMMENT) && !Post::exists(['uri-id' => $item['parent-uri-id'], 'uid' => $uid])) {
+ if (($uri_id != $item['parent-uri-id']) && ($item['gravity'] == self::GRAVITY_COMMENT) && !Post::exists(['uri-id' => $item['parent-uri-id'], 'uid' => $uid])) {
if (!self::fetchParent($item['parent-uri-id'], $uid, $causer)) {
Logger::info('Parent post had not been added', ['uri-id' => $item['parent-uri-id'], 'uid' => $uid, 'causer' => $causer]);
return 0;
$item['contact-id'] = self::contactId($item);
$notify = false;
- if ($item['gravity'] == GRAVITY_PARENT) {
+ if ($item['gravity'] == self::GRAVITY_PARENT) {
$contact = DBA::selectFirst('contact', [], ['id' => $item['contact-id'], 'self' => false]);
if (DBA::isResult($contact)) {
$notify = self::isRemoteSelf($contact, $item);
private static function addShadow(int $itemid)
{
$fields = ['uid', 'private', 'visible', 'deleted', 'network', 'uri-id'];
- $condition = ['id' => $itemid, 'gravity' => GRAVITY_PARENT];
+ $condition = ['id' => $itemid, 'gravity' => self::GRAVITY_PARENT];
$item = Post::selectFirst($fields, $condition);
if (!DBA::isResult($item)) {
}
// Is it a toplevel post?
- if ($item['gravity'] == GRAVITY_PARENT) {
+ if ($item['gravity'] == self::GRAVITY_PARENT) {
self::addShadow($itemid);
return;
}
return $item['language'];
}
- if (!in_array($item['gravity'], [GRAVITY_PARENT, GRAVITY_COMMENT]) || empty($item['body'])) {
+ if (!in_array($item['gravity'], [self::GRAVITY_PARENT, self::GRAVITY_COMMENT]) || empty($item['body'])) {
+ return '';
+ }
+
+ $languages = self::getLanguageArray(trim($item['title'] . "\n" . $item['body']), 3);
+ if (empty($languages)) {
return '';
}
+ return json_encode($languages);
+ }
+
+ /**
+ * Get a language array from a given text
+ *
+ * @param string $body
+ * @param integer $count
+ * @return array
+ */
+ public static function getLanguageArray(string $body, int $count): array
+ {
// Convert attachments to links
- $naked_body = BBCode::removeAttachment($item['body']);
+ $naked_body = BBCode::removeAttachment($body);
if (empty($naked_body)) {
- return '';
+ return [];
}
// Remove links and pictures
$naked_body = BBCode::removeLinks($naked_body);
// Convert the title and the body to plain text
- $naked_body = trim($item['title'] . "\n" . BBCode::toPlaintext($naked_body));
+ $naked_body = BBCode::toPlaintext($naked_body);
// Remove possibly remaining links
$naked_body = preg_replace(Strings::autoLinkRegEx(), '', $naked_body);
if (empty($naked_body)) {
- return '';
+ return [];
}
$naked_body = self::getDominantLanguage($naked_body);
$availableLanguages['fa'] = 'fa';
$ld = new Language(array_keys($availableLanguages));
- $languages = $ld->detect($naked_body)->limit(0, 3)->close();
- if (is_array($languages)) {
- return json_encode($languages);
- }
-
- return '';
+ return $ld->detect($naked_body)->limit(0, $count)->close() ?: [];
}
/**
{
$latin = '';
$non_latin = '';
- for ($i = 0; $i < mb_strlen($body); $i++) {
+ for ($i = 0; $i < mb_strlen($body); $i++) {
$character = mb_substr($body, $i, 1);
$ord = mb_ord($character);
return false;
}
- $item = Post::selectFirst(self::ITEM_FIELDLIST, ['id' => $item_id, 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT], 'origin' => false]);
+ $item = Post::selectFirst(self::ITEM_FIELDLIST, ['id' => $item_id, 'gravity' => [self::GRAVITY_PARENT, self::GRAVITY_COMMENT], 'origin' => false]);
if (!DBA::isResult($item)) {
Logger::debug('Post is an activity or origin or not found at all, quitting here.', ['id' => $item_id]);
return false;
}
- if ($item['gravity'] == GRAVITY_PARENT) {
+ if ($item['gravity'] == self::GRAVITY_PARENT) {
if (Tag::isMentioned($item['uri-id'], $owner['url'])) {
Logger::info('Mention found in tag.', ['uri' => $item['uri'], 'uid' => $uid, 'id' => $item_id, 'uri-id' => $item['uri-id'], 'guid' => $item['guid']]);
} else {
*/
private static function autoReshare(array $item)
{
- if ($item['gravity'] != GRAVITY_PARENT) {
+ if ($item['gravity'] != self::GRAVITY_PARENT) {
return;
}
}
$condition = ["`uid` = ? AND NOT `deleted` AND `gravity` = ?",
- $uid, GRAVITY_PARENT];
+ $uid, self::GRAVITY_PARENT];
/*
* $expire_network_only = save your own wall posts
return;
}
- $expire_items = DI::pConfig()->get($uid, 'expire', 'items', true);
+ $expire_items = (bool)DI::pConfig()->get($uid, 'expire', 'items', true);
// Forcing expiring of items - but not notes and marked items
if ($force) {
$expire_items = true;
}
- $expire_notes = DI::pConfig()->get($uid, 'expire', 'notes', true);
- $expire_starred = DI::pConfig()->get($uid, 'expire', 'starred', true);
- $expire_photos = DI::pConfig()->get($uid, 'expire', 'photos', false);
+ $expire_notes = (bool)DI::pConfig()->get($uid, 'expire', 'notes', true);
+ $expire_starred = (bool)DI::pConfig()->get($uid, 'expire', 'starred', true);
+ $expire_photos = (bool)DI::pConfig()->get($uid, 'expire', 'photos', false);
$expired = 0;
++$expired;
}
DBA::close($items);
- Logger::notice('User ' . $uid . ": expired $expired items; expire items: $expire_items, expire notes: $expire_notes, expire starred: $expire_starred, expire photos: $expire_photos");
+ Logger::notice('Expired', ['user' => $uid, 'days' => $days, 'network' => $network, 'force' => $force, 'expired' => $expired, 'expire items' => $expire_items, 'expire notes' => $expire_notes, 'expire starred' => $expire_starred, 'expire photos' => $expire_photos, 'condition' => $condition]);
}
public static function firstPostDate(int $uid, bool $wall = false)
$vids = Verb::getID($activity);
}
- $condition = ['vid' => $vids, 'deleted' => false, 'gravity' => GRAVITY_ACTIVITY,
+ $condition = ['vid' => $vids, 'deleted' => false, 'gravity' => self::GRAVITY_ACTIVITY,
'author-id' => $author_id, 'uid' => $item['uid'], 'thr-parent-id' => $uri_id];
$like_item = Post::selectFirst(['id', 'guid', 'verb'], $condition);
'network' => Protocol::DFRN,
'protocol' => Conversation::PARCEL_DIRECT,
'direction' => Conversation::PUSH,
- 'gravity' => GRAVITY_ACTIVITY,
+ 'gravity' => self::GRAVITY_ACTIVITY,
'parent' => $item['id'],
'thr-parent' => $item['uri'],
'owner-id' => $author_id,
*/
public static function getPermissionsConditionArrayByUserId(int $owner_id): array
{
- $local_user = local_user();
- $remote_user = Session::getRemoteContactID($owner_id);
+ $local_user = DI::userSession()->getLocalUserId();
+ $remote_user = DI::userSession()->getRemoteContactID($owner_id);
// default permissions - anonymous user
$condition = ["`private` != ?", self::PRIVATE];
*/
public static function getPermissionsSQLByUserId(int $owner_id, string $table = ''): string
{
- $local_user = local_user();
- $remote_user = Session::getRemoteContactID($owner_id);
+ $local_user = DI::userSession()->getLocalUserId();
+ $remote_user = DI::userSession()->getRemoteContactID($owner_id);
if (!empty($table)) {
$table = DBA::quoteIdentifier($table) . '.';
return $l10n->t('event');
} elseif (!empty($item['resource-id'])) {
return $l10n->t('photo');
- } elseif ($item['gravity'] == GRAVITY_ACTIVITY) {
+ } elseif ($item['gravity'] == self::GRAVITY_ACTIVITY) {
return $l10n->t('activity');
- } elseif ($item['gravity'] == GRAVITY_COMMENT) {
+ } elseif ($item['gravity'] == self::GRAVITY_COMMENT) {
return $l10n->t('comment');
}
$item['mentions'] = $tags['mentions'];
$body = $item['body'] ?? '';
- $shared = BBCode::fetchShareAttributes($body);
- if (!empty($shared['guid'])) {
- $shared_item = Post::selectFirst(['uri-id', 'plink', 'has-media'], ['guid' => $shared['guid']]);
- $shared_uri_id = $shared_item['uri-id'] ?? 0;
- $shared_links = [strtolower($shared_item['plink'] ?? '')];
- $shared_attachments = Post\Media::splitAttachments($shared_uri_id, $shared['guid'], [], $shared_item['has-media'] ?? false);
+
+ $fields = ['uri-id', 'uri', 'body', 'title', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink', 'network', 'has-media'];
+
+ $shared_uri_id = 0;
+ $shared_links = [];
+
+ $shared = DI::contentItem()->getSharedPost($item, $fields);
+ if (!empty($shared['post'])) {
+ $shared_item = $shared['post'];
+ $quote_uri_id = $shared['post']['uri-id'];
+ $shared_links[] = strtolower($shared['post']['uri']);
+ $item['body'] = BBCode::removeSharedData($item['body']);
+ } elseif (empty($shared_item['uri-id']) && empty($item['quote-uri-id'])) {
+ $media = Post\Media::getByURIId($item['uri-id'], [Post\Media::ACTIVITY]);
+ if (!empty($media)) {
+ $shared_item = Post::selectFirst($fields, ['plink' => $media[0]['url'], 'uid' => [$item['uid'], 0]]);
+
+ if (empty($shared_item['uri-id'])) {
+ $shared_item = Post::selectFirst($fields, ['uri' => $media[0]['url'], 'uid' => [$item['uid'], 0]]);
+ $shared_links[] = strtolower($media[0]['url']);
+ }
+
+ $quote_uri_id = $shared_item['uri-id'] ?? 0;
+ }
+ }
+
+ if (!empty($quote_uri_id)) {
+ $item['body'] .= "\n" . DI::contentItem()->createSharedBlockByArray($shared_item);
+ }
+
+ if (!empty($shared_item['uri-id'])) {
+ $shared_uri_id = $shared_item['uri-id'];
+ $shared_links[] = strtolower($shared_item['plink']);
+ $shared_attachments = Post\Media::splitAttachments($shared_uri_id, $shared_item['guid'], [], $shared_item['has-media']);
$shared_links = array_merge($shared_links, array_column($shared_attachments['visual'], 'url'));
$shared_links = array_merge($shared_links, array_column($shared_attachments['link'], 'url'));
$shared_links = array_merge($shared_links, array_column($shared_attachments['additional'], 'url'));
$item['body'] = self::replaceVisualAttachments($shared_attachments, $item['body']);
- } else {
- $shared_uri_id = 0;
- $shared_links = [];
}
$attachments = Post\Media::splitAttachments($item['uri-id'], $item['guid'] ?? '', $shared_links, $item['has-media'] ?? false);
// Compile eventual content filter reasons
$filter_reasons = [];
- if (!$is_preview && public_contact() != $item['author-id']) {
- if (!empty($item['content-warning']) && (!local_user() || !DI::pConfig()->get(local_user(), 'system', 'disable_cw', false))) {
+ if (!$is_preview && DI::userSession()->getPublicContactId() != $item['author-id']) {
+ if (!empty($item['content-warning']) && (!DI::userSession()->getLocalUserId() || !DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'disable_cw', false))) {
$filter_reasons[] = DI::l10n()->t('Content warning: %s', $item['content-warning']);
}
$s = self::addVisualAttachments($shared_attachments, $item, $s, true);
$s = self::addLinkAttachment($shared_uri_id ?: $item['uri-id'], $shared_attachments, $body, $s, true, []);
$s = self::addNonVisualAttachments($shared_attachments, $item, $s, true);
- $body = preg_replace("/\s*\[share .*?\].*?\[\/share\]\s*/ism", '', $body);
+ $body = BBCode::removeSharedData($body);
}
$s = self::addVisualAttachments($attachments, $item, $s, false);
}
DI::profiler()->stopRecording();
- if (isset($data['url']) && !in_array($data['url'], $ignore_links)) {
+ if (isset($data['url']) && !in_array(strtolower($data['url']), $ignore_links)) {
if (!empty($data['description']) || !empty($data['image']) || !empty($data['preview'])) {
$parts = parse_url($data['url']);
if (!empty($parts['scheme']) && !empty($parts['host'])) {
$plink = $item['uri'];
}
- if (local_user()) {
+ if (DI::userSession()->getLocalUserId()) {
$ret = [
'href' => "display/" . $item['guid'],
'orig' => "display/" . $item['guid'],
return 0;
}
- /**
- * Return share data from an item array (if the item is shared item)
- * We are providing the complete Item array, because at some time in the future
- * we hopefully will define these values not in the body anymore but in some item fields.
- * This function is meant to replace all similar functions in the system.
- *
- * @param array $item
- *
- * @return array with share information
- */
- public static function getShareArray(array $item): array
- {
- return BBCode::fetchShareAttributes($item['body']);
- }
-
- /**
- * Fetch item information for shared items from the original items and adds it.
- *
- * @param array $item
- *
- * @return array item array with data from the original item
- */
- public static function addShareDataFromOriginal(array $item): array
- {
- $shared = self::getShareArray($item);
- if (empty($shared)) {
- return $item;
- }
-
- // Real reshares always have got a GUID.
- if (empty($shared['guid'])) {
- return $item;
- }
-
- $uid = $item['uid'] ?? 0;
-
- // first try to fetch the item via the GUID. This will work for all reshares that had been created on this system
- $shared_item = Post::selectFirst(['title', 'body'], ['guid' => $shared['guid'], 'uid' => [0, $uid]]);
- if (!DBA::isResult($shared_item)) {
- if (empty($shared['link'])) {
- return $item;
- }
-
- // Otherwhise try to find (and possibly fetch) the item via the link. This should work for Diaspora and ActivityPub posts
- $id = self::fetchByLink($shared['link'] ?? '', $uid);
- if (empty($id)) {
- Logger::info('Original item not found', ['url' => $shared['link'] ?? '', 'callstack' => System::callstack()]);
- return $item;
- }
-
- $shared_item = Post::selectFirst(['title', 'body'], ['id' => $id]);
- if (!DBA::isResult($shared_item)) {
- return $item;
- }
- Logger::info('Got shared data from url', ['url' => $shared['link'], 'callstack' => System::callstack()]);
- } else {
- Logger::info('Got shared data from guid', ['guid' => $shared['guid'], 'callstack' => System::callstack()]);
- }
-
- if (!empty($shared_item['title'])) {
- $body = '[h3]' . $shared_item['title'] . "[/h3]\n" . $shared_item['body'];
- unset($shared_item['title']);
- } else {
- $body = $shared_item['body'];
- }
-
- $item['body'] = preg_replace("/\[share ([^\[\]]*)\].*\[\/share\]/ism", '[share $1]' . str_replace('$', '\$', $body) . '[/share]', $item['body']);
- unset($shared_item['body']);
-
- return array_merge($item, $shared_item);
- }
-
/**
* Check a prospective item array against user-level permissions
*
return false;
}
- if (!empty($item['causer-id']) && ($item['gravity'] === GRAVITY_PARENT) && Contact\User::isIgnored($item['causer-id'], $user_id)) {
+ if (!empty($item['causer-id']) && ($item['gravity'] === self::GRAVITY_PARENT) && Contact\User::isIgnored($item['causer-id'], $user_id)) {
Logger::notice('Causer is ignored by user', ['causer-link' => $item['causer-link'] ?? $item['causer-id'], 'uid' => $user_id, 'item-uri' => $item['uri']]);
return false;
}
* Improve the data in shared posts
*
* @param array $item
+ * @param bool $add_media
* @return string body
*/
- public static function improveSharedDataInBody(array $item): string
+ public static function improveSharedDataInBody(array $item, bool $add_media = false): string
{
$shared = BBCode::fetchShareAttributes($item['body']);
- if (empty($shared['link'])) {
+ if (empty($shared['guid']) && empty($shared['message_id'])) {
return $item['body'];
}
- $id = self::fetchByLink($shared['link']);
- Logger::info('Fetched shared post', ['uri-id' => $item['uri-id'], 'id' => $id, 'author' => $shared['profile'], 'url' => $shared['link'], 'guid' => $shared['guid'], 'callstack' => System::callstack()]);
- if (!$id) {
- return $item['body'];
- }
+ $link = $shared['link'] ?: $shared['message_id'];
- $shared_item = Post::selectFirst(['author-name', 'author-link', 'author-avatar', 'plink', 'created', 'guid', 'title', 'body'], ['id' => $id]);
- if (!DBA::isResult($shared_item)) {
- return $item['body'];
+ if (empty($shared_content)) {
+ $shared_content = DI::contentItem()->createSharedPostByUrl($link, $item['uid'] ?? 0, $add_media);
}
- $shared_content = BBCode::getShareOpeningTag($shared_item['author-name'], $shared_item['author-link'], $shared_item['author-avatar'], $shared_item['plink'], $shared_item['created'], $shared_item['guid']);
-
- if (!empty($shared_item['title'])) {
- $shared_content .= '[h3]'.$shared_item['title'].'[/h3]'."\n";
+ if (empty($shared_content)) {
+ return $item['body'];
}
- $shared_content .= $shared_item['body'];
+ $item['body'] = preg_replace("/\[share.*?\](.*)\[\/share\]/ism", $shared_content, $item['body']);
- $item['body'] = preg_replace("/\[share.*?\](.*)\[\/share\]/ism", $shared_content . '[/share]', $item['body']);
- Logger::info('New shared data', ['uri-id' => $item['uri-id'], 'id' => $id, 'shared_item' => $shared_item]);
+ Logger::debug('New shared data', ['uri-id' => $item['uri-id'], 'link' => $link, 'guid' => $item['guid']]);
return $item['body'];
}
+
+ /**
+ * Fetch the uri-id of a quote
+ *
+ * @param string $body
+ * @return integer
+ */
+ private static function getQuoteUriId(string $body): int
+ {
+ $shared = BBCode::fetchShareAttributes($body);
+ if (empty($shared['message_id'])) {
+ return 0;
+ }
+ return ItemURI::getIdByURI($shared['message_id']);
+ }
}