]> git.mxchange.org Git - friendica.git/blobdiff - src/Module/Contact.php
Update doignore() in main.js to match new Item\Ignore return type
[friendica.git] / src / Module / Contact.php
index 4429573ab78ec120385ab83ef6a6ece9f2a88b9f..5ef06b72a183b22488820bf6dc8c74b3823ff983 100644 (file)
@@ -75,7 +75,7 @@ class Contact extends BaseModule
                $a->internalRedirect('contact');
        }
 
-       public static function post()
+       public static function post(array $parameters = [])
        {
                $a = self::getApp();
 
@@ -103,7 +103,7 @@ class Contact extends BaseModule
 
                Hook::callAll('contact_edit_post', $_POST);
 
-               $profile_id = intval(defaults($_POST, 'profile-assign', 0));
+               $profile_id = intval($_POST['profile-assign'] ?? 0);
                if ($profile_id) {
                        if (!DBA::exists('profile', ['id' => $profile_id, 'uid' => local_user()])) {
                                notice(L10n::t('Could not locate selected profile.') . EOL);
@@ -115,16 +115,16 @@ class Contact extends BaseModule
 
                $notify = !empty($_POST['notify']);
 
-               $fetch_further_information = intval(defaults($_POST, 'fetch_further_information', 0));
+               $fetch_further_information = intval($_POST['fetch_further_information'] ?? 0);
 
-               $ffi_keyword_blacklist = Strings::escapeHtml(trim(defaults($_POST, 'ffi_keyword_blacklist', '')));
+               $ffi_keyword_blacklist = Strings::escapeHtml(trim($_POST['ffi_keyword_blacklist'] ?? ''));
 
-               $priority = intval(defaults($_POST, 'poll', 0));
+               $priority = intval($_POST['poll'] ?? 0);
                if ($priority > 5 || $priority < 0) {
                        $priority = 0;
                }
 
-               $info = Strings::escapeHtml(trim(defaults($_POST, 'info', '')));
+               $info = Strings::escapeHtml(trim($_POST['info'] ?? ''));
 
                $r = DBA::update('contact', [
                        'profile-id' => $profile_id,
@@ -176,71 +176,54 @@ class Contact extends BaseModule
 
        private static function updateContactFromProbe($contact_id)
        {
-               $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]);
+               $contact = DBA::selectFirst('contact', ['url'], ['id' => $contact_id, 'uid' => local_user(), 'deleted' => false]);
                if (!DBA::isResult($contact)) {
                        return;
                }
 
-               $uid = $contact['uid'];
-
-               $data = Probe::uri($contact['url'], '', 0, false);
-
-               // 'Feed' or 'Unknown' is mostly a sign of communication problems
-               if ((in_array($data['network'], [Protocol::FEED, Protocol::PHANTOM])) && ($data['network'] != $contact['network'])) {
-                       return;
-               }
-
-               $updatefields = ['name', 'nick', 'url', 'addr', 'batch', 'notify', 'poll', 'request', 'confirm', 'poco', 'network', 'alias'];
-               $fields = [];
-
-               if ($data['network'] == Protocol::OSTATUS) {
-                       $result = Model\Contact::createFromProbe($uid, $data['url'], false);
-
-                       if ($result['success']) {
-                               $fields['subhub'] = true;
-                       }
-               }
-
-               foreach ($updatefields AS $field) {
-                       if (!empty($data[$field])) {
-                               $fields[$field] = $data[$field];
-                       }
-               }
-
-               $fields['nurl'] = Strings::normaliseLink($data['url']);
-
-               if (!empty($data['priority'])) {
-                       $fields['priority'] = intval($data['priority']);
-               }
-
-               if (empty($fields)) {
-                       return;
-               }
-
-               DBA::update('contact', $fields, ['id' => $contact_id, 'uid' => local_user()]);
-
                // Update the entry in the contact table
-               Model\Contact::updateAvatar($data['photo'], local_user(), $contact_id, true);
+               Model\Contact::updateFromProbe($contact_id, '', true);
 
                // Update the entry in the gcontact table
-               Model\GContact::updateFromProbe($data['url']);
+               Model\GContact::updateFromProbe($contact['url']);
        }
 
+       /**
+        * Toggles the blocked status of a contact identified by id.
+        *
+        * @param $contact_id
+        * @throws \Exception
+        */
        private static function blockContact($contact_id)
        {
                $blocked = !Model\Contact::isBlockedByUser($contact_id, local_user());
                Model\Contact::setBlockedForUser($contact_id, local_user(), $blocked);
        }
 
+       /**
+        * Toggles the ignored status of a contact identified by id.
+        *
+        * @param $contact_id
+        * @throws \Exception
+        */
        private static function ignoreContact($contact_id)
        {
                $ignored = !Model\Contact::isIgnoredByUser($contact_id, local_user());
                Model\Contact::setIgnoredForUser($contact_id, local_user(), $ignored);
        }
 
+       /**
+        * Toggles the archived status of a contact identified by id.
+        * If the current status isn't provided, this will always archive the contact.
+        *
+        * @param $contact_id
+        * @param $orig_record
+        * @return bool
+        * @throws \Exception
+        */
        private static function archiveContact($contact_id, $orig_record)
        {
-               $archived = (defaults($orig_record, 'archive', '') ? 0 : 1);
+               $archived = empty($orig_record['archive']);
                $r = DBA::update('contact', ['archive' => $archived], ['id' => $contact_id, 'uid' => local_user()]);
 
                return DBA::isResult($r);
@@ -257,15 +240,16 @@ class Contact extends BaseModule
                Model\Contact::remove($orig_record['id']);
        }
 
-       public static function content($update = 0)
+       public static function content(array $parameters = [], $update = 0)
        {
                if (!local_user()) {
-                       return Login::form($_SERVER['REQUET_URI']);
+                       return Login::form($_SERVER['REQUEST_URI']);
                }
 
                $a = self::getApp();
 
-               $nets = defaults($_GET, 'nets', '');
+               $nets = $_GET['nets'] ?? '';
+               $rel  = $_GET['rel']  ?? '';
 
                if (empty($a->page['aside'])) {
                        $a->page['aside'] = '';
@@ -308,19 +292,41 @@ class Contact extends BaseModule
                                $network_link = '';
                        }
 
+                       $follow_link = '';
+                       $unfollow_link = '';
+                       if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
+                               if ($contact['uid'] && in_array($contact['rel'], [Model\Contact::SHARING, Model\Contact::FRIEND])) {
+                                       $unfollow_link = 'unfollow?url=' . urlencode($contact['url']);
+                               } elseif(!$contact['pending']) {
+                                       $follow_link = 'follow?url=' . urlencode($contact['url']);
+                               }
+                       }
+
+                       $wallmessage_link = '';
+                       if ($contact['uid'] && Model\Contact::canReceivePrivateMessages($contact)) {
+                               $wallmessage_link = 'message/new/' . $contact['id'];
+                       }
+
                        $vcard_widget = Renderer::replaceMacros(Renderer::getMarkupTemplate('widget/vcard.tpl'), [
                                '$name'         => $contact['name'],
                                '$photo'        => $contact['photo'],
                                '$url'          => Model\Contact::magicLinkByContact($contact, $contact['url']),
-                               '$addr'         => defaults($contact, 'addr', ''),
+                               '$addr'         => $contact['addr'] ?? '',
                                '$network_link' => $network_link,
                                '$network'      => L10n::t('Network:'),
-                               '$account_type' => Model\Contact::getAccountType($contact)
+                               '$account_type' => Model\Contact::getAccountType($contact),
+                               '$follow'       => L10n::t('Follow'),
+                               '$follow_link'   => $follow_link,
+                               '$unfollow'     => L10n::t('Unfollow'),
+                               '$unfollow_link' => $unfollow_link,
+                               '$wallmessage'  => L10n::t('Message'),
+                               '$wallmessage_link' => $wallmessage_link,
                        ]);
 
                        $findpeople_widget = '';
                        $follow_widget = '';
                        $networks_widget = '';
+                       $rel_widget = '';
                } else {
                        $vcard_widget = '';
                        $findpeople_widget = Widget::findPeople();
@@ -331,6 +337,7 @@ class Contact extends BaseModule
                        }
 
                        $networks_widget = Widget::networks($_SERVER['REQUEST_URI'], $nets);
+                       $rel_widget = Widget::contactRels($_SERVER['REQUEST_URI'], $rel);
                }
 
                if ($contact['uid'] != 0) {
@@ -339,7 +346,7 @@ class Contact extends BaseModule
                        $groups_widget = null;
                }
 
-               $a->page['aside'] .= $vcard_widget . $findpeople_widget . $follow_widget . $groups_widget . $networks_widget;
+               $a->page['aside'] .= $vcard_widget . $findpeople_widget . $follow_widget . $groups_widget . $networks_widget . $rel_widget;
 
                $tpl = Renderer::getMarkupTemplate('contacts-head.tpl');
                $a->page['htmlhead'] .= Renderer::replaceMacros($tpl, [
@@ -497,7 +504,7 @@ class Contact extends BaseModule
                                $relation_text = '';
                        }
 
-                       if (!in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])) {
+                       if (!in_array($contact['network'], Protocol::FEDERATED)) {
                                $relation_text = '';
                        }
 
@@ -554,19 +561,6 @@ class Contact extends BaseModule
                                $profile_select = ContactSelector::profileAssign($contact['profile-id'], $contact['network'] !== Protocol::DFRN);
                        }
 
