function display_fetchauthor($item)
{
- $shared = Item::getShareArray($item);
- if (empty($shared['comment']) && !empty($shared['guid']) && !empty($shared['profile'])) {
- $contact = Contact::getByURLForUser($shared['profile'], DI::userSession()->getLocalUserId());
+ $shared = DI::contentItem()->getSharedPost($item, ['author-link']);
+ if (!empty($shared) && empty($shared['comment'])) {
+ $contact = Contact::getByURLForUser($shared['post']['author-link'], DI::userSession()->getLocalUserId());
}
if (empty($contact)) {
System::exit();
}
- $shared = Item::getShareArray($item);
- if (empty($shared['comment']) && (!empty($shared['message_id']) || !empty($shared['link']))) {
- $content = '[share]' . ($shared['message_id'] ?: $shared['link']) . '[/share]';
+ $shared = DI::contentItem()->getSharedPost($item, ['uri']);
+ if (!empty($shared) && empty($shared['comment'])) {
+ $content = '[share]' . $shared['post']['uri'] . '[/share]';
} else {
$content = '[share]' . $item['uri'] . '[/share]';
}
$shared_content .= '[h3]' . $item['title'] . "[/h3]\n";
}
- $shared = ItemModel::getShareArray($item);
+ $shared = $this->getSharedPost($item, ['uri-id', 'uri', 'body', 'title', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink', 'network']);
// If it is a reshared post then reformat it to avoid display problems with two share elements
if (!empty($shared)) {
- if (!empty($shared['guid']) && ($encaspulated_share = self::createSharedPostByGuid($shared['guid'], 0, '', $add_media))) {
+ if (($encaspulated_share = $this->createSharedBlockByArray($shared['post'], $add_media))) {
$item['body'] = preg_replace("/\[share.*?\](.*)\[\/share\]/ism", $encaspulated_share, $item['body']);
}
return $shared_content;
}
+
+ /**
+ * Return the shared post from an item array (if the item is shared item)
+ *
+ * @param array $item
+ * @param array $fields
+ *
+ * @return array with the shared post
+ */
+ public function getSharedPost(array $item, array $fields = []): array
+ {
+ if (!empty($item['quote-uri-id'])) {
+ $shared = Post::selectFirst($fields, ['uri-id' => $item['quote-uri-id'], 'uid' => [0, $item['uid'] ?? 0]]);
+ if (is_array($shared)) {
+ return [
+ 'comment' => BBCode::removeSharedData($item['body'] ?? ''),
+ 'post' => $shared
+ ];
+ }
+ }
+
+ $attributes = BBCode::fetchShareAttributes($item['body'] ?? '');
+ if (!empty($attributes)) {
+ $shared = Post::selectFirst($fields, ['guid' => $attributes['guid'], 'uid' => [0, $item['uid'] ?? 0]]);
+ if (is_array($shared)) {
+ return [
+ 'comment' => $attributes['comment'],
+ 'post' => $shared
+ ];
+ }
+ }
+
+ return [];
+ }
}
return $attributes;
}
+ /**
+ * Checks, if the provided body contains a native reshare
+ *
+ * @param string $body
+ * @return boolean
+ */
+ public static function isNativeReshare(string $body): bool
+ {
+ $shared = BBCode::fetchShareAttributes($body);
+ return !empty($shared['guid'] ?? '');
+ }
+
+ /**
+ * Checks if the provided body contains a "share" element
+ *
+ * @param string $body
+ * @return boolean
+ */
+ public static function existsShare(string $body): bool
+ {
+ $shared = BBCode::fetchShareAttributes($body);
+ return !empty($shared['link'] ?? '');
+ }
+
/**
* Replace the share block with a link
*
*/
public static function removeSharedData(string $body): string
{
- return preg_replace("/\s*\[share .*?\].*?\[\/share\]\s*/ism", '', $body);
+ return trim(preg_replace("/\s*\[share .*?\].*?\[\/share\]\s*/ism", '', $body));
}
/**
use Friendica\BaseFactory;
use Friendica\Content\ContactSelector;
-use Friendica\Content\Text\BBCode;
use Friendica\Database\Database;
use Friendica\Database\DBA;
+use Friendica\DI;
use Friendica\Model\Item;
use Friendica\Model\Post;
use Friendica\Model\Tag as TagModel;
$poll = null;
}
- $shared = Item::getShareArray($item);
- if (!empty($shared['guid'])) {
- $shared_item = Post::selectFirst(['uri-id', 'plink'], ['guid' => $shared['guid']]);
-
- $shared_uri_id = $shared_item['uri-id'] ?? 0;
+ $shared = DI::contentItem()->getSharedPost($item, ['uri-id']);
+ if (!empty($shared)) {
+ $shared_uri_id = $shared['post']['uri-id'];
$mentions = array_merge($mentions, $this->mstdnMentionFactory->createFromUriId($shared_uri_id)->getArrayCopy());
$tags = array_merge($tags, $this->mstdnTagFactory->createFromUriId($shared_uri_id));
use Friendica\Content\Text\BBCode;
use Friendica\Content\Text\HTML;
use Friendica\Database\Database;
+use Friendica\DI;
use Friendica\Factory\Api\Friendica\Activities;
use Friendica\Factory\Api\Twitter\User as TwitterUser;
use Friendica\Model\Item;
$friendica_activities = $this->activities->createFromUriId($item['uri-id'], $uid);
- $shared = Item::getShareArray($item);
- if (!empty($shared['guid'])) {
- $shared_item = Post::selectFirst(['uri-id', 'plink'], ['guid' => $shared['guid']]);
-
- $shared_uri_id = $shared_item['uri-id'] ?? 0;
+ $shared = DI::contentItem()->getSharedPost($item, ['uri-id']);
+ if (!empty($shared)) {
+ $shared_uri_id = $shared['post']['uri-id'];
if ($include_entities) {
$hashtags = array_merge($hashtags, $this->hashtag->createFromUriId($shared_uri_id, $text));
$item['mentions'] = $tags['mentions'];
$body = $item['body'] ?? '';
- $shared = self::getShareArray($item);
- if (!empty($shared['guid'])) {
- $shared_item = Post::selectFirst(['uri-id', 'guid', 'plink', 'has-media'], ['guid' => $shared['guid'], 'uid' => [$item['uid'], 0]]);
- }
$fields = ['uri-id', 'uri', 'body', 'title', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink', 'network', 'has-media'];
$shared_uri_id = 0;
$shared_links = [];
- if (empty($shared_item['uri-id']) && !empty($item['quote-uri-id'])) {
- $shared_item = Post::selectFirst($fields, ['uri-id' => $item['quote-uri-id']]);
- $quote_uri_id = $item['quote-uri-id'] ?? 0;
- $shared_links[] = strtolower($item['quote-uri']);
+ $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)) {
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
- {
- $attributes = BBCode::fetchShareAttributes($item['body'] ?? '');
- if (!empty($attributes)) {
- return $attributes;
- }
-
- if (!empty($item['quote-uri-id'])) {
- $shared = Post::selectFirst(['author-name', 'author-link', 'author-avatar', 'plink', 'created', 'guid', 'uri', 'body'], ['uri-id' => $item['quote-uri-id']]);
- if (!empty($shared)) {
- return [
- 'author' => $shared['author-name'],
- 'profile' => $shared['author-link'],
- 'avatar' => $shared['author-avatar'],
- 'link' => $shared['plink'],
- 'posted' => $shared['created'],
- 'guid' => $shared['guid'],
- 'message_id' => $shared['uri'],
- 'comment' => $item['body'],
- 'shared' => $shared['body'],
- ];
- }
- }
-
- return [];
- }
-
/**
* Check a prospective item array against user-level permissions
*
$unshared_body = $body = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $body);
// Only remove the shared data from "real" reshares
- $shared = BBCode::fetchShareAttributes($body);
- if (!empty($shared['guid'])) {
+ if (BBCode::isNativeReshare($body)) {
$unshared_body = BBCode::removeSharedData($body);
}
public static function insertFromRelevantUrl(int $uriid, string $body)
{
// Only remove the shared data from "real" reshares
- $shared = BBCode::fetchShareAttributes($body);
- if (!empty($shared['guid'])) {
+ if (BBCode::isNativeReshare($body)) {
// Don't look at the shared content
$body = BBCode::removeSharedData($body);
}
$body = preg_replace("/\s*\[attachment .*?\].*?\[\/attachment\]\s*/ism", '', $body);
}
- $body = BBCode::setMentionsToNicknames($body);
- $shared = BBCode::fetchShareAttributes($body);
+ $body = BBCode::setMentionsToNicknames($body);
+ $exists_reshare = BBCode::existsShare($body);
if (!empty($item['quote-uri']) && Post::exists(['uri-id' => $item['quote-uri-id'], 'network' => [Protocol::ACTIVITYPUB, Protocol::DFRN]])) {
$real_quote = true;
- if (!empty($shared['link'])) {
+ if ($exists_reshare) {
$body = BBCode::replaceSharedData($body);
} elseif (strpos($body, $item['quote-uri']) === false) {
$body .= "\n♲ " . $item['quote-uri'];
}
$data['quoteUrl'] = $item['quote-uri'];
- } elseif (!empty($item['quote-uri']) && empty($shared)) {
+ } elseif (!empty($item['quote-uri']) && !$exists_reshare) {
$body .= "\n" . DI::contentItem()->createSharedPostByUriId($item['quote-uri-id'], $item['uid'], true);
$item['body'] = Item::improveSharedDataInBody($item, true);
}
$richbody = BBCode::setMentionsToNicknames($item['body'] ?? '');
if ($real_quote) {
- $shared = BBCode::fetchShareAttributes($richbody);
- if (!empty($shared['link'])) {
+ if (BBCode::existsShare($richbody)) {
$richbody = BBCode::replaceSharedData($richbody);
} elseif (strpos($richbody, $item['quote-uri']) === false) {
$richbody .= "\n♲ " . $item['quote-uri'];
* @param array $item
* @return array Announcement array
*/
- public static function getAnnounceArray(array $item): array
+ private static function getAnnounceArray(array $item): array
{
- $reshared = Item::getShareArray($item);
- if (empty($reshared['guid'])) {
+ $reshared = DI::contentItem()->getSharedPost($item, Item::DELIVER_FIELDLIST);
+ if (empty($reshared)) {
return [];
}
- $reshared_item = Post::selectFirst(Item::DELIVER_FIELDLIST, ['guid' => $reshared['guid']]);
- if (!DBA::isResult($reshared_item)) {
+ if (!in_array($reshared['post']['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN])) {
return [];
}
- if (!in_array($reshared_item['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN])) {
- return [];
- }
-
- $profile = APContact::getByURL($reshared_item['author-link'], false);
+ $profile = APContact::getByURL($reshared['post']['author-link'], false);
if (empty($profile)) {
return [];
}
- return ['object' => $reshared_item, 'actor' => $profile, 'comment' => $reshared['comment']];
+ return ['object' => $reshared['post'], 'actor' => $profile, 'comment' => $reshared['comment']];
}
/**
*/
public static function getReshareDetails(array $item): array
{
- $reshared = Item::getShareArray($item);
+ $reshared = DI::contentItem()->getSharedPost($item, ['network', 'author-addr']);
if (empty($reshared)) {
return [];
}
// Skip if it isn't a pure repeated messages or not a real reshare
- if (!empty($reshared['comment']) || empty($reshared['guid'])) {
+ if (!empty($reshared['comment']) || !in_array($reshared['post']['network'], [Protocol::DFRN, Protocol::DIASPORA])) {
return [];
}
- $condition = ['guid' => $reshared['guid'], 'network' => [Protocol::DFRN, Protocol::DIASPORA]];
- $item = Post::selectFirst(['author-addr'], $condition);
- if (DBA::isResult($item)) {
- return [
- 'root_handle' => strtolower($item['author-addr']),
- 'root_guid' => $reshared['guid']
- ];
- }
-
- // We are resharing something that isn't a DFRN or Diaspora post.
- return [];
+ return [
+ 'root_handle' => strtolower($reshared['post']['author-addr']),
+ 'root_guid' => $reshared['guid']
+ ];
}
/**