Merge pull request #8611 from annando/issue-8610

Issue 8610: Implicit mentions work again
This commit is contained in:
Hypolite Petovan 2020-05-09 16:03:45 -04:00 committed by GitHub
commit d35dc64660
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 38 additions and 81 deletions

View File

@ -100,14 +100,9 @@ function item_post(App $a) {
$toplevel_item_id = intval($_REQUEST['parent'] ?? 0); $toplevel_item_id = intval($_REQUEST['parent'] ?? 0);
$thr_parent_uri = trim($_REQUEST['parent_uri'] ?? ''); $thr_parent_uri = trim($_REQUEST['parent_uri'] ?? '');
$thread_parent_uriid = 0;
$thread_parent_contact = null;
$toplevel_item = null; $toplevel_item = null;
$parent_user = null; $parent_user = null;
$parent_contact = null;
$objecttype = null; $objecttype = null;
$profile_uid = ($_REQUEST['profile_uid'] ?? 0) ?: local_user(); $profile_uid = ($_REQUEST['profile_uid'] ?? 0) ?: local_user();
$posttype = ($_REQUEST['post_type'] ?? '') ?: Item::PT_ARTICLE; $posttype = ($_REQUEST['post_type'] ?? '') ?: Item::PT_ARTICLE;
@ -122,9 +117,7 @@ function item_post(App $a) {
// if this isn't the top-level parent of the conversation, find it // if this isn't the top-level parent of the conversation, find it
if (DBA::isResult($toplevel_item)) { if (DBA::isResult($toplevel_item)) {
// The URI and the contact is taken from the direct parent which needn't to be the top parent // The URI and the contact is taken from the direct parent which needn't to be the top parent
$thread_parent_uriid = $toplevel_item['uri-id'];
$thr_parent_uri = $toplevel_item['uri']; $thr_parent_uri = $toplevel_item['uri'];
$thread_parent_contact = Contact::getDetailsByURL($toplevel_item["author-link"]);
if ($toplevel_item['id'] != $toplevel_item['parent']) { if ($toplevel_item['id'] != $toplevel_item['parent']) {
$toplevel_item = Item::selectFirst([], ['id' => $toplevel_item['parent']]); $toplevel_item = Item::selectFirst([], ['id' => $toplevel_item['parent']]);
@ -379,10 +372,6 @@ function item_post(App $a) {
$tags = BBCode::getTags($body); $tags = BBCode::getTags($body);
if ($thread_parent_uriid && !\Friendica\Content\Feature::isEnabled($uid, 'explicit_mentions')) {
$tags = item_add_implicit_mentions($tags, $thread_parent_contact, $thread_parent_uriid);
}
$tagged = []; $tagged = [];
$private_forum = false; $private_forum = false;
@ -748,6 +737,10 @@ function item_post(App $a) {
Tag::storeFromBody($datarray['uri-id'], $datarray['body']); Tag::storeFromBody($datarray['uri-id'], $datarray['body']);
if (!\Friendica\Content\Feature::isEnabled($uid, 'explicit_mentions') && ($datarray['gravity'] == GRAVITY_COMMENT)) {
Tag::createImplicitMentions($datarray['uri-id'], $datarray['thr-parent-id']);
}
// update filetags in pconfig // update filetags in pconfig
FileTag::updatePconfig($uid, $categories_old, $categories_new, 'category'); FileTag::updatePconfig($uid, $categories_old, $categories_new, 'category');
@ -999,34 +992,3 @@ function handle_tag(&$body, &$inform, $profile_uid, $tag, $network = "")
return ['replaced' => $replaced, 'contact' => $contact]; return ['replaced' => $replaced, 'contact' => $contact];
} }
function item_add_implicit_mentions(array $tags, array $thread_parent_contact, $thread_parent_uriid)
{
if (DI::config()->get('system', 'disable_implicit_mentions')) {
// Add a tag if the parent contact is from ActivityPub or OStatus (This will notify them)
if (in_array($thread_parent_contact['network'], [Protocol::OSTATUS, Protocol::ACTIVITYPUB])) {
$contact = Tag::TAG_CHARACTER[Tag::MENTION] . '[url=' . $thread_parent_contact['url'] . ']' . $thread_parent_contact['nick'] . '[/url]';
if (!stripos(implode($tags), '[url=' . $thread_parent_contact['url'] . ']')) {
$tags[] = $contact;
}
}
} else {
$implicit_mentions = [
$thread_parent_contact['url'] => $thread_parent_contact['nick']
];
$parent_terms = Tag::getByURIId($thread_parent_uriid, [Tag::MENTION, Tag::IMPLICIT_MENTION]);
foreach ($parent_terms as $parent_term) {
$implicit_mentions[$parent_term['url']] = $parent_term['name'];
}
foreach ($implicit_mentions as $url => $label) {
if ($url != \Friendica\Model\Profile::getMyURL() && !stripos(implode($tags), '[url=' . $url . ']')) {
$tags[] = Tag::TAG_CHARACTER[Tag::IMPLICIT_MENTION] . '[url=' . $url . ']' . $label . '[/url]';
}
}
}
return $tags;
}

View File

@ -325,6 +325,29 @@ class Tag
} }
} }
/**
* Create implicit mentions for a given post
*
* @param integer $uri_id
* @param integer $parent_uri_id
*/
public static function createImplicitMentions(int $uri_id, int $parent_uri_id)
{
// Always mention the direct parent author
$parent = Item::selectFirst(['author-link', 'author-name'], ['uri-id' => $parent_uri_id]);
self::store($uri_id, self::IMPLICIT_MENTION, $parent['author-name'], $parent['author-link']);
if (DI::config()->get('system', 'disable_implicit_mentions')) {
return;
}
$tags = DBA::select('tag-view', ['name', 'url'], ['uri-id' => $parent_uri_id]);
while ($tag = DBA::fetch($tags)) {
self::store($uri_id, self::IMPLICIT_MENTION, $tag['name'], $tag['url']);
}
DBA::close($tags);
}
/** /**
* Retrieves the terms from the provided type(s) associated with the provided item ID. * Retrieves the terms from the provided type(s) associated with the provided item ID.
* *

View File

@ -359,9 +359,7 @@ class Processor
return false; return false;
} }
$potential_implicit_mentions = self::getImplicitMentionList($parent); $content = self::removeImplicitMentionsFromBody($content, $parent);
$content = self::removeImplicitMentionsFromBody($content, $potential_implicit_mentions);
$activity['tags'] = self::convertImplicitMentionsInTags($activity['tags'], $potential_implicit_mentions);
} }
$item['content-warning'] = HTML::toBBCode($activity['summary']); $item['content-warning'] = HTML::toBBCode($activity['summary']);
$item['body'] = $content; $item['body'] = $content;
@ -971,10 +969,6 @@ class Processor
*/ */
private static function getImplicitMentionList(array $parent) private static function getImplicitMentionList(array $parent)
{ {
if (DI::config()->get('system', 'disable_implicit_mentions')) {
return [];
}
$parent_terms = Tag::getByURIId($parent['uri-id'], [Tag::MENTION, Tag::IMPLICIT_MENTION, Tag::EXCLUSIVE_MENTION]); $parent_terms = Tag::getByURIId($parent['uri-id'], [Tag::MENTION, Tag::IMPLICIT_MENTION, Tag::EXCLUSIVE_MENTION]);
$parent_author = Contact::getDetailsByURL($parent['author-link'], 0); $parent_author = Contact::getDetailsByURL($parent['author-link'], 0);
@ -1008,15 +1002,17 @@ class Processor
* Strips from the body prepended implicit mentions * Strips from the body prepended implicit mentions
* *
* @param string $body * @param string $body
* @param array $potential_mentions * @param array $parent
* @return string * @return string
*/ */
private static function removeImplicitMentionsFromBody($body, array $potential_mentions) private static function removeImplicitMentionsFromBody(string $body, array $parent)
{ {
if (DI::config()->get('system', 'disable_implicit_mentions')) { if (DI::config()->get('system', 'disable_implicit_mentions')) {
return $body; return $body;
} }
$potential_mentions = self::getImplicitMentionList($parent);
$kept_mentions = []; $kept_mentions = [];
// Extract one prepended mention at a time from the body // Extract one prepended mention at a time from the body
@ -1033,24 +1029,4 @@ class Processor
return implode('', $kept_mentions); return implode('', $kept_mentions);
} }
private static function convertImplicitMentionsInTags($activity_tags, array $potential_mentions)
{
if (DI::config()->get('system', 'disable_implicit_mentions')) {
return $activity_tags;
}
foreach ($activity_tags as $index => $tag) {
if (in_array($tag['href'], $potential_mentions)) {
$activity_tags[$index]['name'] = preg_replace(
'/' . preg_quote(Tag::TAG_CHARACTER[Tag::MENTION], '/') . '/',
Tag::TAG_CHARACTER[Tag::IMPLICIT_MENTION],
$activity_tags[$index]['name'],
1
);
}
}
return $activity_tags;
}
} }

View File

@ -1294,7 +1294,7 @@ class Transmitter
$body = $item['body']; $body = $item['body'];
if (empty($item['uid']) || !Feature::isEnabled($item['uid'], 'explicit_mentions')) { if (empty($item['uid']) || !Feature::isEnabled($item['uid'], 'explicit_mentions')) {
$body = self::prependMentions($body, $permission_block); $body = self::prependMentions($body, $item['uri-id']);
} }
if ($type == 'Note') { if ($type == 'Note') {
@ -1843,22 +1843,18 @@ class Transmitter
HTTPSignature::transmit($signed, $profile['inbox'], $uid); HTTPSignature::transmit($signed, $profile['inbox'], $uid);
} }
private static function prependMentions($body, array $permission_block) private static function prependMentions($body, int $uriid)
{ {
if (DI::config()->get('system', 'disable_implicit_mentions')) {
return $body;
}
$mentions = []; $mentions = [];
foreach ($permission_block['to'] as $profile_url) { foreach (Tag::getByURIId($uriid, [Tag::IMPLICIT_MENTION]) as $tag) {
$profile = Contact::getDetailsByURL($profile_url); $profile = Contact::getDetailsByURL($tag['url']);
if (!empty($profile['addr']) if (!empty($profile['addr'])
&& $profile['contact-type'] != Contact::TYPE_COMMUNITY && $profile['contact-type'] != Contact::TYPE_COMMUNITY
&& !strstr($body, $profile['addr']) && !strstr($body, $profile['addr'])
&& !strstr($body, $profile_url) && !strstr($body, $tag['url'])
) { ) {
$mentions[] = '@[url=' . $profile_url . ']' . $profile['nick'] . '[/url]'; $mentions[] = '@[url=' . $tag['url'] . ']' . $profile['nick'] . '[/url]';
} }
} }