mirror of
https://github.com/friendica/friendica
synced 2024-11-09 22:22:53 +00:00
Merge pull request #12070 from annando/share
Some more improvements for posts with shares
This commit is contained in:
commit
f418687a71
16 changed files with 208 additions and 153 deletions
|
@ -122,9 +122,9 @@ function display_init(App $a)
|
||||||
|
|
||||||
function display_fetchauthor($item)
|
function display_fetchauthor($item)
|
||||||
{
|
{
|
||||||
$shared = Item::getShareArray($item);
|
$shared = DI::contentItem()->getSharedPost($item, ['author-link']);
|
||||||
if (empty($shared['comment']) && !empty($shared['guid']) && !empty($shared['profile'])) {
|
if (!empty($shared) && empty($shared['comment'])) {
|
||||||
$contact = Contact::getByURLForUser($shared['profile'], DI::userSession()->getLocalUserId());
|
$contact = Contact::getByURLForUser($shared['post']['author-link'], DI::userSession()->getLocalUserId());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($contact)) {
|
if (empty($contact)) {
|
||||||
|
|
|
@ -611,7 +611,7 @@ function item_post(App $a) {
|
||||||
$datarray['author-uri-id'] = ItemURI::getIdByURI($datarray['author-link']);
|
$datarray['author-uri-id'] = ItemURI::getIdByURI($datarray['author-link']);
|
||||||
$datarray['owner-updated'] = '';
|
$datarray['owner-updated'] = '';
|
||||||
$datarray['has-media'] = false;
|
$datarray['has-media'] = false;
|
||||||
$datarray['body'] = Item::improveSharedDataInBody($datarray);
|
$datarray['body'] = DI::contentItem()->improveSharedDataInBody($datarray);
|
||||||
|
|
||||||
$o = DI::conversation()->create([array_merge($contact_record, $datarray)], 'search', false, true);
|
$o = DI::conversation()->create([array_merge($contact_record, $datarray)], 'search', false, true);
|
||||||
|
|
||||||
|
@ -652,7 +652,7 @@ function item_post(App $a) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$datarray['uri-id'] = ItemURI::getIdByURI($datarray['uri']);
|
$datarray['uri-id'] = ItemURI::getIdByURI($datarray['uri']);
|
||||||
$datarray['body'] = Item::improveSharedDataInBody($datarray);
|
$datarray['body'] = DI::contentItem()->improveSharedDataInBody($datarray);
|
||||||
|
|
||||||
if ($orig_post) {
|
if ($orig_post) {
|
||||||
$fields = [
|
$fields = [
|
||||||
|
|
|
@ -41,9 +41,9 @@ function share_init(App $a) {
|
||||||
System::exit();
|
System::exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
$shared = Item::getShareArray($item);
|
$shared = DI::contentItem()->getSharedPost($item, ['uri']);
|
||||||
if (empty($shared['comment']) && (!empty($shared['message_id']) || !empty($shared['link']))) {
|
if (!empty($shared) && empty($shared['comment'])) {
|
||||||
$content = '[share]' . ($shared['message_id'] ?: $shared['link']) . '[/share]';
|
$content = '[share]' . $shared['post']['uri'] . '[/share]';
|
||||||
} else {
|
} else {
|
||||||
$content = '[share]' . $item['uri'] . '[/share]';
|
$content = '[share]' . $item['uri'] . '[/share]';
|
||||||
}
|
}
|
||||||
|
|
|
@ -680,11 +680,11 @@ class Item
|
||||||
$shared_content .= '[h3]' . $item['title'] . "[/h3]\n";
|
$shared_content .= '[h3]' . $item['title'] . "[/h3]\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
$shared = ItemModel::getShareArray($item);
|
$shared = $this->getShareArray($item);
|
||||||
|
|
||||||
// If it is a reshared post then reformat it to avoid display problems with two share elements
|
// If it is a reshared post then reformat it to avoid display problems with two share elements
|
||||||
if (!empty($shared)) {
|
if (!empty($shared)) {
|
||||||
if (!empty($shared['guid']) && ($encaspulated_share = self::createSharedPostByGuid($shared['guid'], 0, '', $add_media))) {
|
if (!empty($shared['guid']) && ($encaspulated_share = $this->createSharedPostByGuid($shared['guid'], 0, '', $add_media))) {
|
||||||
$item['body'] = preg_replace("/\[share.*?\](.*)\[\/share\]/ism", $encaspulated_share, $item['body']);
|
$item['body'] = preg_replace("/\[share.*?\](.*)\[\/share\]/ism", $encaspulated_share, $item['body']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -695,4 +695,105 @@ class Item
|
||||||
|
|
||||||
return $shared_content;
|
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 [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Improve the data in shared posts
|
||||||
|
*
|
||||||
|
* @param array $item
|
||||||
|
* @param bool $add_media
|
||||||
|
* @return string body
|
||||||
|
*/
|
||||||
|
public function improveSharedDataInBody(array $item, bool $add_media = false): string
|
||||||
|
{
|
||||||
|
$shared = BBCode::fetchShareAttributes($item['body']);
|
||||||
|
if (empty($shared['guid']) && empty($shared['message_id'])) {
|
||||||
|
return $item['body'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$link = $shared['link'] ?: $shared['message_id'];
|
||||||
|
|
||||||
|
if (empty($shared_content)) {
|
||||||
|
$shared_content = $this->createSharedPostByUrl($link, $item['uid'] ?? 0, $add_media);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($shared_content)) {
|
||||||
|
return $item['body'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$item['body'] = preg_replace("/\[share.*?\](.*)\[\/share\]/ism", $shared_content, $item['body']);
|
||||||
|
|
||||||
|
Logger::debug('New shared data', ['uri-id' => $item['uri-id'], 'link' => $link, 'guid' => $item['guid']]);
|
||||||
|
return $item['body'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
private 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 [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1070,6 +1070,30 @@ class BBCode
|
||||||
return $attributes;
|
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
|
* Replace the share block with a link
|
||||||
*
|
*
|
||||||
|
@ -1094,7 +1118,7 @@ class BBCode
|
||||||
*/
|
*/
|
||||||
public static function removeSharedData(string $body): string
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -359,7 +359,7 @@ class PostUpdate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Tag::store($term['uri-id'], $term['type'], $term['term'], $term['url'], false);
|
Tag::store($term['uri-id'], $term['type'], $term['term'], $term['url']);
|
||||||
|
|
||||||
$id = $term['tid'];
|
$id = $term['tid'];
|
||||||
++$rows;
|
++$rows;
|
||||||
|
|
|
@ -23,7 +23,7 @@ namespace Friendica\Factory\Api\Mastodon;
|
||||||
|
|
||||||
use Friendica\BaseFactory;
|
use Friendica\BaseFactory;
|
||||||
use Friendica\Content\ContactSelector;
|
use Friendica\Content\ContactSelector;
|
||||||
use Friendica\Content\Text\BBCode;
|
use Friendica\Content\Item as ContentItem;
|
||||||
use Friendica\Database\Database;
|
use Friendica\Database\Database;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\Model\Item;
|
use Friendica\Model\Item;
|
||||||
|
@ -54,11 +54,14 @@ class Status extends BaseFactory
|
||||||
private $mstdnErrorFactory;
|
private $mstdnErrorFactory;
|
||||||
/** @var Poll */
|
/** @var Poll */
|
||||||
private $mstdnPollFactory;
|
private $mstdnPollFactory;
|
||||||
|
/** @var ContentItem */
|
||||||
|
private $contentItem;
|
||||||
|
|
||||||
public function __construct(LoggerInterface $logger, Database $dba,
|
public function __construct(LoggerInterface $logger, Database $dba,
|
||||||
Account $mstdnAccountFactory, Mention $mstdnMentionFactory,
|
Account $mstdnAccountFactory, Mention $mstdnMentionFactory,
|
||||||
Tag $mstdnTagFactory, Card $mstdnCardFactory,
|
Tag $mstdnTagFactory, Card $mstdnCardFactory,
|
||||||
Attachment $mstdnAttachementFactory, Error $mstdnErrorFactory, Poll $mstdnPollFactory)
|
Attachment $mstdnAttachementFactory, Error $mstdnErrorFactory,
|
||||||
|
Poll $mstdnPollFactory, ContentItem $contentItem)
|
||||||
{
|
{
|
||||||
parent::__construct($logger);
|
parent::__construct($logger);
|
||||||
$this->dba = $dba;
|
$this->dba = $dba;
|
||||||
|
@ -69,6 +72,7 @@ class Status extends BaseFactory
|
||||||
$this->mstdnAttachementFactory = $mstdnAttachementFactory;
|
$this->mstdnAttachementFactory = $mstdnAttachementFactory;
|
||||||
$this->mstdnErrorFactory = $mstdnErrorFactory;
|
$this->mstdnErrorFactory = $mstdnErrorFactory;
|
||||||
$this->mstdnPollFactory = $mstdnPollFactory;
|
$this->mstdnPollFactory = $mstdnPollFactory;
|
||||||
|
$this->contentItem = $contentItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -155,11 +159,9 @@ class Status extends BaseFactory
|
||||||
$poll = null;
|
$poll = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$shared = Item::getShareArray($item);
|
$shared = $this->contentItem->getSharedPost($item, ['uri-id']);
|
||||||
if (!empty($shared['guid'])) {
|
if (!empty($shared)) {
|
||||||
$shared_item = Post::selectFirst(['uri-id', 'plink'], ['guid' => $shared['guid']]);
|
$shared_uri_id = $shared['post']['uri-id'];
|
||||||
|
|
||||||
$shared_uri_id = $shared_item['uri-id'] ?? 0;
|
|
||||||
|
|
||||||
$mentions = array_merge($mentions, $this->mstdnMentionFactory->createFromUriId($shared_uri_id)->getArrayCopy());
|
$mentions = array_merge($mentions, $this->mstdnMentionFactory->createFromUriId($shared_uri_id)->getArrayCopy());
|
||||||
$tags = array_merge($tags, $this->mstdnTagFactory->createFromUriId($shared_uri_id));
|
$tags = array_merge($tags, $this->mstdnTagFactory->createFromUriId($shared_uri_id));
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
namespace Friendica\Factory\Api\Twitter;
|
namespace Friendica\Factory\Api\Twitter;
|
||||||
|
|
||||||
use Friendica\BaseFactory;
|
use Friendica\BaseFactory;
|
||||||
|
use Friendica\Content\Item as ContentItem;
|
||||||
use Friendica\Content\Text\BBCode;
|
use Friendica\Content\Text\BBCode;
|
||||||
use Friendica\Content\Text\HTML;
|
use Friendica\Content\Text\HTML;
|
||||||
use Friendica\Database\Database;
|
use Friendica\Database\Database;
|
||||||
|
@ -53,8 +54,10 @@ class Status extends BaseFactory
|
||||||
private $activities;
|
private $activities;
|
||||||
/** @var Activities entity */
|
/** @var Activities entity */
|
||||||
private $attachment;
|
private $attachment;
|
||||||
|
/** @var ContentItem */
|
||||||
|
private $contentItem;
|
||||||
|
|
||||||
public function __construct(LoggerInterface $logger, Database $dba, TwitterUser $twitteruser, Hashtag $hashtag, Media $media, Url $url, Mention $mention, Activities $activities, Attachment $attachment)
|
public function __construct(LoggerInterface $logger, Database $dba, TwitterUser $twitteruser, Hashtag $hashtag, Media $media, Url $url, Mention $mention, Activities $activities, Attachment $attachment, ContentItem $contentItem)
|
||||||
{
|
{
|
||||||
parent::__construct($logger);
|
parent::__construct($logger);
|
||||||
$this->dba = $dba;
|
$this->dba = $dba;
|
||||||
|
@ -65,6 +68,7 @@ class Status extends BaseFactory
|
||||||
$this->mention = $mention;
|
$this->mention = $mention;
|
||||||
$this->activities = $activities;
|
$this->activities = $activities;
|
||||||
$this->attachment = $attachment;
|
$this->attachment = $attachment;
|
||||||
|
$this->contentItem = $contentItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -178,11 +182,9 @@ class Status extends BaseFactory
|
||||||
|
|
||||||
$friendica_activities = $this->activities->createFromUriId($item['uri-id'], $uid);
|
$friendica_activities = $this->activities->createFromUriId($item['uri-id'], $uid);
|
||||||
|
|
||||||
$shared = Item::getShareArray($item);
|
$shared = $this->contentItem->getSharedPost($item, ['uri-id']);
|
||||||
if (!empty($shared['guid'])) {
|
if (!empty($shared)) {
|
||||||
$shared_item = Post::selectFirst(['uri-id', 'plink'], ['guid' => $shared['guid']]);
|
$shared_uri_id = $shared['post']['uri-id'];
|
||||||
|
|
||||||
$shared_uri_id = $shared_item['uri-id'] ?? 0;
|
|
||||||
|
|
||||||
if ($include_entities) {
|
if ($include_entities) {
|
||||||
$hashtags = array_merge($hashtags, $this->hashtag->createFromUriId($shared_uri_id, $text));
|
$hashtags = array_merge($hashtags, $this->hashtag->createFromUriId($shared_uri_id, $text));
|
||||||
|
|
|
@ -2950,20 +2950,18 @@ class Item
|
||||||
$item['mentions'] = $tags['mentions'];
|
$item['mentions'] = $tags['mentions'];
|
||||||
|
|
||||||
$body = $item['body'] ?? '';
|
$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'];
|
$fields = ['uri-id', 'uri', 'body', 'title', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink', 'network', 'has-media'];
|
||||||
|
|
||||||
$shared_uri_id = 0;
|
$shared_uri_id = 0;
|
||||||
$shared_links = [];
|
$shared_links = [];
|
||||||
|
|
||||||
if (empty($shared_item['uri-id']) && !empty($item['quote-uri-id'])) {
|
$shared = DI::contentItem()->getSharedPost($item, $fields);
|
||||||
$shared_item = Post::selectFirst($fields, ['uri-id' => $item['quote-uri-id']]);
|
if (!empty($shared['post'])) {
|
||||||
$quote_uri_id = $item['quote-uri-id'] ?? 0;
|
$shared_item = $shared['post'];
|
||||||
$shared_links[] = strtolower($item['quote-uri']);
|
$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'])) {
|
} elseif (empty($shared_item['uri-id']) && empty($item['quote-uri-id'])) {
|
||||||
$media = Post\Media::getByURIId($item['uri-id'], [Post\Media::ACTIVITY]);
|
$media = Post\Media::getByURIId($item['uri-id'], [Post\Media::ACTIVITY]);
|
||||||
if (!empty($media)) {
|
if (!empty($media)) {
|
||||||
|
@ -3589,43 +3587,6 @@ class Item
|
||||||
return 0;
|
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
|
* Check a prospective item array against user-level permissions
|
||||||
*
|
*
|
||||||
|
@ -3663,36 +3624,6 @@ class Item
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Improve the data in shared posts
|
|
||||||
*
|
|
||||||
* @param array $item
|
|
||||||
* @param bool $add_media
|
|
||||||
* @return string body
|
|
||||||
*/
|
|
||||||
public static function improveSharedDataInBody(array $item, bool $add_media = false): string
|
|
||||||
{
|
|
||||||
$shared = BBCode::fetchShareAttributes($item['body']);
|
|
||||||
if (empty($shared['guid']) && empty($shared['message_id'])) {
|
|
||||||
return $item['body'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$link = $shared['link'] ?: $shared['message_id'];
|
|
||||||
|
|
||||||
if (empty($shared_content)) {
|
|
||||||
$shared_content = DI::contentItem()->createSharedPostByUrl($link, $item['uid'] ?? 0, $add_media);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (empty($shared_content)) {
|
|
||||||
return $item['body'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$item['body'] = preg_replace("/\[share.*?\](.*)\[\/share\]/ism", $shared_content, $item['body']);
|
|
||||||
|
|
||||||
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
|
* Fetch the uri-id of a quote
|
||||||
*
|
*
|
||||||
|
|
|
@ -404,8 +404,7 @@ class Media
|
||||||
$unshared_body = $body = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $body);
|
$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
|
// Only remove the shared data from "real" reshares
|
||||||
$shared = BBCode::fetchShareAttributes($body);
|
if (BBCode::isNativeReshare($body)) {
|
||||||
if (!empty($shared['guid'])) {
|
|
||||||
$unshared_body = BBCode::removeSharedData($body);
|
$unshared_body = BBCode::removeSharedData($body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -486,8 +485,7 @@ class Media
|
||||||
public static function insertFromRelevantUrl(int $uriid, string $body)
|
public static function insertFromRelevantUrl(int $uriid, string $body)
|
||||||
{
|
{
|
||||||
// Only remove the shared data from "real" reshares
|
// Only remove the shared data from "real" reshares
|
||||||
$shared = BBCode::fetchShareAttributes($body);
|
if (BBCode::isNativeReshare($body)) {
|
||||||
if (!empty($shared['guid'])) {
|
|
||||||
// Don't look at the shared content
|
// Don't look at the shared content
|
||||||
$body = BBCode::removeSharedData($body);
|
$body = BBCode::removeSharedData($body);
|
||||||
}
|
}
|
||||||
|
|
|
@ -257,17 +257,16 @@ class Tag
|
||||||
* @param string $hash
|
* @param string $hash
|
||||||
* @param string $name
|
* @param string $name
|
||||||
* @param string $url
|
* @param string $url
|
||||||
* @param boolean $probing Whether probing is active
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function storeByHash(int $uriId, string $hash, string $name, string $url = '', bool $probing = true)
|
public static function storeByHash(int $uriId, string $hash, string $name, string $url = '')
|
||||||
{
|
{
|
||||||
$type = self::getTypeForHash($hash);
|
$type = self::getTypeForHash($hash);
|
||||||
if ($type == self::UNKNOWN) {
|
if ($type == self::UNKNOWN) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self::store($uriId, $type, $name, $url, $probing);
|
self::store($uriId, $type, $name, $url);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -297,32 +296,43 @@ class Tag
|
||||||
* @param integer $uriId URI-Id
|
* @param integer $uriId URI-Id
|
||||||
* @param string $body Body of the post
|
* @param string $body Body of the post
|
||||||
* @param string $tags Accepted tags
|
* @param string $tags Accepted tags
|
||||||
* @param boolean $probing Perform a probing for contacts, adding them if needed
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function storeFromBody(int $uriId, string $body, string $tags = null, bool $probing = true)
|
public static function storeFromBody(int $uriId, string $body, string $tags = null)
|
||||||
{
|
{
|
||||||
Logger::info('Check for tags', ['uri-id' => $uriId, 'hash' => $tags, 'callstack' => System::callstack()]);
|
$item = ['uri-id' => $uriId, 'body' => $body, 'quote-uri-id' => null];
|
||||||
|
self::storeFromArray($item, $tags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store tags and mentions from the item array
|
||||||
|
*
|
||||||
|
* @param array $item Item array
|
||||||
|
* @param string $tags Accepted tags
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function storeFromArray(array $item, string $tags = null)
|
||||||
|
{
|
||||||
|
Logger::info('Check for tags', ['uri-id' => $item['uri-id'], 'hash' => $tags, 'callstack' => System::callstack()]);
|
||||||
|
|
||||||
if (is_null($tags)) {
|
if (is_null($tags)) {
|
||||||
$tags = self::TAG_CHARACTER[self::HASHTAG] . self::TAG_CHARACTER[self::MENTION] . self::TAG_CHARACTER[self::EXCLUSIVE_MENTION];
|
$tags = self::TAG_CHARACTER[self::HASHTAG] . self::TAG_CHARACTER[self::MENTION] . self::TAG_CHARACTER[self::EXCLUSIVE_MENTION];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only remove the shared data from "real" reshares
|
// Only remove the shared data from "real" reshares
|
||||||
$shared = BBCode::fetchShareAttributes($body);
|
$shared = DI::contentItem()->getSharedPost($item, ['uri-id']);
|
||||||
if (!empty($shared['guid'])) {
|
if (!empty($shared)) {
|
||||||
$share_body = $shared['shared'];
|
$item['body'] = BBCode::removeSharedData($item['body']);
|
||||||
$body = BBCode::removeSharedData($body);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (self::getFromBody($body, $tags) as $tag) {
|
foreach (self::getFromBody($item['body'], $tags) as $tag) {
|
||||||
self::storeByHash($uriId, $tag[1], $tag[3], $tag[2], $probing);
|
self::storeByHash($item['uri-id'], $tag[1], $tag[3], $tag[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Search for hashtags in the shared body (but only if hashtags are wanted)
|
// Search for hashtags in the shared body (but only if hashtags are wanted)
|
||||||
if (!empty($share_body) && (strpos($tags, self::TAG_CHARACTER[self::HASHTAG]) !== false)) {
|
if (!empty($shared) && (strpos($tags, self::TAG_CHARACTER[self::HASHTAG]) !== false)) {
|
||||||
foreach (self::getFromBody($share_body, self::TAG_CHARACTER[self::HASHTAG]) as $tag) {
|
foreach (self::getByURIId($shared['post']['uri-id'], [self::HASHTAG]) as $tag) {
|
||||||
self::storeByHash($uriId, $tag[1], $tag[3], $tag[2], $probing);
|
self::store($item['uri-id'], $tag['type'], $tag['name'], $tag['url']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -830,7 +830,7 @@ class Processor
|
||||||
if (!empty($activity['source'])) {
|
if (!empty($activity['source'])) {
|
||||||
$item['body'] = $activity['source'];
|
$item['body'] = $activity['source'];
|
||||||
$item['raw-body'] = $content;
|
$item['raw-body'] = $content;
|
||||||
$item['body'] = Item::improveSharedDataInBody($item);
|
$item['body'] = DI::contentItem()->improveSharedDataInBody($item);
|
||||||
} else {
|
} else {
|
||||||
$parent_uri = $item['parent-uri'] ?? $item['thr-parent'];
|
$parent_uri = $item['parent-uri'] ?? $item['thr-parent'];
|
||||||
if (empty($activity['directmessage']) && ($parent_uri != $item['uri']) && ($item['gravity'] == Item::GRAVITY_COMMENT)) {
|
if (empty($activity['directmessage']) && ($parent_uri != $item['uri']) && ($item['gravity'] == Item::GRAVITY_COMMENT)) {
|
||||||
|
|
|
@ -1664,20 +1664,20 @@ class Transmitter
|
||||||
$body = preg_replace("/\s*\[attachment .*?\].*?\[\/attachment\]\s*/ism", '', $body);
|
$body = preg_replace("/\s*\[attachment .*?\].*?\[\/attachment\]\s*/ism", '', $body);
|
||||||
}
|
}
|
||||||
|
|
||||||
$body = BBCode::setMentionsToNicknames($body);
|
$body = BBCode::setMentionsToNicknames($body);
|
||||||
$shared = BBCode::fetchShareAttributes($body);
|
$exists_reshare = BBCode::existsShare($body);
|
||||||
|
|
||||||
if (!empty($item['quote-uri']) && Post::exists(['uri-id' => $item['quote-uri-id'], 'network' => [Protocol::ACTIVITYPUB, Protocol::DFRN]])) {
|
if (!empty($item['quote-uri']) && Post::exists(['uri-id' => $item['quote-uri-id'], 'network' => [Protocol::ACTIVITYPUB, Protocol::DFRN]])) {
|
||||||
$real_quote = true;
|
$real_quote = true;
|
||||||
if (!empty($shared['link'])) {
|
if ($exists_reshare) {
|
||||||
$body = BBCode::replaceSharedData($body);
|
$body = BBCode::replaceSharedData($body);
|
||||||
} elseif (strpos($body, $item['quote-uri']) === false) {
|
} elseif (strpos($body, $item['quote-uri']) === false) {
|
||||||
$body .= "\n♲ " . $item['quote-uri'];
|
$body .= "\n♲ " . $item['quote-uri'];
|
||||||
}
|
}
|
||||||
$data['quoteUrl'] = $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);
|
$body .= "\n" . DI::contentItem()->createSharedPostByUriId($item['quote-uri-id'], $item['uid'], true);
|
||||||
$item['body'] = Item::improveSharedDataInBody($item, true);
|
$item['body'] = DI::contentItem()->improveSharedDataInBody($item, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
$data['content'] = BBCode::convertForUriId($item['uri-id'], $body, BBCode::ACTIVITYPUB);
|
$data['content'] = BBCode::convertForUriId($item['uri-id'], $body, BBCode::ACTIVITYPUB);
|
||||||
|
@ -1691,8 +1691,7 @@ class Transmitter
|
||||||
$richbody = BBCode::setMentionsToNicknames($item['body'] ?? '');
|
$richbody = BBCode::setMentionsToNicknames($item['body'] ?? '');
|
||||||
|
|
||||||
if ($real_quote) {
|
if ($real_quote) {
|
||||||
$shared = BBCode::fetchShareAttributes($richbody);
|
if (BBCode::existsShare($richbody)) {
|
||||||
if (!empty($shared['link'])) {
|
|
||||||
$richbody = BBCode::replaceSharedData($richbody);
|
$richbody = BBCode::replaceSharedData($richbody);
|
||||||
} elseif (strpos($richbody, $item['quote-uri']) === false) {
|
} elseif (strpos($richbody, $item['quote-uri']) === false) {
|
||||||
$richbody .= "\n♲ " . $item['quote-uri'];
|
$richbody .= "\n♲ " . $item['quote-uri'];
|
||||||
|
@ -1821,28 +1820,23 @@ class Transmitter
|
||||||
* @param array $item
|
* @param array $item
|
||||||
* @return array Announcement array
|
* @return array Announcement array
|
||||||
*/
|
*/
|
||||||
public static function getAnnounceArray(array $item): array
|
private static function getAnnounceArray(array $item): array
|
||||||
{
|
{
|
||||||
$reshared = Item::getShareArray($item);
|
$reshared = DI::contentItem()->getSharedPost($item, Item::DELIVER_FIELDLIST);
|
||||||
if (empty($reshared['guid'])) {
|
if (empty($reshared)) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
$reshared_item = Post::selectFirst(Item::DELIVER_FIELDLIST, ['guid' => $reshared['guid']]);
|
if (!in_array($reshared['post']['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN])) {
|
||||||
if (!DBA::isResult($reshared_item)) {
|
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!in_array($reshared_item['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN])) {
|
$profile = APContact::getByURL($reshared['post']['author-link'], false);
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
$profile = APContact::getByURL($reshared_item['author-link'], false);
|
|
||||||
if (empty($profile)) {
|
if (empty($profile)) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
return ['object' => $reshared_item, 'actor' => $profile, 'comment' => $reshared['comment']];
|
return ['object' => $reshared['post'], 'actor' => $profile, 'comment' => $reshared['comment']];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1838,7 +1838,7 @@ class DFRN
|
||||||
|
|
||||||
$item['uri-id'] = ItemURI::insert(['uri' => $item['uri'], 'guid' => $item['guid']]);
|
$item['uri-id'] = ItemURI::insert(['uri' => $item['uri'], 'guid' => $item['guid']]);
|
||||||
|
|
||||||
$item['body'] = Item::improveSharedDataInBody($item);
|
$item['body'] = DI::contentItem()->improveSharedDataInBody($item);
|
||||||
|
|
||||||
Tag::storeFromBody($item['uri-id'], $item['body']);
|
Tag::storeFromBody($item['uri-id'], $item['body']);
|
||||||
|
|
||||||
|
|
|
@ -3181,27 +3181,20 @@ class Diaspora
|
||||||
*/
|
*/
|
||||||
public static function getReshareDetails(array $item): array
|
public static function getReshareDetails(array $item): array
|
||||||
{
|
{
|
||||||
$reshared = Item::getShareArray($item);
|
$reshared = DI::contentItem()->getSharedPost($item, ['network', 'author-addr']);
|
||||||
if (empty($reshared)) {
|
if (empty($reshared)) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip if it isn't a pure repeated messages or not a real reshare
|
// 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 [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
$condition = ['guid' => $reshared['guid'], 'network' => [Protocol::DFRN, Protocol::DIASPORA]];
|
return [
|
||||||
$item = Post::selectFirst(['author-addr'], $condition);
|
'root_handle' => strtolower($reshared['post']['author-addr']),
|
||||||
if (DBA::isResult($item)) {
|
'root_guid' => $reshared['guid']
|
||||||
return [
|
];
|
||||||
'root_handle' => strtolower($item['author-addr']),
|
|
||||||
'root_guid' => $reshared['guid']
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
// We are resharing something that isn't a DFRN or Diaspora post.
|
|
||||||
return [];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -49,7 +49,7 @@ class StatusTest extends FixtureTest
|
||||||
new Url(DI::logger()),
|
new Url(DI::logger()),
|
||||||
new Mention(DI::logger(), DI::baseUrl()),
|
new Mention(DI::logger(), DI::baseUrl()),
|
||||||
new Activities(DI::logger(), DI::twitterUser()),
|
new Activities(DI::logger(), DI::twitterUser()),
|
||||||
new Attachment(DI::logger()));
|
new Attachment(DI::logger()), DI::contentItem());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue