]> git.mxchange.org Git - friendica.git/blobdiff - src/Module/Contact.php
Fix warning
[friendica.git] / src / Module / Contact.php
index 8969b1610eaf9a5166f89c7ff121780c38c98864..a70db02345c681c77e46055e67c8ef870f96821d 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2023, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -25,11 +25,11 @@ use Friendica\BaseModule;
 use Friendica\Content\ContactSelector;
 use Friendica\Content\Nav;
 use Friendica\Content\Pager;
-use Friendica\Content\Text\BBCode;
 use Friendica\Content\Widget;
-use Friendica\Core\Hook;
+use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
 use Friendica\Core\Renderer;
+use Friendica\Core\System;
 use Friendica\Core\Theme;
 use Friendica\Core\Worker;
 use Friendica\Database\DBA;
@@ -37,10 +37,9 @@ use Friendica\DI;
 use Friendica\Model;
 use Friendica\Model\User;
 use Friendica\Module\Security\Login;
-use Friendica\Network\HTTPException\BadRequestException;
+use Friendica\Network\HTTPException\InternalServerErrorException;
 use Friendica\Network\HTTPException\NotFoundException;
-use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Strings;
+use Friendica\Worker\UpdateContact;
 
 /**
  *  Manages and show Contacts and their content
@@ -64,12 +63,12 @@ class Contact extends BaseModule
 
                self::checkFormSecurityTokenRedirectOnError($redirectUrl, 'contact_batch_actions');
 
-               $orig_records = Model\Contact::selectToArray(['id', 'uid'], ['id' => $_POST['contact_batch'], 'uid' => [0, local_user()], 'self' => false, 'deleted' => false]);
+               $orig_records = Model\Contact::selectToArray(['id', 'uid'], ['id' => $_POST['contact_batch'], 'uid' => [0, DI::userSession()->getLocalUserId()], 'self' => false, 'deleted' => false]);
 
                $count_actions = 0;
                foreach ($orig_records as $orig_record) {
-                       $cdata = Model\Contact::getPublicAndUserContactID($orig_record['id'], local_user());
-                       if (empty($cdata) || public_contact() === $cdata['public']) {
+                       $cdata = Model\Contact::getPublicAndUserContactID($orig_record['id'], DI::userSession()->getLocalUserId());
+                       if (empty($cdata) || DI::userSession()->getPublicContactId() === $cdata['public']) {
                                // No action available on your own contact
                                continue;
                        }
@@ -80,7 +79,7 @@ class Contact extends BaseModule
                        }
 
                        if (!empty($_POST['contacts_batch_block'])) {
-                               self::toggleBlockContact($cdata['public'], local_user());
+                               self::toggleBlockContact($cdata['public'], DI::userSession()->getLocalUserId());
                                $count_actions++;
                        }
 
@@ -88,17 +87,22 @@ class Contact extends BaseModule
                                self::toggleIgnoreContact($cdata['public']);
                                $count_actions++;
                        }
+
+                       if (!empty($_POST['contacts_batch_collapse'])) {
+                               self::toggleCollapseContact($cdata['public']);
+                               $count_actions++;
+                       }
                }
                if ($count_actions > 0) {
-                       info(DI::l10n()->tt('%d contact edited.', '%d contacts edited.', $count_actions));
+                       DI::sysmsg()->addInfo(DI::l10n()->tt('%d contact edited.', '%d contacts edited.', $count_actions));
                }
 
                DI::baseUrl()->redirect($redirectUrl);
        }
 
-       public function post()
+       protected function post(array $request = [])
        {
-               if (!local_user()) {
+               if (!DI::userSession()->getLocalUserId()) {
                        return;
                }
 
@@ -116,9 +120,9 @@ class Contact extends BaseModule
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       private static function updateContactFromPoll(int $contact_id)
+       public static function updateContactFromPoll(int $contact_id)
        {
-               $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]);
+               $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => DI::userSession()->getLocalUserId(), 'deleted' => false]);
                if (!DBA::isResult($contact)) {
                        return;
                }
@@ -131,26 +135,14 @@ class Contact extends BaseModule
                        }
 
                        // pull feed and consume it, which should subscribe to the hub.
-                       Worker::add(PRIORITY_HIGH, 'OnePoll', $contact_id, 'force');
+                       Worker::add(Worker::PRIORITY_HIGH, 'OnePoll', $contact_id, 'force');
                } else {
-                       Worker::add(PRIORITY_HIGH, 'UpdateContact', $contact_id);
-               }
-       }
-
-       /**
-        * @param int $contact_id Id of the contact with uid != 0
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        * @throws \ImagickException
-        */
-       private static function updateContactFromProbe(int $contact_id)
-       {
-               $contact = DBA::selectFirst('contact', ['url'], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]);
-               if (!DBA::isResult($contact)) {
-                       return;
+                       try {
+                               UpdateContact::add(Worker::PRIORITY_HIGH, $contact_id);
+                       } catch (\InvalidArgumentException $e) {
+                               Logger::notice($e->getMessage(), ['contact' => $contact, 'callstack' => System::callstack()]);
+                       }
                }
