<?php
/**
- * @copyright Copyright (C) 2010-2022, the Friendica project
+ * @copyright Copyright (C) 2010-2023, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
use Friendica\Content\Nav;
use Friendica\Content\Pager;
use Friendica\Content\Widget;
+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;
use Friendica\Model;
use Friendica\Model\User;
use Friendica\Module\Security\Login;
+use Friendica\Network\HTTPException\InternalServerErrorException;
use Friendica\Network\HTTPException\NotFoundException;
+use Friendica\Worker\UpdateContact;
/**
* Manages and show Contacts and their content
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;
}
}
if (!empty($_POST['contacts_batch_block'])) {
- self::toggleBlockContact($cdata['public'], local_user());
+ self::toggleBlockContact($cdata['public'], DI::userSession()->getLocalUserId());
$count_actions++;
}
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);
protected function post(array $request = [])
{
- if (!local_user()) {
+ if (!DI::userSession()->getLocalUserId()) {
return;
}
*/
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;
}
}
// 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()]);
+ }
}
}
*/
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']);
}
$search = trim($_GET['search'] ?? '');
$nets = trim($_GET['nets'] ?? '');
$rel = trim($_GET['rel'] ?? '');
- $group = trim($_GET['group'] ?? '');
+ $circle = trim($_GET['circle'] ?? '');
$accounttype = $_GET['accounttype'] ?? '';
$accounttypeid = User::getAccountTypeByString($accounttype);
$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);
+ $rel_widget = Widget::contactRels($_SERVER['REQUEST_URI'], $rel);
+ $circles_widget = Widget::circles($_SERVER['REQUEST_URI'], $circle);
- 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 . $circles_widget . $networks_widget . $account_widget;
$tpl = Renderer::getMarkupTemplate('contacts-head.tpl');
- DI::page()['htmlhead'] .= Renderer::replaceMacros($tpl, [
- '$baseurl' => DI::baseUrl()->get(true),
- ]);
+ DI::page()['htmlhead'] .= Renderer::replaceMacros($tpl, []);
$o = '';
Nav::setSelected('contact');
$_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;
$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;
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`";
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;
$sql_extra .= " AND `rel` = ?";
$sql_values[] = Model\Contact::FRIEND;
break;
+ case 'nothing':
+ $sql_extra .= " AND `rel` = ?";
+ $sql_values[] = Model\Contact::NOTHING;
+ break;
+ default:
+ $sql_extra .= " AND `rel` != ?";
+ $sql_values[] = Model\Contact::NOTHING;
+ break;
}
- if ($group) {
- $sql_extra .= " AND EXISTS(SELECT `id` FROM `group_member` WHERE `gid` = ? AND `contact`.`id` = `contact-id`)";
- $sql_values[] = $group;
+ if ($circle) {
+ $sql_extra .= " AND `id` IN (SELECT `contact-id` FROM `group_member` WHERE `gid` = ?)";
+ $sql_values[] = $circle;
}
$networks = Widget::unavailableNetworks();
$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);
'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',
'accesskey' => 'h',
],
[
- 'label' => DI::l10n()->t('Groups'),
- 'url' => 'group',
+ 'label' => DI::l10n()->t('Circles'),
+ 'url' => 'circle',
'sel' => '',
- 'title' => DI::l10n()->t('Organize your contact groups'),
- 'id' => 'contactgroups-tab',
+ 'title' => DI::l10n()->t('Organize your contact circles'),
+ 'id' => 'contactcircles-tab',
'accesskey' => 'e',
],
];
$tabs_html = Renderer::replaceMacros($tabs_tpl, ['$tabs' => $tabs]);
switch ($rel) {
- case 'followers': $header = DI::l10n()->t('Followers'); break;
- case 'following': $header = DI::l10n()->t('Following'); break;
- case 'mutuals': $header = DI::l10n()->t('Mutual friends'); break;
- default: $header = DI::l10n()->t('Contacts');
+ case 'followers':
+ $header = DI::l10n()->t('Followers');
+ break;
+ case 'following':
+ $header = DI::l10n()->t('Following');
+ break;
+ case 'mutuals':
+ $header = DI::l10n()->t('Mutual friends');
+ break;
+ case 'nothing':
+ $header = DI::l10n()->t('No relationship');
+ break;
+ default:
+ $header = DI::l10n()->t('Contacts');
}
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) : '';
'$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),
/**
* 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
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'])) {
// 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'),
'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',
],
'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'),
+ 'label' => DI::l10n()->t('Contacts'),
'url' => 'contact/' . $pcid . '/contacts',
'sel' => (($active_tab == self::TAB_CONTACTS) ? 'active' : ''),
'title' => DI::l10n()->t('View all known contacts'),
];
if (!empty($contact['network']) && in_array($contact['network'], [Protocol::FEED, Protocol::MAIL]) && ($cid != $pcid)) {
- $tabs[] = ['label' => DI::l10n()->t('Advanced'),
+ $tabs[] = [
+ 'label' => DI::l10n()->t('Advanced'),
'url' => 'contact/' . $cid . '/advanced/',
'sel' => (($active_tab == self::TAB_ADVANCED) ? 'active' : ''),
'title' => DI::l10n()->t('Advanced Contact Settings'),
*
* @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');
$url = Model\Contact::magicLinkByContact($contact);
- if (strpos($url, 'redir/') === 0) {
+ if (strpos($url, 'contact/redir/') === 0) {
$sparkle = ' class="sparkle" ';
} else {
$sparkle = '';
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'],