-                       /// @todo Only show the following link with DFRN when the remote version supports it
-                       $follow = '';
-                       $follow_text = '';
-                       if ($contact['uid'] && in_array($contact['rel'], [Model\Contact::FRIEND, Model\Contact::SHARING])) {
-                               if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
-                                       $follow = $a->getBaseURL(true) . '/unfollow?url=' . urlencode($contact['url']);
-                                       $follow_text = L10n::t('Disconnect/Unfollow');
-                               }
-                       } elseif(!$contact['pending']) {
-                               $follow = $a->getBaseURL(true) . '/follow?url=' . urlencode($contact['url']);
-                               $follow_text = L10n::t('Connect/Follow');
-                       }
-
                        // Load contactact related actions like hide, suggest, delete and others
                        $contact_actions = self::getContactActions($contact);
 
@@ -607,8 +601,6 @@ class Contact extends BaseModule
                                '$updpub'         => L10n::t('Update public posts'),
                                '$last_update'    => $last_update,
                                '$udnow'          => L10n::t('Update now'),
-                               '$follow'         => $follow,
-                               '$follow_text'    => $follow_text,
                                '$profile_select' => $profile_select,
                                '$contact_id'     => $contact['id'],
                                '$block_text'     => ($contact['blocked'] ? L10n::t('Unblock') : L10n::t('Block')),