-
-               // Update the entry in the contact table
-               Model\Contact::updateFromProbe($contact_id);
        }
 
        /**
@@ -174,13 +166,25 @@ class Contact extends BaseModule
         */
        private static function toggleIgnoreContact(int $contact_id)
        {
-               $ignored = !Model\Contact\User::isIgnored($contact_id, local_user());
-               Model\Contact\User::setIgnored($contact_id, local_user(), $ignored);
+               $ignored = !Model\Contact\User::isIgnored($contact_id, DI::userSession()->getLocalUserId());
+               Model\Contact\User::setIgnored($contact_id, DI::userSession()->getLocalUserId(), $ignored);
+       }
+
+       /**
+        * Toggles the collapsed status of a contact identified by id.
+        *
+        * @param int $contact_id Id of the contact with uid = 0
+        * @throws \Exception
+        */
+       private static function toggleCollapseContact(int $contact_id)
+       {
+               $collapsed = !Model\Contact\User::isCollapsed($contact_id, DI::userSession()->getLocalUserId());
+               Model\Contact\User::setCollapsed($contact_id, DI::userSession()->getLocalUserId(), $collapsed);
        }
 
-       public function content($update = 0): string
+       protected function content(array $request = []): string
        {
-               if (!local_user()) {
+               if (!DI::userSession()->getLocalUserId()) {
                        return Login::form($_SERVER['REQUEST_URI']);
                }
 
@@ -199,139 +203,38 @@ class Contact extends BaseModule
                $page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput.css'));
                $page->registerStylesheet(Theme::getPathForFile('js/friendica-tagsinput/friendica-tagsinput-typeahead.css'));
 
-               $contact = null;
-               // @TODO: Replace with parameter from router
-               if (DI::args()->getArgc() == 2 && intval(DI::args()->getArgv()[1])) {
-                       $contact_id = intval(DI::args()->getArgv()[1]);
-
-                       // Ensure to use the user contact when the public contact was provided
-                       $data = Model\Contact::getPublicAndUserContactID($contact_id, local_user());
-                       if (!empty($data['user']) && ($contact_id == $data['public'])) {
-                               $contact_id = $data['user'];
-                       }
-
-                       if (!empty($data)) {
-                               $contact = DBA::selectFirst('contact', [], [
-                                       'id'      => $contact_id,
-                                       'uid'     => [0, local_user()],
-                                       'deleted' => false
-                               ]);
-
-                               // Don't display contacts that are about to be deleted
-                               if (DBA::isResult($contact) && !empty($contact['network']) && $contact['network'] == Protocol::PHANTOM) {
-                                       $contact = false;
-                               }
-                       }
-               }
-
-               if (DBA::isResult($contact)) {
-                       if ($contact['self']) {
-                               DI::baseUrl()->redirect('profile/' . $contact['nick'] . '/profile');
-                       }
-
-                       $vcard_widget = Widget\VCard::getHTML($contact);
-
-                       $findpeople_widget = '';
-                       $follow_widget = '';
-                       $account_widget = '';
-                       $networks_widget = '';
-                       $rel_widget = '';
-
-                       if ($contact['uid'] != 0) {
-                               $groups_widget = Model\Group::sidebarWidget('contact', 'group', 'full', 'everyone', $contact_id);
-                       } else {
-                               $groups_widget = '';
-                       }
+               $vcard_widget = '';
+               $findpeople_widget = Widget::findPeople();
+               if (isset($_GET['add'])) {
+                       $follow_widget = Widget::follow($_GET['add']);
                } else {
-                       $vcard_widget = '';
-                       $findpeople_widget = Widget::findPeople();
-                       if (isset($_GET['add'])) {
-                               $follow_widget = Widget::follow($_GET['add']);
-                       } else {
-                               $follow_widget = Widget::follow();
-                       }
-
-                       $account_widget = Widget::accounttypes($_SERVER['REQUEST_URI'], $accounttype);
-                       $networks_widget = Widget::networks($_SERVER['REQUEST_URI'], $nets);
-                       $rel_widget = Widget::contactRels($_SERVER['REQUEST_URI'], $rel);
-                       $groups_widget = Widget::groups($_SERVER['REQUEST_URI'], $group);
+                       $follow_widget = Widget::follow();
                }
 
-               DI::page()['aside'] .= $vcard_widget . $findpeople_widget . $follow_widget . $account_widget . $groups_widget . $networks_widget . $rel_widget;
+               $account_widget = Widget::accountTypes($_SERVER['REQUEST_URI'], $accounttype);
+               $networks_widget = Widget::networks($_SERVER['REQUEST_URI'], $nets);
+               $rel_widget = Widget::contactRels($_SERVER['REQUEST_URI'], $rel);
+               $groups_widget = Widget::groups($_SERVER['REQUEST_URI'], $group);
+
+               DI::page()['aside'] .= $vcard_widget . $findpeople_widget . $follow_widget . $rel_widget . $groups_widget . $networks_widget . $account_widget;
 
                $tpl = Renderer::getMarkupTemplate('contacts-head.tpl');
                DI::page()['htmlhead'] .= Renderer::replaceMacros($tpl, [
-                       '$baseurl' => DI::baseUrl()->get(true),
                ]);
 
                $o = '';
                Nav::setSelected('contact');
 
-               if (DI::args()->getArgc() == 3) {
-                       $contact_id = intval(DI::args()->getArgv()[1]);
-                       if (!$contact_id) {
-                               throw new BadRequestException();
-                       }
-
-                       // @TODO: Replace with parameter from router
-                       $cmd = DI::args()->getArgv()[2];
-
-                       $orig_record = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => [0, local_user()], 'self' => false, 'deleted' => false]);
-                       if (!DBA::isResult($orig_record)) {
-                               throw new NotFoundException(DI::l10n()->t('Contact not found'));
-                       }
-
-                       self::checkFormSecurityTokenRedirectOnError('contact/' . $contact_id, 'contact_action', 't');
-
-                       $cdata = Model\Contact::getPublicAndUserContactID($orig_record['id'], local_user());
-                       if (empty($cdata)) {
-                               throw new NotFoundException(DI::l10n()->t('Contact not found'));
-                       }
-
-                       if ($cmd === 'update' && $cdata['user']) {
-                               self::updateContactFromPoll($cdata['user']);
-                       }
-
-                       if ($cmd === 'updateprofile' && $cdata['user']) {
-                               self::updateContactFromProbe($cdata['user']);
-                       }
-
-                       if ($cmd === 'block') {
-                               if (public_contact() === $cdata['public']) {
-                                       throw new BadRequestException(DI::l10n()->t('You can\'t block yourself'));
-                               }
-
-                               self::toggleBlockContact($cdata['public'], local_user());
-
-                               $blocked = Model\Contact\User::isBlocked($contact_id, local_user());
-                               info(($blocked ? DI::l10n()->t('Contact has been blocked') : DI::l10n()->t('Contact has been unblocked')));
-                       }
-
-                       if ($cmd === 'ignore') {
-                               if (public_contact() === $cdata['public']) {
-                                       throw new BadRequestException(DI::l10n()->t('You can\'t ignore yourself'));
-                               }
-
-                               self::toggleIgnoreContact($cdata['public']);
-
-                               $ignored = Model\Contact\User::isIgnored($cdata['public'], local_user());
-                               info(($ignored ? DI::l10n()->t('Contact has been ignored') : DI::l10n()->t('Contact has been unignored')));
-                       }
-
-                       DI::baseUrl()->redirect('contact/' . $contact_id);
-                       // NOTREACHED
-               }
-
                $_SESSION['return_path'] = DI::args()->getQueryString();
 
-               $sql_values = [local_user()];
+               $sql_values = [DI::userSession()->getLocalUserId()];
 
                // @TODO: Replace with parameter from router
                $type = DI::args()->getArgv()[1] ?? '';
 
                switch ($type) {
                        case 'blocked':
-                               $sql_extra = " AND EXISTS(SELECT `id` from `user-contact` WHERE `contact`.`id` = `user-contact`.`cid` and `user-contact`.`uid` = ? and `user-contact`.`blocked`)";
+                               $sql_extra = " AND `id` IN (SELECT `cid` FROM `user-contact` WHERE `user-contact`.`uid` = ? AND `user-contact`.`blocked`)";
                                // This makes the query look for contact.uid = 0
                                array_unshift($sql_values, 0);
                                break;
@@ -339,7 +242,12 @@ class Contact extends BaseModule
                                $sql_extra = " AND `hidden` AND NOT `blocked` AND NOT `pending`";
                                break;
                        case 'ignored':
-                               $sql_extra = " AND EXISTS(SELECT `id` from `user-contact` WHERE `contact`.`id` = `user-contact`.`cid` and `user-contact`.`uid` = ? and `user-contact`.`ignored`)";
+                               $sql_extra = " AND `id` IN (SELECT `cid` FROM `user-contact` WHERE `user-contact`.`uid` = ? AND `user-contact`.`ignored`)";
+                               // This makes the query look for contact.uid = 0
+                               array_unshift($sql_values, 0);
+                               break;
+                       case 'collapsed':
+                               $sql_extra = " AND `id` IN (SELECT `cid` FROM `user-contact` WHERE `user-contact`.`uid` = ? AND `user-contact`.`collapsed`)";
                                // This makes the query look for contact.uid = 0
                                array_unshift($sql_values, 0);
                                break;
@@ -348,8 +256,9 @@ class Contact extends BaseModule
                                break;
                        case 'pending':
                                $sql_extra = " AND `pending` AND NOT `archive` AND NOT `failed` AND ((`rel` = ?)
-                                       OR EXISTS (SELECT `id` FROM `intro` WHERE `contact-id` = `contact`.`id` AND NOT `ignore`))";
+                                       OR `id` IN (SELECT `contact-id` FROM `intro` WHERE `intro`.`uid` = ? AND NOT `ignore`))";
                                $sql_values[] = Model\Contact::SHARING;
