X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModule%2FContact.php;h=a70db02345c681c77e46055e67c8ef870f96821d;hb=8165fb80910560cef86f78ae7a52c7131f5ad3f5;hp=c7b2870ece4c9523ac7dcd78483727aadc9bdd8f;hpb=1b73e4d267761d2b717fb30fb972c6e450ecf85e;p=friendica.git diff --git a/src/Module/Contact.php b/src/Module/Contact.php index c7b2870ece..a70db02345 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -1,6 +1,6 @@ $_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; } @@ -75,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++; } @@ -83,9 +87,14 @@ 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); @@ -93,7 +102,7 @@ class Contact extends BaseModule protected function post(array $request = []) { - if (!local_user()) { + if (!DI::userSession()->getLocalUserId()) { return; } @@ -113,7 +122,7 @@ class Contact extends BaseModule */ 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; } @@ -126,9 +135,13 @@ 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); + try { + UpdateContact::add(Worker::PRIORITY_HIGH, $contact_id); + } catch (\InvalidArgumentException $e) { + Logger::notice($e->getMessage(), ['contact' => $contact, 'callstack' => System::callstack()]); + } } } @@ -153,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); } protected function content(array $request = []): string { - if (!local_user()) { + if (!DI::userSession()->getLocalUserId()) { return Login::form($_SERVER['REQUEST_URI']); } @@ -186,16 +211,15 @@ class Contact extends BaseModule $follow_widget = Widget::follow(); } - $account_widget = Widget::accounttypes($_SERVER['REQUEST_URI'], $accounttype); + $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 . $account_widget . $groups_widget . $networks_widget . $rel_widget; + 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 = ''; @@ -203,14 +227,14 @@ class Contact extends BaseModule $_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; @@ -218,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; @@ -227,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`"; @@ -245,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; @@ -275,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; } @@ -295,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); @@ -334,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', @@ -371,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) : ''; @@ -394,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), @@ -408,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 @@ -420,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'])) { @@ -430,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'), @@ -441,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', ], @@ -453,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' : ''), @@ -491,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'); @@ -526,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 = ''; @@ -542,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'],