@@ -655,29 +647,34 @@ class Contact extends BaseModule
                }
 
                // @TODO: Replace with parameter from router
-               $type = defaults($a->argv, 1, '');
+               $type = $a->argv[1] ?? '';
 
                switch ($type) {
                        case 'blocked':
-                               $sql_extra = " AND `blocked` = 1";
+                               $sql_extra = " AND `blocked`";
                                break;
                        case 'hidden':
-                               $sql_extra = " AND `hidden` = 1 AND `blocked` = 0";
+                               $sql_extra = " AND `hidden` AND NOT `blocked`";
                                break;
                        case 'ignored':
-                               $sql_extra = " AND `readonly` = 1 AND `blocked` = 0";
+                               $sql_extra = " AND `readonly` AND NOT `blocked`";
                                break;
                        case 'archived':
-                               $sql_extra = " AND `archive` = 1 AND `blocked` = 0";
+                               $sql_extra = " AND `archive` AND NOT `blocked`";
+                               break;
+                       case 'pending':
+                               $sql_extra = sprintf(" AND `pending` AND NOT `archive` AND ((`rel` = %d)
+                                       OR EXISTS (SELECT `id` FROM `intro` WHERE `contact-id` = `contact`.`id` AND NOT `ignore`))", Model\Contact::SHARING);
                                break;
                        default:
-                               $sql_extra = " AND `blocked` = 0";
+                               $sql_extra = " AND NOT `archive` AND NOT `blocked` AND NOT `pending`";
                }
 
                $sql_extra .= sprintf(" AND `network` != '%s' ", Protocol::PHANTOM);
 