+                               $sql_values[] = DI::userSession()->getLocalUserId();
                                break;
                        default:
                                $sql_extra = " AND NOT `archive` AND NOT `blocked` AND NOT `pending`";
@@ -366,8 +275,10 @@ class Contact extends BaseModule
                if ($search) {
                        $searching = true;
                        $search_hdr = $search;
-                       $search_txt = preg_quote($search);
-                       $sql_extra .= " AND (name REGEXP ? OR url REGEXP ? OR nick REGEXP ?)";
+                       $search_txt = preg_quote(trim($search, ' @!'));
+                       $sql_extra .= " AND (`name` REGEXP ? OR `url` REGEXP ? OR `nick` REGEXP ? OR `addr` REGEXP ? OR `alias` REGEXP ?)";
+                       $sql_values[] = $search_txt;
+                       $sql_values[] = $search_txt;
                        $sql_values[] = $search_txt;
                        $sql_values[] = $search_txt;
                        $sql_values[] = $search_txt;
@@ -396,7 +307,7 @@ class Contact extends BaseModule
                }
 
                if ($group) {
-                       $sql_extra .= " AND EXISTS(SELECT `id` FROM `group_member` WHERE `gid` = ? AND `contact`.`id` = `contact-id`)";
+                       $sql_extra .= " AND `id` IN (SELECT `contact-id` FROM `group_member` WHERE `gid` = ?)";
                        $sql_values[] = $group;
                }
 
