X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModule%2FContact.php;h=5ef06b72a183b22488820bf6dc8c74b3823ff983;hb=d01d69b9e72360b0b19c2618b3c3504704ea83da;hp=4429573ab78ec120385ab83ef6a6ece9f2a88b9f;hpb=1cd7d509396c578f610b259f4508a8bcca574979;p=friendica.git diff --git a/src/Module/Contact.php b/src/Module/Contact.php index 4429573ab7..5ef06b72a1 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -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'],