-               $search = Strings::escapeTags(trim(defaults($_GET, 'search', '')));
-               $nets   = Strings::escapeTags(trim(defaults($_GET, 'nets'  , '')));
+               $search = Strings::escapeTags(trim($_GET['search'] ?? ''));
+               $nets   = Strings::escapeTags(trim($_GET['nets']   ?? ''));
+               $rel    = Strings::escapeTags(trim($_GET['rel']    ?? ''));
 
                $tabs = [
                        [
@@ -688,6 +685,14 @@ class Contact extends BaseModule
                                'id'    => 'showall-tab',
                                'accesskey' => 'l',
                        ],
+                       [
+                               'label' => L10n::t('Pending'),
+                               'url'   => 'contact/pending',
+                               'sel'   => $type == 'pending' ? 'active' : '',
+                               'title' => L10n::t('Only show pending contacts'),
+                               'id'    => 'showpending-tab',
+                               'accesskey' => 'p',
+                       ],
                        [
                                'label' => L10n::t('Blocked'),
                                'url'   => 'contact/blocked',
@@ -747,12 +752,18 @@ class Contact extends BaseModule
                        $sql_extra .= sprintf(" AND network = '%s' ", DBA::escape($nets));
                }
 
+               switch ($rel) {
+                       case 'followers': $sql_extra .= " AND `rel` IN (1, 3)"; break;
+                       case 'following': $sql_extra .= " AND `rel` IN (2, 3)"; break;
+                       case 'mutuals': $sql_extra .= " AND `rel` = 3"; break;
+               }
+
                $sql_extra .=  " AND NOT `deleted` ";
 
                $sql_extra2 = ((($sort_type > 0) && ($sort_type <= Model\Contact::FRIEND)) ? sprintf(" AND `rel` = %d ", intval($sort_type)) : '');
 
                $r = q("SELECT COUNT(*) AS `total` FROM `contact`
-                       WHERE `uid` = %d AND `self` = 0 AND `pending` = 0 $sql_extra $sql_extra2 ",
+                       WHERE `uid` = %d AND `self` = 0 $sql_extra $sql_extra2 ",
                        intval($_SESSION['uid'])
                );
                if (DBA::isResult($r)) {
@@ -764,7 +775,7 @@ class Contact extends BaseModule
 
                $contacts = [];
 
-               $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `pending` = 0 $sql_extra $sql_extra2 $sql_extra3 ORDER BY `name` ASC LIMIT %d , %d ",
+               $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 0 $sql_extra $sql_extra2 $sql_extra3 ORDER BY `name` ASC LIMIT %d , %d ",
                        intval($_SESSION['uid']),
                        $pager->getStart(),
                        $pager->getItemsPerPage()
@@ -777,7 +788,15 @@ class Contact extends BaseModule
                        }
                }
 