@@ -416,8 +327,8 @@ class Contact extends BaseModule
                $stmt = DBA::select('contact', [], $condition, ['order' => ['name'], 'limit' => [$pager->getStart(), $pager->getItemsPerPage()]]);
 
                while ($contact = DBA::fetch($stmt)) {
-                       $contact['blocked'] = Model\Contact\User::isBlocked($contact['id'], local_user());
-                       $contact['readonly'] = Model\Contact\User::isIgnored($contact['id'], local_user());
+                       $contact['blocked'] = Model\Contact\User::isBlocked($contact['id'], DI::userSession()->getLocalUserId());
+                       $contact['readonly'] = Model\Contact\User::isIgnored($contact['id'], DI::userSession()->getLocalUserId());
                        $contacts[] = self::getContactTemplateVars($contact);
                }
                DBA::close($stmt);
@@ -455,6 +366,14 @@ class Contact extends BaseModule
                                'id'    => 'showignored-tab',
                                'accesskey' => 'i',
                        ],
+                       [
+                               'label' => DI::l10n()->t('Collapsed'),
+                               'url'   => 'contact/collapsed',
+                               'sel'   => $type == 'collapsed' ? 'active' : '',
+                               'title' => DI::l10n()->t('Only show collapsed contacts'),
+                               'id'    => 'showcollapsed-tab',
+                               'accesskey' => 'c',
+                       ],
                        [
                                'label' => DI::l10n()->t('Archived'),
                                'url'   => 'contact/archived',
@@ -492,11 +411,12 @@ class Contact extends BaseModule
                }
 
                switch ($type) {
-                       case 'pending':  $header .= ' - ' . DI::l10n()->t('Pending'); break;
-                       case 'blocked':  $header .= ' - ' . DI::l10n()->t('Blocked'); break;
-                       case 'hidden':   $header .= ' - ' . DI::l10n()->t('Hidden'); break;
-                       case 'ignored':  $header .= ' - ' . DI::l10n()->t('Ignored'); break;
-                       case 'archived': $header .= ' - ' . DI::l10n()->t('Archived'); break;
+                       case 'pending':   $header .= ' - ' . DI::l10n()->t('Pending'); break;
+                       case 'blocked':   $header .= ' - ' . DI::l10n()->t('Blocked'); break;
+                       case 'hidden':    $header .= ' - ' . DI::l10n()->t('Hidden'); break;
+                       case 'ignored':   $header .= ' - ' . DI::l10n()->t('Ignored'); break;
+                       case 'collapsed': $header .= ' - ' . DI::l10n()->t('Collapsed'); break;
+                       case 'archived':  $header .= ' - ' . DI::l10n()->t('Archived'); break;
                }
 
                $header .= $nets ? ' - ' . ContactSelector::networkToName($nets) : '';
