X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fconversation.php;h=507add97d61ef5f79a9c8db6bc0c21431dea1616;hb=a2532ad7554602d631d9caabb5c74564328d1fff;hp=4fdc35737978191be231a1229ea5e42a0937fdf2;hpb=71a0c52dc338213f81a17e95ef166d56f2d6bc40;p=friendica.git
diff --git a/include/conversation.php b/include/conversation.php
index 4fdc357379..507add97d6 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -20,8 +20,10 @@
*/
use Friendica\App;
+use Friendica\BaseModule;
use Friendica\Content\ContactSelector;
use Friendica\Content\Feature;
+use Friendica\Core\ACL;
use Friendica\Core\Hook;
use Friendica\Core\Logger;
use Friendica\Core\Protocol;
@@ -34,6 +36,7 @@ use Friendica\Model\Contact;
use Friendica\Model\Item;
use Friendica\Model\Post;
use Friendica\Model\Tag;
+use Friendica\Model\User;
use Friendica\Model\Verb;
use Friendica\Object\Post as PostObject;
use Friendica\Object\Thread;
@@ -309,7 +312,7 @@ function conversation(App $a, array $items, $mode, $update, $preview = false, $o
. "'; \r\n";
}
} elseif ($mode === 'profile') {
- $items = conversation_add_children($items, false, $order, $uid);
+ $items = conversation_add_children($items, false, $order, local_user());
if (!$update) {
$tab = 'posts';
@@ -394,9 +397,10 @@ function conversation(App $a, array $items, $mode, $update, $preview = false, $o
$threadsid = -1;
$page_template = Renderer::getMarkupTemplate("conversation.tpl");
+ $formSecurityToken = BaseModule::getFormSecurityToken('contact_action');
if (!empty($items)) {
- if (in_array($mode, ['community', 'contacts'])) {
+ if (in_array($mode, ['community', 'contacts', 'profile'])) {
$writable = true;
} else {
$writable = ($items[0]['uid'] == 0) && in_array($items[0]['network'], Protocol::FEDERATED);
@@ -415,7 +419,14 @@ function conversation(App $a, array $items, $mode, $update, $preview = false, $o
$tpl = 'search_item.tpl';
+ $uriids = [];
+
foreach ($items as $item) {
+ if (in_array($item['uri-id'], $uriids)) {
+ continue;
+ }
+
+ $uriids[] = $item['uri-id'];
if (!visible_activity($item)) {
continue;
@@ -479,7 +490,7 @@ function conversation(App $a, array $items, $mode, $update, $preview = false, $o
$body_html = Item::prepareBody($item, true, $preview);
- list($categories, $folders) = DI::contentItem()->determineCategoriesTerms($item);
+ list($categories, $folders) = DI::contentItem()->determineCategoriesTerms($item, local_user());
if (!empty($item['content-warning']) && DI::pConfig()->get(local_user(), 'system', 'disable_cw', false)) {
$title = ucfirst($item['content-warning']);
@@ -500,7 +511,7 @@ function conversation(App $a, array $items, $mode, $update, $preview = false, $o
'network_icon' => ContactSelector::networkToIcon($item['network'], $item['author-link']),
'linktitle' => DI::l10n()->t('View %s\'s profile @ %s', $profile_name, $item['author-link']),
'profile_url' => $profile_link,
- 'item_photo_menu_html' => item_photo_menu($item),
+ 'item_photo_menu_html' => item_photo_menu($item, $formSecurityToken),
'name' => $profile_name,
'sparkle' => $sparkle,
'lock' => false,
@@ -588,7 +599,7 @@ function conversation(App $a, array $items, $mode, $update, $preview = false, $o
}
}
- $threads = $conv->getTemplateData($conv_responses);
+ $threads = $conv->getTemplateData($conv_responses, $formSecurityToken);
if (!$threads) {
Logger::log('[ERROR] conversation : Failed to get template data.', Logger::DEBUG);
$threads = [];
@@ -612,95 +623,87 @@ function conversation(App $a, array $items, $mode, $update, $preview = false, $o
}
/**
- * Fetch all comments from a query. Additionally set the newest resharer as thread owner.
+ * Adds some information (Causer, post reason, direction) to the fetched post row.
*
- * @param mixed $thread_items Database statement with thread posts
- * @param boolean $pinned Is the item pinned?
- * @param array $activity Contact data of the resharer
+ * @param array $row Post row
+ * @param array $activity Contact data of the resharer
*
* @return array items with parents and comments
*/
-function conversation_fetch_comments($thread_items, bool $pinned, array $activity) {
+function conversation_add_row_information(array $row, array $activity) {
DI::profiler()->startRecording('rendering');
- $comments = [];
- while ($row = Post::fetch($thread_items)) {
- if (!empty($activity)) {
- if (($row['gravity'] == GRAVITY_PARENT)) {
- $row['post-reason'] = Item::PR_ANNOUNCEMENT;
- $row = array_merge($row, $activity);
- $contact = Contact::getById($activity['causer-id'], ['url', 'name', 'thumb']);
- $row['causer-link'] = $contact['url'];
- $row['causer-avatar'] = $contact['thumb'];
- $row['causer-name'] = $contact['name'];
- } elseif (($row['gravity'] == GRAVITY_ACTIVITY) && ($row['verb'] == Activity::ANNOUNCE) &&
- ($row['author-id'] == $activity['causer-id'])) {
- continue;
- }
- }
+ if ($row['uid'] == 0) {
+ $row['writable'] = in_array($row['network'], Protocol::FEDERATED);
+ }
- switch ($row['post-reason']) {
- case Item::PR_TO:
- $row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'to')];
- break;
- case Item::PR_CC:
- $row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'cc')];
- break;
- case Item::PR_BTO:
- $row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'bto')];
- break;
- case Item::PR_BCC:
- $row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'bcc')];
- break;
- case Item::PR_FOLLOWER:
- $row['direction'] = ['direction' => 6, 'title' => DI::l10n()->t('You are following %s.', $row['author-name'])];
- break;
- case Item::PR_TAG:
- $row['direction'] = ['direction' => 4, 'title' => DI::l10n()->t('Tagged')];
- break;
- case Item::PR_ANNOUNCEMENT:
- if (!empty($row['causer-id']) && DI::pConfig()->get(local_user(), 'system', 'display_resharer')) {
- $row['owner-id'] = $row['causer-id'];
- $row['owner-link'] = $row['causer-link'];
- $row['owner-avatar'] = $row['causer-avatar'];
- $row['owner-name'] = $row['causer-name'];
- }
+ if (!empty($activity)) {
+ if (($row['gravity'] == GRAVITY_PARENT)) {
+ $row['post-reason'] = Item::PR_ANNOUNCEMENT;
+ $row = array_merge($row, $activity);
+ $contact = Contact::getById($activity['causer-id'], ['url', 'name', 'thumb']);
+ $row['causer-link'] = $contact['url'];
+ $row['causer-avatar'] = $contact['thumb'];
+ $row['causer-name'] = $contact['name'];
+ } elseif (($row['gravity'] == GRAVITY_ACTIVITY) && ($row['verb'] == Activity::ANNOUNCE) &&
+ ($row['author-id'] == $activity['causer-id'])) {
+ return $row;
+ }
+ }
- if (($row['gravity'] == GRAVITY_PARENT) && !empty($row['causer-id'])) {
- $causer = ['uid' => 0, 'id' => $row['causer-id'],
- 'network' => $row['causer-network'], 'url' => $row['causer-link']];
- $row['reshared'] = DI::l10n()->t('%s reshared this.', '' . htmlentities($row['causer-name']) . '');
- }
- $row['direction'] = ['direction' => 3, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Reshared') : DI::l10n()->t('Reshared by %s <%s>', $row['causer-name'], $row['causer-link']))];
- break;
- case Item::PR_COMMENT:
- $row['direction'] = ['direction' => 5, 'title' => DI::l10n()->t('%s is participating in this thread.', $row['author-name'])];
- break;
- case Item::PR_STORED:
- $row['direction'] = ['direction' => 8, 'title' => DI::l10n()->t('Stored')];
- break;
- case Item::PR_GLOBAL:
- $row['direction'] = ['direction' => 9, 'title' => DI::l10n()->t('Global')];
- break;
- case Item::PR_RELAY:
- $row['direction'] = ['direction' => 10, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Relayed') : DI::l10n()->t('Relayed by %s <%s>', $row['causer-name'], $row['causer-link']))];
- break;
- case Item::PR_FETCHED:
- $row['direction'] = ['direction' => 2, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Fetched') : DI::l10n()->t('Fetched because of %s <%s>', $row['causer-name'], $row['causer-link']))];
- break;
+ switch ($row['post-reason']) {
+ case Item::PR_TO:
+ $row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'to')];
+ break;
+ case Item::PR_CC:
+ $row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'cc')];
+ break;
+ case Item::PR_BTO:
+ $row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'bto')];
+ break;
+ case Item::PR_BCC:
+ $row['direction'] = ['direction' => 7, 'title' => DI::l10n()->t('You had been addressed (%s).', 'bcc')];
+ break;
+ case Item::PR_FOLLOWER:
+ $row['direction'] = ['direction' => 6, 'title' => DI::l10n()->t('You are following %s.', $row['author-name'])];
+ break;
+ case Item::PR_TAG:
+ $row['direction'] = ['direction' => 4, 'title' => DI::l10n()->t('Tagged')];
+ break;
+ case Item::PR_ANNOUNCEMENT:
+ if (!empty($row['causer-id']) && DI::pConfig()->get(local_user(), 'system', 'display_resharer')) {
+ $row['owner-id'] = $row['causer-id'];
+ $row['owner-link'] = $row['causer-link'];
+ $row['owner-avatar'] = $row['causer-avatar'];
+ $row['owner-name'] = $row['causer-name'];
}
- if ($row['gravity'] == GRAVITY_PARENT) {
- $row['pinned'] = $pinned;
- }
-
- $comments[] = $row;
+ if (($row['gravity'] == GRAVITY_PARENT) && !empty($row['causer-id'])) {
+ $causer = ['uid' => 0, 'id' => $row['causer-id'],
+ 'network' => $row['causer-network'], 'url' => $row['causer-link']];
+ $row['reshared'] = DI::l10n()->t('%s reshared this.', '' . htmlentities($row['causer-name']) . '');
+ }
+ $row['direction'] = ['direction' => 3, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Reshared') : DI::l10n()->t('Reshared by %s <%s>', $row['causer-name'], $row['causer-link']))];
+ break;
+ case Item::PR_COMMENT:
+ $row['direction'] = ['direction' => 5, 'title' => DI::l10n()->t('%s is participating in this thread.', $row['author-name'])];
+ break;
+ case Item::PR_STORED:
+ $row['direction'] = ['direction' => 8, 'title' => DI::l10n()->t('Stored')];
+ break;
+ case Item::PR_GLOBAL:
+ $row['direction'] = ['direction' => 9, 'title' => DI::l10n()->t('Global')];
+ break;
+ case Item::PR_RELAY:
+ $row['direction'] = ['direction' => 10, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Relayed') : DI::l10n()->t('Relayed by %s <%s>', $row['causer-name'], $row['causer-link']))];
+ break;
+ case Item::PR_FETCHED:
+ $row['direction'] = ['direction' => 2, 'title' => (empty($row['causer-id']) ? DI::l10n()->t('Fetched') : DI::l10n()->t('Fetched because of %s <%s>', $row['causer-name'], $row['causer-link']))];
+ break;
}
- DBA::close($thread_items);
-
DI::profiler()->stopRecording();
- return $comments;
+ return $row;
}
/**
@@ -725,75 +728,70 @@ function conversation_add_children(array $parents, $block_authors, $order, $uid)
$max_comments = DI::config()->get('system', 'max_display_comments', 1000);
}
- $params = ['order' => ['gravity', 'uid', 'commented' => true]];
-
- if ($max_comments > 0) {
- $params['limit'] = $max_comments;
- }
+ $params = ['order' => ['uri-id' => true, 'uid' => true]];
- $items = [];
+ $activities = [];
+ $uriids = [];
+ $commentcounter = [];
+ $activitycounter = [];
foreach ($parents AS $parent) {
if (!empty($parent['thr-parent-id']) && !empty($parent['gravity']) && ($parent['gravity'] == GRAVITY_ACTIVITY)) {
- $condition = ["`parent-uri-id` = ? AND `uid` IN (0, ?) AND (`vid` != ? OR `vid` IS NULL)",
- $parent['thr-parent-id'], $uid, Verb::getID(Activity::FOLLOW)];
+ $uriid = $parent['thr-parent-id'];
if (!empty($parent['author-id'])) {
- $activity = ['causer-id' => $parent['author-id']];
+ $activities[$uriid] = ['causer-id' => $parent['author-id']];
foreach (['commented', 'received', 'created'] as $orderfields) {
if (!empty($parent[$orderfields])) {
- $activity[$orderfields] = $parent[$orderfields];
+ $activities[$uriid][$orderfields] = $parent[$orderfields];
}
}
}
} else {
- $condition = ["`parent-uri-id` = ? AND `uid` IN (0, ?) AND (`vid` != ? OR `vid` IS NULL)",
- $parent['uri-id'], $uid, Verb::getID(Activity::FOLLOW)];
- $activity = [];
+ $uriid = $parent['uri-id'];
}
- $items = conversation_fetch_items($parent, $items, $condition, $block_authors, $params, $activity);
- }
+ $uriids[] = $uriid;
- foreach ($items as $index => $item) {
- if ($item['uid'] == 0) {
- $items[$index]['writable'] = in_array($item['network'], Protocol::FEDERATED);
- }
+ $commentcounter[$uriid] = 0;
+ $activitycounter[$uriid] = 0;
}
- $items = conv_sort($items, $order);
-
- DI::profiler()->stopRecording();
- return $items;
-}
-
-/**
- * Fetch conversation items
- *
- * @param array $parent Parent Item array
- * @param array $items Item array
- * @param array $condition SQL condition
- * @param boolean $block_authors Don't show posts from contacts that are hidden (used on the community page)
- * @param array $params SQL parameters
- * @param array $activity Contact data of the resharer
- * @return array
- */
-function conversation_fetch_items(array $parent, array $items, array $condition, bool $block_authors, array $params, array $activity) {
- DI::profiler()->startRecording('rendering');
+ $condition = ['parent-uri-id' => $uriids];
if ($block_authors) {
- $condition[0] .= " AND NOT `author-hidden`";
+ $condition['author-hidden'] = false;
}
+ $condition = DBA::mergeConditions($condition,
+ ["`uid` IN (0, ?) AND (`vid` != ? OR `vid` IS NULL)", $uid, Verb::getID(Activity::FOLLOW)]);
+
$thread_items = Post::selectForUser(local_user(), array_merge(Item::DISPLAY_FIELDLIST, ['pinned', 'contact-uid', 'gravity', 'post-type', 'post-reason']), $condition, $params);
- $comments = conversation_fetch_comments($thread_items, $parent['pinned'] ?? false, $activity);
+ $items = [];
+
+ while ($row = Post::fetch($thread_items)) {
+ if (!empty($items[$row['uri-id']]) && ($row['uid'] == 0)) {
+ continue;
+ }
- if (count($comments) != 0) {
- $items = array_merge($items, $comments);
+ if ($max_comments > 0) {
+ if (($row['gravity'] == GRAVITY_COMMENT) && (++$commentcounter[$row['parent-uri-id']] > $max_comments)) {
+ continue;
+ }
+ if (($row['gravity'] == GRAVITY_ACTIVITY) && (++$activitycounter[$row['parent-uri-id']] > $max_comments)) {
+ continue;
+ }
+ }
+ $items[$row['uri-id']] = conversation_add_row_information($row, $activities[$row['uri-id']] ?? []);
}
+
+ DBA::close($thread_items);
+
+ $items = conv_sort($items, $order);
+
DI::profiler()->stopRecording();
return $items;
}
-function item_photo_menu($item)
+function item_photo_menu($item, string $formSecurityToken)
{
DI::profiler()->startRecording('rendering');
$sub_link = '';
@@ -836,8 +834,8 @@ function item_photo_menu($item)
if (!empty($pcid)) {
$contact_url = 'contact/' . $pcid;
$posts_link = $contact_url . '/posts';
- $block_link = $item['self'] ? '' : $contact_url . '/block';
- $ignore_link = $item['self'] ? '' : $contact_url . '/ignore';
+ $block_link = $item['self'] ? '' : $contact_url . '/block?t=' . $formSecurityToken;
+ $ignore_link = $item['self'] ? '' : $contact_url . '/ignore?t=' . $formSecurityToken;
}
if ($cid && !$item['self']) {
@@ -1077,11 +1075,27 @@ function format_activity(array $links, $verb, $id) {
return $o;
}
-function status_editor(App $a, $x, $notes_cid = 0, $popup = false)
+function status_editor(App $a, array $x = [], $notes_cid = 0, $popup = false)
{
+ $user = User::getById($a->getLoggedInUserId(), ['uid', 'nickname', 'allow_location', 'default-location']);
+ if (empty($user['uid'])) {
+ return '';
+ }
+
DI::profiler()->startRecording('rendering');
$o = '';
+ $x['allow_location'] = $x['allow_location'] ?? $user['allow_location'];
+ $x['default_location'] = $x['default_location'] ?? $user['default-location'];
+ $x['nickname'] = $x['nickname'] ?? $user['nickname'];
+ $x['lockstate'] = $x['lockstate'] ?? ACL::getLockstateForUserId($user['uid']) ? 'lock' : 'unlock';
+ $x['acl'] = $x['acl'] ?? ACL::getFullSelectorHTML(DI::page(), $user['uid'], true);
+ $x['bang'] = $x['bang'] ?? '';
+ $x['visitor'] = $x['visitor'] ?? 'block';
+ $x['is_owner'] = $x['is_owner'] ?? true;
+ $x['profile_uid'] = $x['profile_uid'] ?? local_user();
+
+
$geotag = !empty($x['allow_location']) ? Renderer::replaceMacros(Renderer::getMarkupTemplate('jot_geotag.tpl'), []) : '';
$tpl = Renderer::getMarkupTemplate('jot-header.tpl');
@@ -1131,6 +1145,13 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false)
'$placeholdertitle' => DI::l10n()->t('Set title'),
'$category' => $x['category'] ?? '',
'$placeholdercategory' => Feature::isEnabled(local_user(), 'categories') ? DI::l10n()->t("Categories \x28comma-separated list\x29") : '',
+ '$scheduled_at' => Temporal::getDateTimeField(
+ new DateTime(),
+ new DateTime('now + 6 months'),
+ null,
+ DI::l10n()->t('Scheduled at'),
+ 'scheduled_at'
+ ),
'$wait' => DI::l10n()->t('Please wait'),
'$permset' => DI::l10n()->t('Permission settings'),
'$shortpermset' => DI::l10n()->t('Permissions'),