+               switch ($rel) {
+                       case 'followers': $header = L10n::t('Followers'); break;
+                       case 'following': $header = L10n::t('Following'); break;
+                       case 'mutuals':   $header = L10n::t('Mutual friends'); break;
+                       default:          $header = L10n::t('Contacts');
+               }
+
                switch ($type) {
+                       case 'pending':  $header .= ' - ' . L10n::t('Pending'); break;
                        case 'blocked':  $header .= ' - ' . L10n::t('Blocked'); break;
                        case 'hidden':   $header .= ' - ' . L10n::t('Hidden'); break;
                        case 'ignored':  $header .= ' - ' . L10n::t('Ignored'); break;
@@ -907,7 +926,7 @@ class Contact extends BaseModule
                                        'default_location' => $a->user['default-location'],
                                        'nickname' => $a->user['nickname'],
                                        'lockstate' => (is_array($a->user) && (strlen($a->user['allow_cid']) || strlen($a->user['allow_gid']) || strlen($a->user['deny_cid']) || strlen($a->user['deny_gid'])) ? 'lock' : 'unlock'),
-                                       'acl' => ACL::getFullSelectorHTML($a->user, true),
+                                       'acl' => ACL::getFullSelectorHTML($a->page, $a->user, true),
                                        'bang' => '',
                                        'visitor' => 'block',
                                        'profile_uid' => local_user(),
@@ -927,10 +946,6 @@ class Contact extends BaseModule
 
                        $profiledata = Model\Contact::getDetailsByURL($contact['url']);
 
-                       if (local_user() && in_array($profiledata['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) {
-                               $profiledata['remoteconnect'] = System::baseUrl() . '/follow?url=' . urlencode($profiledata['url']);
-                       }
-
                        Model\Profile::load($a, '', 0, $profiledata, true);
                        $o .= Model\Contact::getPostsFromUrl($contact['url'], true, $update);
                }
@@ -949,7 +964,7 @@ class Contact extends BaseModule
 
                        $profiledata = Model\Contact::getDetailsByURL($contact['url']);
 
-                       if (local_user() && in_array($profiledata['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) {
+                       if (local_user() && in_array($profiledata['network'], Protocol::FEDERATED)) {
                                $profiledata['remoteconnect'] = System::baseUrl() . '/follow?url=' . urlencode($profiledata['url']);
                        }
 
@@ -965,24 +980,26 @@ class Contact extends BaseModule
                $dir_icon = '';
                $alt_text = '';
 
-               switch ($rr['rel']) {
-                       case Model\Contact::FRIEND:
-                               $dir_icon = 'images/lrarrow.gif';
-                               $alt_text = L10n::t('Mutual Friendship');
-                               break;
+               if (!empty($rr['uid']) && !empty($rr['rel'])) {
+                       switch ($rr['rel']) {
+                               case Model\Contact::FRIEND:
+                                       $dir_icon = 'images/lrarrow.gif';
+                                       $alt_text = L10n::t('Mutual Friendship');
+                                       break;
 
-                       case Model\Contact::FOLLOWER;
-                               $dir_icon = 'images/larrow.gif';
-                               $alt_text = L10n::t('is a fan of yours');
-                               break;
+                               case Model\Contact::FOLLOWER;
+                                       $dir_icon = 'images/larrow.gif';
+                                       $alt_text = L10n::t('is a fan of yours');
+                                       break;
 
-                       case Model\Contact::SHARING;
-                               $dir_icon = 'images/rarrow.gif';
-                               $alt_text = L10n::t('you are a fan of');
-                               break;
+                               case Model\Contact::SHARING;
+                                       $dir_icon = 'images/rarrow.gif';
+                                       $alt_text = L10n::t('you are a fan of');
+                                       break;
 
-                       default:
-                               break;
+                               default:
+                                       break;
+                       }
                }
 
                $url = Model\Contact::magicLink($rr['url']);
@@ -993,6 +1010,14 @@ class Contact extends BaseModule
                        $sparkle = '';
                }
 
+               if ($rr['pending']) {
+                       if (in_array($rr['rel'], [Model\Contact::FRIEND, Model\Contact::SHARING])) {
+                               $alt_text = L10n::t('Pending outgoing contact request');
+                       } else {
+                               $alt_text = L10n::t('Pending incoming contact request');
+                       }
+               }
+
                if ($rr['self']) {
                        $dir_icon = 'images/larrow.gif';
                        $alt_text = L10n::t('This is you');
@@ -1012,7 +1037,7 @@ class Contact extends BaseModule
                        'username'  => $rr['name'],
                        'account_type' => Model\Contact::getAccountType($rr),
                        'sparkle'   => $sparkle,
-                       'itemurl'   => defaults($rr, 'addr', $rr['url']),
+                       'itemurl'   => ($rr['addr'] ?? '') ?: $rr['url'],
                        'url'       => $url,
                        'network'   => ContactSelector::networkToName($rr['network'], $rr['url']),
                        'nick'      => $rr['nick'],