@@ -515,9 +435,10 @@ class Contact extends BaseModule
                        '$form_security_token'  => BaseModule::getFormSecurityToken('contact_batch_actions'),
                        'multiselect' => 1,
                        '$batch_actions' => [
-                               'contacts_batch_update'  => DI::l10n()->t('Update'),
-                               'contacts_batch_block'   => DI::l10n()->t('Block') . '/' . DI::l10n()->t('Unblock'),
-                               'contacts_batch_ignore'  => DI::l10n()->t('Ignore') . '/' . DI::l10n()->t('Unignore'),
+                               'contacts_batch_update'    => DI::l10n()->t('Update'),
+                               'contacts_batch_block'     => DI::l10n()->t('Block') . '/' . DI::l10n()->t('Unblock'),
+                               'contacts_batch_ignore'    => DI::l10n()->t('Ignore') . '/' . DI::l10n()->t('Unignore'),
+                               'contacts_batch_collapse'  => DI::l10n()->t('Collapse') . '/' . DI::l10n()->t('Uncollapse'),
                        ],
                        '$h_batch_actions' => DI::l10n()->t('Batch Actions'),
                        '$paginate'   => $pager->renderFull($total),
@@ -529,7 +450,7 @@ class Contact extends BaseModule
        /**
         * List of pages for the Contact TabBar
         *
-        * Available Pages are 'Status', 'Profile', 'Contacts' and 'Common Friends'
+        * Available Pages are 'Conversations', 'Profile', 'Contacts' and 'Common Friends'
         *
         * @param array $contact    The contact array
         * @param int   $active_tab 1 if tab should be marked as active
@@ -541,7 +462,7 @@ class Contact extends BaseModule
        public static function getTabsHTML(array $contact, int $active_tab)
        {
                $cid = $pcid = $contact['id'];
-               $data = Model\Contact::getPublicAndUserContactID($contact['id'], local_user());
+               $data = Model\Contact::getPublicAndUserContactID($contact['id'], DI::userSession()->getLocalUserId());
                if (!empty($data['user']) && ($contact['id'] == $data['public'])) {
                        $cid = $data['user'];
                } elseif (!empty($data['public'])) {
@@ -551,7 +472,15 @@ class Contact extends BaseModule
                // tabs
                $tabs = [
                        [
-                               'label' => DI::l10n()->t('Status'),
+                               'label' => DI::l10n()->t('Profile'),
+                               'url'   => 'contact/' . $cid,
+                               'sel'   => (($active_tab == self::TAB_PROFILE) ? 'active' : ''),
+                               'title' => DI::l10n()->t('Profile Details'),
+                               'id'    => 'profile-tab',
+                               'accesskey' => 'o',
+                       ],
+                       [
+                               'label' => DI::l10n()->t('Conversations'),
                                'url'   => 'contact/' . $pcid . '/conversations',
                                'sel'   => (($active_tab == self::TAB_CONVERSATIONS) ? 'active' : ''),
                                'title' => DI::l10n()->t('Conversations started by this contact'),
@@ -562,7 +491,7 @@ class Contact extends BaseModule
                                'label' => DI::l10n()->t('Posts and Comments'),
                                'url'   => 'contact/' . $pcid . '/posts',
                                'sel'   => (($active_tab == self::TAB_POSTS) ? 'active' : ''),
-                               'title' => DI::l10n()->t('Status Messages and Posts'),
+                               'title' => DI::l10n()->t('Individual Posts and Replies'),
                                'id'    => 'posts-tab',
                                'accesskey' => 'p',
                        ],
@@ -574,14 +503,6 @@ class Contact extends BaseModule
                                'id'    => 'media-tab',
                                'accesskey' => 'd',
                        ],
-                       [
-                               'label' => DI::l10n()->t('Profile'),
-                               'url'   => 'contact/' . $cid,
-                               'sel'   => (($active_tab == self::TAB_PROFILE) ? 'active' : ''),
-                               'title' => DI::l10n()->t('Profile Details'),
-                               'id'    => 'profile-tab',
-                               'accesskey' => 'o',
-                       ],
                        ['label' => DI::l10n()->t('Contacts'),
                                'url'   => 'contact/' . $pcid . '/contacts',
                                'sel'   => (($active_tab == self::TAB_CONTACTS) ? 'active' : ''),
@@ -612,21 +533,23 @@ class Contact extends BaseModule
         *
         * @param array $contact Contact array
         * @return array Template fields
+        * @throws InternalServerErrorException
+        * @throws \ImagickException
         */
