X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FObject%2FPost.php;h=17c0c1f68e640b7ec608a969e8741cd800b66e9c;hb=2f3a7c422f1382f455d4a9a4d7ded0feda4a9261;hp=bbce29672712ec7c7d298919541127e360ca462b;hpb=c54bfd423a8f79575269ec72214b0357edc655f4;p=friendica.git diff --git a/src/Object/Post.php b/src/Object/Post.php index bbce296727..17c0c1f68e 100644 --- a/src/Object/Post.php +++ b/src/Object/Post.php @@ -1,6 +1,6 @@ setTemplate('wall'); $this->toplevel = $this->getId() == $this->getDataValue('parent'); - if (!empty(Session::getUserIDForVisitorContactID($this->getDataValue('contact-id')))) { + if (!empty(DI::userSession()->getUserIDForVisitorContactID($this->getDataValue('contact-id')))) { $this->visiting = true; } @@ -104,14 +103,14 @@ class Post if (!empty($data['children'])) { foreach ($data['children'] as $item) { // Only add will be displayed - if ($item['network'] === Protocol::MAIL && local_user() != $item['uid']) { + if ($item['network'] === Protocol::MAIL && DI::userSession()->getLocalUserId() != $item['uid']) { continue; } elseif (!DI::contentItem()->isVisibleActivity($item)) { continue; } // You can always comment on Diaspora and OStatus items - if (in_array($item['network'], [Protocol::OSTATUS, Protocol::DIASPORA]) && (local_user() == $item['uid'])) { + if (in_array($item['network'], [Protocol::OSTATUS, Protocol::DIASPORA]) && (DI::userSession()->getLocalUserId() == $item['uid'])) { $item['writable'] = true; } @@ -192,7 +191,7 @@ class Post $pinned = ''; $pin = false; $star = false; - $ignore = false; + $ignore_thread = false; $ispinned = 'unpinned'; $isstarred = 'unstarred'; $indent = ''; @@ -206,7 +205,7 @@ class Post $lock = ($item['private'] == Item::PRIVATE) ? $privacy : false; $connector = !in_array($item['network'], Protocol::NATIVE_SUPPORT) ? DI::l10n()->t('Connector Message') : false; - $shareable = in_array($conv->getProfileOwner(), [0, local_user()]) && $item['private'] != Item::PRIVATE; + $shareable = in_array($conv->getProfileOwner(), [0, DI::userSession()->getLocalUserId()]) && $item['private'] != Item::PRIVATE; $announceable = $shareable && in_array($item['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::TWITTER]); // On Diaspora only toplevel posts can be reshared @@ -216,15 +215,15 @@ class Post $edpost = false; - if (local_user()) { + if (DI::userSession()->getLocalUserId()) { if (Strings::compareLink(DI::session()->get('my_url'), $item['author-link'])) { if ($item['event-id'] != 0) { - $edpost = ['events/event/' . $item['event-id'], DI::l10n()->t('Edit')]; + $edpost = ['calendar/event/edit/' . $item['event-id'], DI::l10n()->t('Edit')]; } else { - $edpost = ['editpost/' . $item['id'], DI::l10n()->t('Edit')]; + $edpost = [sprintf('post/%s/edit', $item['id']), DI::l10n()->t('Edit')]; } } - $dropping = in_array($item['uid'], [0, local_user()]); + $dropping = in_array($item['uid'], [0, DI::userSession()->getLocalUserId()]); } // Editing on items of not subscribed users isn't currently possible @@ -234,7 +233,7 @@ class Post $edpost = false; } - if (($this->getDataValue('uid') == local_user()) || $this->isVisiting()) { + if (($this->getDataValue('uid') == DI::userSession()->getLocalUserId()) || $this->isVisiting()) { $dropping = true; } @@ -247,9 +246,10 @@ class Post // Showing the one or the other text, depending upon if we can only hide it or really delete it. $delete = $origin ? DI::l10n()->t('Delete globally') : DI::l10n()->t('Remove locally'); - $drop = false; - $block = false; - if (local_user()) { + $drop = false; + $block = false; + $ignore = false; + if (DI::userSession()->getLocalUserId()) { $drop = [ 'dropping' => $dropping, 'pagedrop' => $item['pagedrop'], @@ -258,22 +258,27 @@ class Post ]; } - if (!$item['self'] && local_user()) { + if (!$item['self'] && DI::userSession()->getLocalUserId()) { $block = [ - 'blocking' => true, - 'block' => DI::l10n()->t('Block %s', $item['author-name']), - 'author_id' => $item['author-id'], + 'blocking' => true, + 'block' => DI::l10n()->t('Block %s', $item['author-name']), + 'author_id' => $item['author-id'], + ]; + $ignore = [ + 'ignoring' => true, + 'ignore' => DI::l10n()->t('Ignore %s', $item['author-name']), + 'author_id' => $item['author-id'], ]; } - $filer = local_user() ? DI::l10n()->t('Save to folder') : false; + $filer = DI::userSession()->getLocalUserId() ? DI::l10n()->t('Save to folder') : false; $profile_name = $item['author-name']; if (!empty($item['author-link']) && empty($item['author-name'])) { $profile_name = $item['author-link']; } - if (Session::isAuthenticated()) { + if (DI::userSession()->isAuthenticated()) { $author = ['uid' => 0, 'id' => $item['author-id'], 'network' => $item['author-network'], 'url' => $item['author-link']]; $profile_link = Contact::magicLinkByContact($author); @@ -281,7 +286,7 @@ class Post $profile_link = $item['author-link']; } - if (strpos($profile_link, 'redir/') === 0) { + if (strpos($profile_link, 'contact/redir/') === 0) { $sparkle = ' sparkle'; } @@ -327,15 +332,15 @@ class Post $tagger = ''; if ($this->isToplevel()) { - if (local_user()) { - $ignored = PostModel\ThreadUser::getIgnored($item['uri-id'], local_user()); - if ($item['mention'] || $ignored) { - $ignore = [ + if (DI::userSession()->getLocalUserId()) { + $ignored_thread = PostModel\ThreadUser::getIgnored($item['uri-id'], DI::userSession()->getLocalUserId()); + if ($item['mention'] || $ignored_thread) { + $ignore_thread = [ 'do' => DI::l10n()->t('Ignore thread'), 'undo' => DI::l10n()->t('Unignore thread'), 'toggle' => DI::l10n()->t('Toggle ignore status'), - 'classdo' => $ignored ? 'hidden' : '', - 'classundo' => $ignored ? '' : 'hidden', + 'classdo' => $ignored_thread ? 'hidden' : '', + 'classundo' => $ignored_thread ? '' : 'hidden', 'ignored' => DI::l10n()->t('Ignored'), ]; } @@ -351,7 +356,7 @@ class Post 'starred' => DI::l10n()->t('Starred'), ]; - if ($conv->getProfileOwner() == local_user() && ($item['uid'] != 0)) { + if ($conv->getProfileOwner() == DI::userSession()->getLocalUserId() && ($item['uid'] != 0)) { if ($origin && in_array($item['private'], [Item::PUBLIC, Item::UNLISTED])) { $ispinned = ($item['featured'] ? 'pinned' : 'unpinned'); @@ -397,17 +402,17 @@ class Post $body_html = Item::prepareBody($item, true); - list($categories, $folders) = DI::contentItem()->determineCategoriesTerms($item, local_user()); + list($categories, $folders) = DI::contentItem()->determineCategoriesTerms($item, DI::userSession()->getLocalUserId()); if (!empty($item['title'])) { $title = $item['title']; - } elseif (!empty($item['content-warning']) && DI::pConfig()->get(local_user(), 'system', 'disable_cw', false)) { + } elseif (!empty($item['content-warning']) && DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'disable_cw', false)) { $title = ucfirst($item['content-warning']); } else { $title = ''; } - if (DI::pConfig()->get(local_user(), 'system', 'hide_dislike')) { + if (DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'hide_dislike')) { $buttons['dislike'] = false; } @@ -434,7 +439,7 @@ class Post } // Fetching of Diaspora posts doesn't always work. There are issues with reshares and possibly comments - if (!local_user() && ($item['network'] != Protocol::DIASPORA) && !empty(DI::session()->get('remote_comment'))) { + if (!DI::userSession()->getLocalUserId() && ($item['network'] != Protocol::DIASPORA) && !empty(DI::session()->get('remote_comment'))) { $remote_comment = [DI::l10n()->t('Comment this item on your system'), DI::l10n()->t('Remote comment'), str_replace('{uri}', urlencode($item['uri']), DI::session()->get('remote_comment'))]; @@ -519,15 +524,17 @@ class Post 'pinned' => $pinned, 'isstarred' => $isstarred, 'star' => $star, - 'ignore' => $ignore, + 'ignore' => $ignore_thread, 'tagger' => $tagger, 'filer' => $filer, 'language' => $languages, 'drop' => $drop, 'block' => $block, + 'ignore_author' => $ignore, 'vote' => $buttons, 'like_html' => $responses['like']['output'], 'dislike_html' => $responses['dislike']['output'], + 'emojis' => $this->getEmojis($item), 'responses' => $responses, 'switchcomment' => DI::l10n()->t('Comment'), 'reply_label' => DI::l10n()->t('Reply to %s', $profile_name), @@ -586,20 +593,78 @@ class Post } } + // Copy values/set defaults $result['total_comments_num'] = $this->isToplevel() ? $total_children : 0; + $result['private'] = $item['private']; + $result['toplevel'] = ($this->isToplevel() ? 'toplevel_item' : ''); + $result['flatten'] = !$this->isThreaded(); + $result['threaded'] = $this->isThreaded(); - $result['private'] = $item['private']; - $result['toplevel'] = ($this->isToplevel() ? 'toplevel_item' : ''); + return $result; + } - if ($this->isThreaded()) { - $result['flatten'] = false; - $result['threaded'] = true; - } else { - $result['flatten'] = true; - $result['threaded'] = false; + /** + * Fetch emojis + * + * @param array $item + * @return array + */ + private function getEmojis(array $item): array + { + if (empty($item['emojis'])) { + return []; } - return $result; + $emojis = []; + foreach ($item['emojis'] as $index => $element) { + $actors = implode(', ', $element['title']); + switch ($element['verb']) { + case Activity::ANNOUNCE: + $title = DI::l10n()->t('Reshared by: %s', $actors); + $icon = ['fa' => 'fa-retweet', 'icon' => 'icon-retweet']; + break; + + case Activity::VIEW: + $title = DI::l10n()->t('Viewed by: %s', $actors); + $icon = ['fa' => 'fa-eye', 'icon' => 'icon-eye-open']; + break; + + case Activity::LIKE: + $title = DI::l10n()->t('Liked by: %s', $actors); + $icon = ['fa' => 'fa-thumbs-up', 'icon' => 'icon-thumbs-up']; + break; + + case Activity::DISLIKE: + $title = DI::l10n()->t('Disliked by: %s', $actors); + $icon = ['fa' => 'fa-thumbs-down', 'icon' => 'icon-thumbs-down']; + break; + + case Activity::ATTEND: + $title = DI::l10n()->t('Attended by: %s', $actors); + $icon = ['fa' => 'fa-check', 'icon' => 'icon-ok']; + break; + + case Activity::ATTENDMAYBE: + $title = DI::l10n()->t('Maybe attended by: %s', $actors); + $icon = ['fa' => 'fa-question', 'icon' => 'icon-question']; + break; + + case Activity::ATTENDNO: + $title = DI::l10n()->t('Not attended by: %s', $actors); + $icon = ['fa' => 'fa-times', 'icon' => 'icon-remove']; + break; + + default: + $title = DI::l10n()->t('Reacted with %s by: %s', $element['emoji'], $actors); + $icon = []; + break; + break; + } + $emojis[$index] = ['emoji' => $element['emoji'], 'total' => $element['total'], 'title' => $title, 'icon' => $icon]; + } + ksort($emojis); + + return $emojis; } /** @@ -619,33 +684,32 @@ class Post } /** - * Add a child item + * Add a child post * - * @param Post $item The child item to add + * @param Post $item The child post to add * - * @return mixed + * @return Post|bool Last Post object or bool on any error * @throws \Exception */ public function addChild(Post $item) { - $item_id = $item->getId(); - if (!$item_id) { - Logger::info('[ERROR] Post::addChild : Item has no ID!!'); + if (!$item->getId()) { + Logger::error('Post object has no id', ['post' => $item]); return false; } elseif ($this->getChild($item->getId())) { - Logger::info('[WARN] Post::addChild : Item already exists (' . $item->getId() . ').'); + Logger::warning('Post object already exists', ['post' => $item]); return false; } - $activity = DI::activity(); - /* * Only add what will be displayed */ - if ($item->getDataValue('network') === Protocol::MAIL && local_user() != $item->getDataValue('uid')) { + if ($item->getDataValue('network') === Protocol::MAIL && DI::userSession()->getLocalUserId() != $item->getDataValue('uid')) { + Logger::warning('Post object does not belong to local user', ['post' => $item, 'local_user' => DI::userSession()->getLocalUserId()]); return false; - } elseif ($activity->match($item->getDataValue('verb'), Activity::LIKE) || - $activity->match($item->getDataValue('verb'), Activity::DISLIKE)) { + } elseif (DI::activity()->match($item->getDataValue('verb'), Activity::LIKE) || + DI::activity()->match($item->getDataValue('verb'), Activity::DISLIKE)) { + Logger::warning('Post objects is a like/dislike', ['post' => $item]); return false; } @@ -659,7 +723,7 @@ class Post * Get a child by its ID * * @param integer $id The child id - * @return mixed + * @return Thread|null Thread or NULL if not found */ public function getChild(int $id) { @@ -748,6 +812,7 @@ class Post * Set conversation thread * * @param Thread|null $thread + * * @return void */ public function setThread(Thread $thread = null) @@ -786,6 +851,7 @@ class Post * Get a data value * * @param string $name key + * * @return mixed value on success, false on failure */ public function getDataValue(string $name) @@ -799,13 +865,14 @@ class Post } /** - * Set template + * Set template by name * * @param string $name Template name - * @return bool If template was set + * + * @return void * @throws InvalidArgumentException */ - private function setTemplate(string $name): bool + private function setTemplate(string $name) { if (empty($this->available_templates[$name])) { // Throw exception @@ -813,8 +880,6 @@ class Post } $this->template = $this->available_templates[$name]; - - return true; } /** @@ -850,7 +915,7 @@ class Post // This will allow us to comment on wall-to-wall items owned by our friends // and community forums even if somebody else wrote the post. // bug #517 - this fixes for conversation owner - if ($conv->getMode() == 'profile' && $conv->getProfileOwner() == local_user()) { + if ($conv->getMode() == 'profile' && $conv->getProfileOwner() == DI::userSession()->getLocalUserId()) { return true; } @@ -898,20 +963,20 @@ class Post { $a = DI::app(); - if (!local_user()) { + if (!DI::userSession()->getLocalUserId()) { return ''; } $owner = User::getOwnerDataById($a->getLoggedInUserId()); $item = $this->getData(); - if (!empty($item['content-warning']) && Feature::isEnabled(local_user(), 'add_abstract')) { + if (!empty($item['content-warning']) && Feature::isEnabled(DI::userSession()->getLocalUserId(), 'add_abstract')) { $text = '[abstract=' . Protocol::ACTIVITYPUB . ']' . $item['content-warning'] . "[/abstract]\n"; } else { $text = ''; } - if (!Feature::isEnabled(local_user(), 'explicit_mentions')) { + if (!Feature::isEnabled(DI::userSession()->getLocalUserId(), 'explicit_mentions')) { return $text; } @@ -940,6 +1005,7 @@ class Post * Get the comment box * * @param string $indent Indent value + * * @return mixed The comment box string (empty if no comment box), false on failure * @throws \Exception * @todo return false is nowhere in this method? @@ -958,7 +1024,7 @@ class Post */ $qcomment = null; if (Addon::isEnabled('qcomment')) { - $words = DI::pConfig()->get(local_user(), 'qcomment', 'words'); + $words = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'qcomment', 'words'); $qcomment = $words ? explode("\n", $words) : []; } @@ -1050,10 +1116,10 @@ class Post $this->wall_to_wall = true; $owner = [ - 'uid' => 0, - 'id' => $this->getDataValue('owner-id'), + 'uid' => 0, + 'id' => $this->getDataValue('owner-id'), 'network' => $this->getDataValue('owner-network'), - 'url' => $this->getDataValue('owner-link'), + 'url' => $this->getDataValue('owner-link'), ]; $this->owner_url = Contact::magicLinkByContact($owner); }