-       public static function getContactTemplateVars(array $contact)
+       public static function getContactTemplateVars(array $contact): array
        {
                $alt_text = '';
 
-               if (!empty($contact['url']) && isset($contact['uid']) && ($contact['uid'] == 0) && local_user()) {
-                       $personal = Model\Contact::getByURL($contact['url'], false, ['uid', 'rel', 'self'], local_user());
+               if (!empty($contact['url']) && isset($contact['uid']) && ($contact['uid'] == 0) && DI::userSession()->getLocalUserId()) {
+                       $personal = Model\Contact::getByURL($contact['url'], false, ['uid', 'rel', 'self'], DI::userSession()->getLocalUserId());
                        if (!empty($personal)) {
-                               $contact['uid'] = $personal['uid'];
-                               $contact['rel'] = $personal['rel'];
+                               $contact['uid']  = $personal['uid'];
+                               $contact['rel']  = $personal['rel'];
                                $contact['self'] = $personal['self'];
                        }
                }
 
-               if (!empty($contact['uid']) && !empty($contact['rel']) && local_user() == $contact['uid']) {
+               if (!empty($contact['uid']) && !empty($contact['rel']) && DI::userSession()->getLocalUserId() == $contact['uid']) {
                        switch ($contact['rel']) {
                                case Model\Contact::FRIEND:
                                        $alt_text = DI::l10n()->t('Mutual Friendship');
@@ -647,7 +570,7 @@ class Contact extends BaseModule
 
                $url = Model\Contact::magicLinkByContact($contact);
 
-               if (strpos($url, 'redir/') === 0) {
+               if (strpos($url, 'contact/redir/') === 0) {
                        $sparkle = ' class="sparkle" ';
                } else {
                        $sparkle = '';
@@ -663,15 +586,15 @@ class Contact extends BaseModule
 
                if ($contact['self']) {
                        $alt_text = DI::l10n()->t('This is you');
-                       $url = $contact['url'];
-                       $sparkle = '';
+                       $url      = $contact['url'];
+                       $sparkle  = '';
                }
 
                return [
                        'id'           => $contact['id'],
                        'url'          => $url,
                        'img_hover'    => DI::l10n()->t('Visit %s\'s profile [%s]', $contact['name'], $contact['url']),
-                       'photo_menu'   => Model\Contact::photoMenu($contact),
+                       'photo_menu'   => Model\Contact::photoMenu($contact, DI::userSession()->getLocalUserId()),
                        'thumb'        => Model\Contact::getThumb($contact, true),
                        'alt_text'     => $alt_text,
                        'name'         => $contact['name'],
@@ -679,7 +602,7 @@ class Contact extends BaseModule
                        'details'      => $contact['location'],
                        'tags'         => $contact['keywords'],
                        'about'        => $contact['about'],
-                       'account_type' => Model\Contact::getAccountType($contact),
+                       'account_type' => Model\Contact::getAccountType($contact['contact-type']),
                        'sparkle'      => $sparkle,
                        'itemurl'      => ($contact['addr'] ?? '') ?: $contact['url'],
                        'network'      => ContactSelector::networkToName($contact['network'], $contact['url'], $contact['protocol'], $contact['gsid']),