From 80ea86113d7646e9ab24948fcdf11183d07920df Mon Sep 17 00:00:00 2001 From: Jonny Tischbein Date: Thu, 11 Oct 2018 23:14:12 +0200 Subject: [PATCH 1/9] Move mod Contacts to /src/Module --- mod/allfriends.php | 4 +- mod/common.php | 4 +- mod/crepair.php | 3 +- mod/dirfind.php | 5 +- mod/group.php | 9 +- mod/update_contacts.php | 5 +- src/Module/Contacts.php | 1138 +++++++++++++++++++++++++++++++++++++ view/theme/frio/theme.php | 5 +- 8 files changed, 1153 insertions(+), 20 deletions(-) create mode 100644 src/Module/Contacts.php diff --git a/mod/allfriends.php b/mod/allfriends.php index b41d0c891..190ab12a6 100644 --- a/mod/allfriends.php +++ b/mod/allfriends.php @@ -12,9 +12,9 @@ use Friendica\Model\Contact; use Friendica\Model\GContact; use Friendica\Model\Profile; use Friendica\Util\Proxy as ProxyUtils; +use Friendica\Module\Contacts; require_once 'include/dba.php'; -require_once 'mod/contacts.php'; function allfriends_content(App $a) { @@ -96,7 +96,7 @@ function allfriends_content(App $a) $entries[] = $entry; } - $tab_str = contacts_tab($a, $contact, 4); + $tab_str = Contacts::contacts_tab($a, $contact, 4); $tpl = get_markup_template('viewcontact_template.tpl'); diff --git a/mod/common.php b/mod/common.php index d694527b8..13e5bf092 100644 --- a/mod/common.php +++ b/mod/common.php @@ -11,9 +11,9 @@ use Friendica\Model\Contact; use Friendica\Model\GContact; use Friendica\Model\Profile; use Friendica\Util\Proxy as ProxyUtils; +use Friendica\Module\Contacts; require_once 'include/dba.php'; -require_once 'mod/contacts.php'; function common_content(App $a) { @@ -137,7 +137,7 @@ function common_content(App $a) $title = ''; $tab_str = ''; if ($cmd === 'loc' && $cid && local_user() == $uid) { - $tab_str = contacts_tab($a, $contact, 4); + $tab_str = Contacts::contacts_tab($a, $contact, 4); } else { $title = L10n::t('Common Friends'); } diff --git a/mod/crepair.php b/mod/crepair.php index 076c611db..99aee1357 100644 --- a/mod/crepair.php +++ b/mod/crepair.php @@ -10,6 +10,7 @@ use Friendica\Core\Protocol; use Friendica\Database\DBA; use Friendica\Model\Contact; use Friendica\Model\Profile; +use Friendica\Module\Contacts; require_once 'mod/contacts.php'; @@ -135,7 +136,7 @@ function crepair_content(App $a) $update_profile = in_array($contact['network'], [Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]); - $tab_str = contacts_tab($a, $contact, 5); + $tab_str = Contacts::contacts_tab($a, $contact, 5); $tpl = get_markup_template('crepair.tpl'); $o = replace_macros($tpl, [ diff --git a/mod/dirfind.php b/mod/dirfind.php index 5fe9ae13a..e183e6c02 100644 --- a/mod/dirfind.php +++ b/mod/dirfind.php @@ -18,8 +18,7 @@ use Friendica\Network\Probe; use Friendica\Protocol\PortableContact; use Friendica\Util\Network; use Friendica\Util\Proxy as ProxyUtils; - -require_once 'mod/contacts.php'; +use Friendica\Module\Contacts; function dirfind_init(App $a) { @@ -211,7 +210,7 @@ function dirfind_content(App $a, $prefix = "") { $contact = DBA::selectFirst('contact', [], ['id' => $jj->cid]); if (DBA::isResult($contact)) { $photo_menu = Contact::photoMenu($contact); - $details = _contact_detail_for_template($contact); + $details = Contacts::_contact_detail_for_template($contact); $alt_text = $details['alt_text']; } else { $photo_menu = []; diff --git a/mod/group.php b/mod/group.php index 8f65eb643..cfcbca4e4 100644 --- a/mod/group.php +++ b/mod/group.php @@ -13,6 +13,7 @@ use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\Model\Contact; use Friendica\Model\Group; +use Friendica\Module\Contacts; function group_init(App $a) { if (local_user()) { @@ -116,8 +117,6 @@ function group_content(App $a) { $nogroup = false; if (($a->argc == 2) && ($a->argv[1] === 'none')) { - require_once 'mod/contacts.php'; - $id = -1; $nogroup = true; $group = [ @@ -176,8 +175,6 @@ function group_content(App $a) { } if (($a->argc > 1) && intval($a->argv[1])) { - require_once 'mod/contacts.php'; - $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1", intval($a->argv[1]), intval(local_user()) @@ -253,7 +250,7 @@ function group_content(App $a) { // Format the data of the group members foreach ($members as $member) { if ($member['url']) { - $entry = _contact_detail_for_template($member); + $entry = Contacts::_contact_detail_for_template($member); $entry['label'] = 'members'; $entry['photo_menu'] = ''; $entry['change_member'] = [ @@ -282,7 +279,7 @@ function group_content(App $a) { // Format the data of the contacts who aren't in the contact group foreach ($r as $member) { if (!in_array($member['id'], $preselected)) { - $entry = _contact_detail_for_template($member); + $entry = Contacts::_contact_detail_for_template($member); $entry['label'] = 'contacts'; if (!$nogroup) $entry['photo_menu'] = []; diff --git a/mod/update_contacts.php b/mod/update_contacts.php index 863542e66..1ad5cd4a3 100644 --- a/mod/update_contacts.php +++ b/mod/update_contacts.php @@ -5,8 +5,7 @@ use Friendica\App; use Friendica\Core\L10n; use Friendica\Core\PConfig; - -require_once 'mod/contacts.php'; +use Friendica\Module\Contacts; function update_contacts_content(App $a) { @@ -15,7 +14,7 @@ function update_contacts_content(App $a) echo "
"; if ($_GET["force"] == 1) { - $text = contacts_content($a, true); + $text = Contacts::contacts_content($a, true); } else { $text = ''; } diff --git a/src/Module/Contacts.php b/src/Module/Contacts.php new file mode 100644 index 000000000..a017b55b1 --- /dev/null +++ b/src/Module/Contacts.php @@ -0,0 +1,1138 @@ +page, 'aside')) { + $a->page['aside'] = ''; + } + + $contact_id = null; + $contact = null; + if ((($a->argc == 2) && intval($a->argv[1])) || (($a->argc == 3) && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations']))) { + $contact_id = intval($a->argv[1]); + $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]); + + if (!DBA::isResult($contact)) { + $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => 0]); + } + + // Don't display contacts that are about to be deleted + if ($contact['network'] == Protocol::PHANTOM) { + $contact = false; + } + } + + if (DBA::isResult($contact)) { + if ($contact['self']) { + if (($a->argc == 3) && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations'])) { + goaway('profile/' . $contact['nick']); + } else { + goaway('profile/' . $contact['nick'] . '?tab=profile'); + } + } + + $a->data['contact'] = $contact; + + if (($a->data['contact']['network'] != "") && ($a->data['contact']['network'] != Protocol::DFRN)) { + $networkname = format_network_name($a->data['contact']['network'], $a->data['contact']['url']); + } else { + $networkname = ''; + } + + /// @TODO Add nice spaces + $vcard_widget = replace_macros(get_markup_template("vcard-widget.tpl"), [ + '$name' => htmlentities($a->data['contact']['name']), + '$photo' => $a->data['contact']['photo'], + '$url' => Contact::MagicLink($a->data['contact']['url']), + '$addr' => (($a->data['contact']['addr'] != "") ? ($a->data['contact']['addr']) : ""), + '$network_name' => $networkname, + '$network' => L10n::t('Network:'), + '$account_type' => Contact::getAccountType($a->data['contact']) + ]); + + $findpeople_widget = ''; + $follow_widget = ''; + $networks_widget = ''; + } else { + $vcard_widget = ''; + $networks_widget = Widget::networks('contacts', $nets); + if (isset($_GET['add'])) { + $follow_widget = Widget::follow($_GET['add']); + } else { + $follow_widget = Widget::follow(); + } + + $findpeople_widget = Widget::findPeople(); + } + + if ($contact['uid'] != 0) { + $groups_widget = Group::sidebarWidget('contacts', 'group', 'full', 'everyone', $contact_id); + } else { + $groups_widget = null; + } + + $a->page['aside'] .= replace_macros(get_markup_template("contacts-widget-sidebar.tpl"), [ + '$vcard_widget' => $vcard_widget, + '$findpeople_widget' => $findpeople_widget, + '$follow_widget' => $follow_widget, + '$groups_widget' => $groups_widget, + '$networks_widget' => $networks_widget + ]); + + $base = System::baseUrl(); + $tpl = get_markup_template("contacts-head.tpl"); + $a->page['htmlhead'] .= replace_macros($tpl, [ + '$baseurl' => System::baseUrl(true), + '$base' => $base + ]); + } + + private static function contacts_batch_actions(App $a) + { + if (empty($_POST['contact_batch']) || !is_array($_POST['contact_batch'])) { + return; + } + + $contacts_id = $_POST['contact_batch']; + + $orig_records = q("SELECT * FROM `contact` WHERE `id` IN (%s) AND `uid` = %d AND `self` = 0", + implode(",", $contacts_id), + intval(local_user()) + ); + + $count_actions = 0; + foreach ($orig_records as $orig_record) { + $contact_id = $orig_record['id']; + if (x($_POST, 'contacts_batch_update')) { + self::_contact_update($contact_id); + $count_actions++; + } + if (x($_POST, 'contacts_batch_block')) { + self::_contact_block($contact_id); + $count_actions++; + } + if (x($_POST, 'contacts_batch_ignore')) { + self::_contact_ignore($contact_id); + $count_actions++; + } + if (x($_POST, 'contacts_batch_archive')) { + $r = self::_contact_archive($contact_id, $orig_record); + if ($r) { + $count_actions++; + } + } + if (x($_POST, 'contacts_batch_drop')) { + self::_contact_drop($orig_record); + $count_actions++; + } + } + if ($count_actions > 0) { + info(L10n::tt("%d contact edited.", "%d contacts edited.", $count_actions)); + } + + goaway('contacts'); + } + + public static function post() + { + $a = self::getApp(); + + if (!local_user()) { + return; + } + + if ($a->argv[1] === "batch") { + contacts_batch_actions($a); + return; + } + + $contact_id = intval($a->argv[1]); + if (!$contact_id) { + return; + } + + if (!DBA::exists('contact', ['id' => $contact_id, 'uid' => local_user()])) { + notice(L10n::t('Could not access contact record.') . EOL); + goaway('contacts'); + return; // NOTREACHED + } + + Addon::callHooks('contact_edit_post', $_POST); + + $profile_id = intval(defaults($_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); + return; + } + } + + $hidden = intval($_POST['hidden']); + + $notify = intval($_POST['notify']); + + $fetch_further_information = intval(defaults($_POST, 'fetch_further_information', 0)); + + $ffi_keyword_blacklist = escape_tags(trim(defaults($_POST, 'ffi_keyword_blacklist', ''))); + + $priority = intval(defaults($_POST, 'poll', 0)); + if ($priority > 5 || $priority < 0) { + $priority = 0; + } + + $info = escape_tags(trim($_POST['info'])); + + $r = q("UPDATE `contact` SET `profile-id` = %d, `priority` = %d , `info` = '%s', + `hidden` = %d, `notify_new_posts` = %d, `fetch_further_information` = %d, + `ffi_keyword_blacklist` = '%s' WHERE `id` = %d AND `uid` = %d", + intval($profile_id), + intval($priority), + DBA::escape($info), + intval($hidden), + intval($notify), + intval($fetch_further_information), + DBA::escape($ffi_keyword_blacklist), + intval($contact_id), + intval(local_user()) + ); + if (DBA::isResult($r)) { + info(L10n::t('Contact updated.') . EOL); + } else { + notice(L10n::t('Failed to update contact record.') . EOL); + } + + $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]); + if (DBA::isResult($contact)) { + $a->data['contact'] = $contact; + } + + return; + } + + /* contact actions */ + + private static function _contact_update($contact_id) + { + $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); + if (!DBA::isResult($contact)) { + return; + } + + $uid = $contact["uid"]; + + if ($contact["network"] == Protocol::OSTATUS) { + $result = Contact::createFromProbe($uid, $contact["url"], false, $contact["network"]); + + if ($result['success']) { + q("UPDATE `contact` SET `subhub` = 1 WHERE `id` = %d", intval($contact_id)); + } + } else { + // pull feed and consume it, which should subscribe to the hub. + Worker::add(PRIORITY_HIGH, "OnePoll", $contact_id, "force"); + } + } + + private static function _contact_update_profile($contact_id) + { + $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); + 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"]; + $update = []; + + if ($data["network"] == Protocol::OSTATUS) { + $result = Contact::createFromProbe($uid, $data["url"], false); + + if ($result['success']) { + $update["subhub"] = true; + } + } + + foreach ($updatefields AS $field) { + if (isset($data[$field]) && ($data[$field] != "")) { + $update[$field] = $data[$field]; + } + } + + $update["nurl"] = normalise_link($data["url"]); + + $query = ""; + + if (isset($data["priority"]) && ($data["priority"] != 0)) { + $query = "`priority` = " . intval($data["priority"]); + } + + foreach ($update AS $key => $value) { + if ($query != "") { + $query .= ", "; + } + + $query .= "`" . $key . "` = '" . DBA::escape($value) . "'"; + } + + if ($query == "") { + return; + } + + $r = q("UPDATE `contact` SET $query WHERE `id` = %d AND `uid` = %d", + intval($contact_id), + intval(local_user()) + ); + + // Update the entry in the contact table + Contact::updateAvatar($data['photo'], local_user(), $contact_id, true); + + // Update the entry in the gcontact table + GContact::updateFromProbe($data["url"]); + } + + private static function _contact_block($contact_id) + { + $blocked = !Contact::isBlockedByUser($contact_id, local_user()); + Contact::setBlockedForUser($contact_id, local_user(), $blocked); + } + + private static function _contact_ignore($contact_id) + { + $ignored = !Contact::isIgnoredByUser($contact_id, local_user()); + Contact::setIgnoredForUser($contact_id, local_user(), $ignored); + } + + private static function _contact_archive($contact_id, $orig_record) + { + $archived = (($orig_record['archive']) ? 0 : 1); + $r = q("UPDATE `contact` SET `archive` = %d WHERE `id` = %d AND `uid` = %d", + intval($archived), + intval($contact_id), + intval(local_user()) + ); + return DBA::isResult($r); + } + + private static function _contact_drop($orig_record) + { + $a = get_app(); + + $r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` + WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1", + intval($a->user['uid']) + ); + if (!DBA::isResult($r)) { + return; + } + + Contact::terminateFriendship($r[0], $orig_record, true); + Contact::remove($orig_record['id']); + } + + public static function contacts_content($update = 0) + { + $a = self::getApp(); + $sort_type = 0; + $o = ''; + Nav::setSelected('contacts'); + + if (!local_user()) { + notice(L10n::t('Permission denied.') . EOL); + return Login::form(); + } + + if ($a->argc == 3) { + $contact_id = intval($a->argv[1]); + if (!$contact_id) { + return; + } + + $cmd = $a->argv[2]; + + $orig_record = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => [0, local_user()], 'self' => false]); + if (!DBA::isResult($orig_record)) { + notice(L10n::t('Could not access contact record.') . EOL); + goaway('contacts'); + return; // NOTREACHED + } + + if ($cmd === 'update' && ($orig_record['uid'] != 0)) { + self::_contact_update($contact_id); + goaway('contacts/' . $contact_id); + // NOTREACHED + } + + if ($cmd === 'updateprofile' && ($orig_record['uid'] != 0)) { + self::_contact_update_profile($contact_id); + goaway('crepair/' . $contact_id); + // NOTREACHED + } + + if ($cmd === 'block') { + self::_contact_block($contact_id); + + $blocked = Contact::isBlockedByUser($contact_id, local_user()); + info(($blocked ? L10n::t('Contact has been blocked') : L10n::t('Contact has been unblocked')) . EOL); + + goaway('contacts/' . $contact_id); + return; // NOTREACHED + } + + if ($cmd === 'ignore') { + self::_contact_ignore($contact_id); + + $ignored = Contact::isIgnoredByUser($contact_id, local_user()); + info(($ignored ? L10n::t('Contact has been ignored') : L10n::t('Contact has been unignored')) . EOL); + + goaway('contacts/' . $contact_id); + return; // NOTREACHED + } + + if ($cmd === 'archive' && ($orig_record['uid'] != 0)) { + $r = self::_contact_archive($contact_id, $orig_record); + if ($r) { + $archived = (($orig_record['archive']) ? 0 : 1); + info((($archived) ? L10n::t('Contact has been archived') : L10n::t('Contact has been unarchived')) . EOL); + } + + goaway('contacts/' . $contact_id); + return; // NOTREACHED + } + + if ($cmd === 'drop' && ($orig_record['uid'] != 0)) { + // Check if we should do HTML-based delete confirmation + if (x($_REQUEST, 'confirm')) { + //
can't take arguments in its "action" parameter + // so add any arguments as hidden inputs + $query = explode_querystring($a->query_string); + $inputs = []; + foreach ($query['args'] as $arg) { + if (strpos($arg, 'confirm=') === false) { + $arg_parts = explode('=', $arg); + $inputs[] = ['name' => $arg_parts[0], 'value' => $arg_parts[1]]; + } + } + + $a->page['aside'] = ''; + + return replace_macros(get_markup_template('contact_drop_confirm.tpl'), [ + '$header' => L10n::t('Drop contact'), + '$contact' => self::_contact_detail_for_template($orig_record), + '$method' => 'get', + '$message' => L10n::t('Do you really want to delete this contact?'), + '$extra_inputs' => $inputs, + '$confirm' => L10n::t('Yes'), + '$confirm_url' => $query['base'], + '$confirm_name' => 'confirmed', + '$cancel' => L10n::t('Cancel'), + ]); + } + // Now check how the user responded to the confirmation query + if (x($_REQUEST, 'canceled')) { + goaway('contacts'); + } + + self::_contact_drop($orig_record); + info(L10n::t('Contact has been removed.') . EOL); + + goaway('contacts'); + return; // NOTREACHED + } + if ($cmd === 'posts') { + return self::contact_posts($a, $contact_id); + } + if ($cmd === 'conversations') { + return self::contact_conversations($a, $contact_id, $update); + } + } + + $_SESSION['return_url'] = $a->query_string; + + if ((x($a->data, 'contact')) && (is_array($a->data['contact']))) { + $contact_id = $a->data['contact']['id']; + $contact = $a->data['contact']; + + $a->page['htmlhead'] .= replace_macros(get_markup_template('contact_head.tpl'), [ + '$baseurl' => System::baseUrl(true), + ]); + + $contact['blocked'] = Contact::isBlockedByUser($contact['id'], local_user()); + $contact['readonly'] = Contact::isIgnoredByUser($contact['id'], local_user()); + + $dir_icon = ''; + $relation_text = ''; + switch ($contact['rel']) { + case Contact::FRIEND: + $dir_icon = 'images/lrarrow.gif'; + $relation_text = L10n::t('You are mutual friends with %s'); + break; + + case Contact::FOLLOWER; + $dir_icon = 'images/larrow.gif'; + $relation_text = L10n::t('You are sharing with %s'); + break; + + case Contact::SHARING; + $dir_icon = 'images/rarrow.gif'; + $relation_text = L10n::t('%s is sharing with you'); + break; + + default: + break; + } + + if ($contact['uid'] == 0) { + $relation_text = ''; + } + + if (!in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])) { + $relation_text = ""; + } + + $relation_text = sprintf($relation_text, htmlentities($contact['name'])); + + $url = Contact::magicLink($contact['url']); + if (strpos($url, 'redir/') === 0) { + $sparkle = ' class="sparkle" '; + } else { + $sparkle = ''; + } + + $insecure = L10n::t('Private communications are not available for this contact.'); + + $last_update = (($contact['last-update'] <= NULL_DATE) ? L10n::t('Never') : DateTimeFormat::local($contact['last-update'], 'D, j M Y, g:i A')); + + if ($contact['last-update'] > NULL_DATE) { + $last_update .= ' ' . (($contact['last-update'] <= $contact['success_update']) ? L10n::t("\x28Update was successful\x29") : L10n::t("\x28Update was not successful\x29")); + } + $lblsuggest = (($contact['network'] === Protocol::DFRN) ? L10n::t('Suggest friends') : ''); + + $poll_enabled = in_array($contact['network'], [Protocol::DFRN, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL]); + + $nettype = L10n::t('Network type: %s', ContactSelector::networkToName($contact['network'], $contact["url"])); + + // tabs + $tab_str = self::contacts_tab($a, $contact, 3); + + $lost_contact = (($contact['archive'] && $contact['term-date'] > NULL_DATE && $contact['term-date'] < DateTimeFormat::utcNow()) ? L10n::t('Communications lost with this contact!') : ''); + + $fetch_further_information = null; + if ($contact['network'] == Protocol::FEED) { + $fetch_further_information = [ + 'fetch_further_information', + L10n::t('Fetch further information for feeds'), + $contact['fetch_further_information'], + L10n::t("Fetch information like preview pictures, title and teaser from the feed item. You can activate this if the feed doesn't contain much text. Keywords are taken from the meta header in the feed item and are posted as hash tags."), + ['0' => L10n::t('Disabled'), + '1' => L10n::t('Fetch information'), + '3' => L10n::t('Fetch keywords'), + '2' => L10n::t('Fetch information and keywords') + ] + ]; + } + + $poll_interval = null; + if (in_array($contact['network'], [Protocol::FEED, Protocol::MAIL])) { + $poll_interval = ContactSelector::pollInterval($contact['priority'], (!$poll_enabled)); + } + + $profile_select = null; + if ($contact['network'] == Protocol::DFRN) { + $profile_select = ContactSelector::profileAssign($contact['profile-id'], (($contact['network'] !== Protocol::DFRN) ? true : false)); + } + + /// @todo Only show the following link with DFRN when the remote version supports it + $follow = ''; + $follow_text = ''; + if (in_array($contact['rel'], [Contact::FRIEND, Contact::SHARING])) { + if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) { + $follow = System::baseUrl(true) . "/unfollow?url=" . urlencode($contact["url"]); + $follow_text = L10n::t("Disconnect/Unfollow"); + } + } else { + $follow = System::baseUrl(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::contact_actions($contact); + + if ($contact['uid'] != 0) { + $lbl_vis1 = L10n::t('Profile Visibility'); + $lbl_info1 = L10n::t('Contact Information / Notes'); + $contact_settings_label = L10n::t('Contact Settings'); + } else { + $lbl_vis1 = null; + $lbl_info1 = null; + $contact_settings_label = null; + } + + $tpl = get_markup_template("contact_edit.tpl"); + $o .= replace_macros($tpl, [ + '$header' => L10n::t("Contact"), + '$tab_str' => $tab_str, + '$submit' => L10n::t('Submit'), + '$lbl_vis1' => $lbl_vis1, + '$lbl_vis2' => L10n::t('Please choose the profile you would like to display to %s when viewing your profile securely.', $contact['name']), + '$lbl_info1' => $lbl_info1, + '$lbl_info2' => L10n::t('Their personal note'), + '$reason' => trim(notags($contact['reason'])), + '$infedit' => L10n::t('Edit contact notes'), + '$common_link' => 'common/loc/' . local_user() . '/' . $contact['id'], + '$relation_text' => $relation_text, + '$visit' => L10n::t('Visit %s\'s profile [%s]', $contact['name'], $contact['url']), + '$blockunblock' => L10n::t('Block/Unblock contact'), + '$ignorecont' => L10n::t('Ignore contact'), + '$lblcrepair' => L10n::t("Repair URL settings"), + '$lblrecent' => L10n::t('View conversations'), + '$lblsuggest' => $lblsuggest, + '$nettype' => $nettype, + '$poll_interval' => $poll_interval, + '$poll_enabled' => $poll_enabled, + '$lastupdtext' => L10n::t('Last update:'), + '$lost_contact' => $lost_contact, + '$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')), + '$ignore_text' => ($contact['readonly'] ? L10n::t('Unignore') : L10n::t('Ignore')), + '$insecure' => (in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::MAIL, Protocol::DIASPORA]) ? '' : $insecure), + '$info' => $contact['info'], + '$cinfo' => ['info', '', $contact['info'], ''], + '$blocked' => ($contact['blocked'] ? L10n::t('Currently blocked') : ''), + '$ignored' => ($contact['readonly'] ? L10n::t('Currently ignored') : ''), + '$archived' => ($contact['archive'] ? L10n::t('Currently archived') : ''), + '$pending' => ($contact['pending'] ? L10n::t('Awaiting connection acknowledge') : ''), + '$hidden' => ['hidden', L10n::t('Hide this contact from others'), ($contact['hidden'] == 1), L10n::t('Replies/likes to your public posts may still be visible')], + '$notify' => ['notify', L10n::t('Notification for new posts'), ($contact['notify_new_posts'] == 1), L10n::t('Send a notification of every new post of this contact')], + '$fetch_further_information' => $fetch_further_information, + '$ffi_keyword_blacklist' => $contact['ffi_keyword_blacklist'], + '$ffi_keyword_blacklist' => ['ffi_keyword_blacklist', L10n::t('Blacklisted keywords'), $contact['ffi_keyword_blacklist'], L10n::t('Comma separated list of keywords that should not be converted to hashtags, when "Fetch information and keywords" is selected')], + '$photo' => $contact['photo'], + '$name' => htmlentities($contact['name']), + '$dir_icon' => $dir_icon, + '$sparkle' => $sparkle, + '$url' => $url, + '$profileurllabel' => L10n::t('Profile URL'), + '$profileurl' => $contact['url'], + '$account_type' => Contact::getAccountType($contact), + '$location' => BBCode::convert($contact["location"]), + '$location_label' => L10n::t("Location:"), + '$xmpp' => BBCode::convert($contact["xmpp"]), + '$xmpp_label' => L10n::t("XMPP:"), + '$about' => BBCode::convert($contact["about"], false), + '$about_label' => L10n::t("About:"), + '$keywords' => $contact["keywords"], + '$keywords_label' => L10n::t("Tags:"), + '$contact_action_button' => L10n::t("Actions"), + '$contact_actions' => $contact_actions, + '$contact_status' => L10n::t("Status"), + '$contact_settings_label' => $contact_settings_label, + '$contact_profile_label' => L10n::t("Profile"), + ]); + + $arr = ['contact' => $contact, 'output' => $o]; + + Addon::callHooks('contact_edit', $arr); + + return $arr['output']; + } + + $blocked = false; + $hidden = false; + $ignored = false; + $archived = false; + $all = false; + + if (($a->argc == 2) && ($a->argv[1] === 'all')) { + $sql_extra = ''; + $all = true; + } elseif (($a->argc == 2) && ($a->argv[1] === 'blocked')) { + $sql_extra = " AND `blocked` = 1 "; + $blocked = true; + } elseif (($a->argc == 2) && ($a->argv[1] === 'hidden')) { + $sql_extra = " AND `hidden` = 1 "; + $hidden = true; + } elseif (($a->argc == 2) && ($a->argv[1] === 'ignored')) { + $sql_extra = " AND `readonly` = 1 "; + $ignored = true; + } elseif (($a->argc == 2) && ($a->argv[1] === 'archived')) { + $sql_extra = " AND `archive` = 1 "; + $archived = true; + } else { + $sql_extra = " AND `blocked` = 0 "; + } + + $sql_extra .= sprintf(" AND `network` != '%s' ", Protocol::PHANTOM); + + $search = x($_GET, 'search') ? notags(trim($_GET['search'])) : ''; + $nets = x($_GET, 'nets' ) ? notags(trim($_GET['nets'])) : ''; + + $tabs = [ + [ + 'label' => L10n::t('Suggestions'), + 'url' => 'suggest', + 'sel' => '', + 'title' => L10n::t('Suggest potential friends'), + 'id' => 'suggestions-tab', + 'accesskey' => 'g', + ], + [ + 'label' => L10n::t('All Contacts'), + 'url' => 'contacts/all', + 'sel' => ($all) ? 'active' : '', + 'title' => L10n::t('Show all contacts'), + 'id' => 'showall-tab', + 'accesskey' => 'l', + ], + [ + 'label' => L10n::t('Unblocked'), + 'url' => 'contacts', + 'sel' => ((!$all) && (!$blocked) && (!$hidden) && (!$search) && (!$nets) && (!$ignored) && (!$archived)) ? 'active' : '', + 'title' => L10n::t('Only show unblocked contacts'), + 'id' => 'showunblocked-tab', + 'accesskey' => 'o', + ], + [ + 'label' => L10n::t('Blocked'), + 'url' => 'contacts/blocked', + 'sel' => ($blocked) ? 'active' : '', + 'title' => L10n::t('Only show blocked contacts'), + 'id' => 'showblocked-tab', + 'accesskey' => 'b', + ], + [ + 'label' => L10n::t('Ignored'), + 'url' => 'contacts/ignored', + 'sel' => ($ignored) ? 'active' : '', + 'title' => L10n::t('Only show ignored contacts'), + 'id' => 'showignored-tab', + 'accesskey' => 'i', + ], + [ + 'label' => L10n::t('Archived'), + 'url' => 'contacts/archived', + 'sel' => ($archived) ? 'active' : '', + 'title' => L10n::t('Only show archived contacts'), + 'id' => 'showarchived-tab', + 'accesskey' => 'y', + ], + [ + 'label' => L10n::t('Hidden'), + 'url' => 'contacts/hidden', + 'sel' => ($hidden) ? 'active' : '', + 'title' => L10n::t('Only show hidden contacts'), + 'id' => 'showhidden-tab', + 'accesskey' => 'h', + ], + ]; + + $tab_tpl = get_markup_template('common_tabs.tpl'); + $t = replace_macros($tab_tpl, ['$tabs' => $tabs]); + + $total = 0; + $searching = false; + $search_hdr = null; + if ($search) { + $searching = true; + $search_hdr = $search; + $search_txt = DBA::escape(protect_sprintf(preg_quote($search))); + $sql_extra .= " AND (name REGEXP '$search_txt' OR url REGEXP '$search_txt' OR nick REGEXP '$search_txt') "; + } + + if ($nets) { + $sql_extra .= sprintf(" AND network = '%s' ", DBA::escape($nets)); + } + + $sql_extra2 = ((($sort_type > 0) && ($sort_type <= 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 ", + intval($_SESSION['uid']) + ); + if (DBA::isResult($r)) { + $a->set_pager_total($r[0]['total']); + $total = $r[0]['total']; + } + + $sql_extra3 = Widget::unavailableNetworks(); + + $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 ", + intval($_SESSION['uid']), + intval($a->pager['start']), + intval($a->pager['itemspage']) + ); + if (DBA::isResult($r)) { + foreach ($r as $rr) { + $rr['blocked'] = Contact::isBlockedByUser($rr['id'], local_user()); + $rr['readonly'] = Contact::isIgnoredByUser($rr['id'], local_user()); + $contacts[] = self::_contact_detail_for_template($rr); + } + } + + $tpl = get_markup_template("contacts-template.tpl"); + $o .= replace_macros($tpl, [ + '$baseurl' => System::baseUrl(), + '$header' => L10n::t('Contacts') . (($nets) ? ' - ' . ContactSelector::networkToName($nets) : ''), + '$tabs' => $t, + '$total' => $total, + '$search' => $search_hdr, + '$desc' => L10n::t('Search your contacts'), + '$finding' => $searching ? L10n::t('Results for: %s', $search) : "", + '$submit' => L10n::t('Find'), + '$cmd' => $a->cmd, + '$contacts' => $contacts, + '$contact_drop_confirm' => L10n::t('Do you really want to delete this contact?'), + 'multiselect' => 1, + '$batch_actions' => [ + 'contacts_batch_update' => L10n::t('Update'), + 'contacts_batch_block' => L10n::t('Block') . "/" . L10n::t("Unblock"), + "contacts_batch_ignore" => L10n::t('Ignore') . "/" . L10n::t("Unignore"), + "contacts_batch_archive" => L10n::t('Archive') . "/" . L10n::t("Unarchive"), + "contacts_batch_drop" => L10n::t('Delete'), + ], + '$h_batch_actions' => L10n::t('Batch Actions'), + '$paginate' => paginate($a), + ]); + + return $o; + } + + /** + * @brief List of pages for the Contact TabBar + * + * Available Pages are 'Status', 'Profile', 'Contacts' and 'Common Friends' + * + * @param App $a + * @param array $contact The contact array + * @param int $active_tab 1 if tab should be marked as active + * + * @return string + */ + public static function contacts_tab($a, $contact, $active_tab) + { + // tabs + $tabs = [ + [ + 'label' => L10n::t('Status'), + 'url' => "contacts/" . $contact['id'] . "/conversations", + 'sel' => (($active_tab == 1) ? 'active' : ''), + 'title' => L10n::t('Conversations started by this contact'), + 'id' => 'status-tab', + 'accesskey' => 'm', + ], + [ + 'label' => L10n::t('Posts and Comments'), + 'url' => "contacts/" . $contact['id'] . "/posts", + 'sel' => (($active_tab == 2) ? 'active' : ''), + 'title' => L10n::t('Status Messages and Posts'), + 'id' => 'posts-tab', + 'accesskey' => 'p', + ], + [ + 'label' => L10n::t('Profile'), + 'url' => "contacts/" . $contact['id'], + 'sel' => (($active_tab == 3) ? 'active' : ''), + 'title' => L10n::t('Profile Details'), + 'id' => 'profile-tab', + 'accesskey' => 'o', + ] + ]; + + // Show this tab only if there is visible friend list + $x = GContact::countAllFriends(local_user(), $contact['id']); + if ($x) { + $tabs[] = ['label' => L10n::t('Contacts'), + 'url' => "allfriends/" . $contact['id'], + 'sel' => (($active_tab == 4) ? 'active' : ''), + 'title' => L10n::t('View all contacts'), + 'id' => 'allfriends-tab', + 'accesskey' => 't']; + } + + // Show this tab only if there is visible common friend list + $common = GContact::countCommonFriends(local_user(), $contact['id']); + if ($common) { + $tabs[] = ['label' => L10n::t('Common Friends'), + 'url' => "common/loc/" . local_user() . "/" . $contact['id'], + 'sel' => (($active_tab == 5) ? 'active' : ''), + 'title' => L10n::t('View all common friends'), + 'id' => 'common-loc-tab', + 'accesskey' => 'd' + ]; + } + + if (!empty($contact['uid'])) { + $tabs[] = ['label' => L10n::t('Advanced'), + 'url' => 'crepair/' . $contact['id'], + 'sel' => (($active_tab == 6) ? 'active' : ''), + 'title' => L10n::t('Advanced Contact Settings'), + 'id' => 'advanced-tab', + 'accesskey' => 'r' + ]; + } + + $tab_tpl = get_markup_template('common_tabs.tpl'); + $tab_str = replace_macros($tab_tpl, ['$tabs' => $tabs]); + + return $tab_str; + } + + private static function contact_conversations($a, $contact_id, $update) + { + $o = ''; + + if (!$update) { + // We need the editor here to be able to reshare an item. + if (local_user()) { + $x = [ + 'is_owner' => true, + 'allow_location' => $a->user['allow_location'], + '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), + 'bang' => '', + 'visitor' => 'block', + 'profile_uid' => local_user(), + ]; + $o = status_editor($a, $x, 0, true); + } + } + + $contact = DBA::selectFirst('contact', ['uid', 'url', 'id'], ['id' => $contact_id]); + + if (!$update) { + $o .= self::contacts_tab($a, $contact, 1); + } + + if (DBA::isResult($contact)) { + $a->page['aside'] = ""; + + $profiledata = Contact::getDetailsByURL($contact["url"]); + + if (local_user()) { + if (in_array($profiledata["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { + $profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]); + } + } + + Profile::load($a, "", 0, $profiledata, true); + $o .= Contact::getPostsFromUrl($contact["url"], true, $update); + } + + return $o; + } + + public static function contact_posts($a, $contact_id) + { + $contact = DBA::selectFirst('contact', ['uid', 'url', 'id'], ['id' => $contact_id]); + + $o = self::contacts_tab($a, $contact, 2); + + if (DBA::isResult($contact)) { + $a->page['aside'] = ""; + + $profiledata = Contact::getDetailsByURL($contact["url"]); + + if (local_user()) { + if (in_array($profiledata["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { + $profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]); + } + } + + Profile::load($a, "", 0, $profiledata, true); + $o .= Contact::getPostsFromUrl($contact["url"]); + } + + return $o; + } + + public static function _contact_detail_for_template(array $rr) + { + $dir_icon = ''; + $alt_text = ''; + + switch ($rr['rel']) { + case Contact::FRIEND: + $dir_icon = 'images/lrarrow.gif'; + $alt_text = L10n::t('Mutual Friendship'); + break; + + case Contact::FOLLOWER; + $dir_icon = 'images/larrow.gif'; + $alt_text = L10n::t('is a fan of yours'); + break; + + case Contact::SHARING; + $dir_icon = 'images/rarrow.gif'; + $alt_text = L10n::t('you are a fan of'); + break; + + default: + break; + } + + $url = Contact::magicLink($rr['url']); + + if (strpos($url, 'redir/') === 0) { + $sparkle = ' class="sparkle" '; + } else { + $sparkle = ''; + } + + if ($rr['self']) { + $dir_icon = 'images/larrow.gif'; + $alt_text = L10n::t('This is you'); + $url = $rr['url']; + $sparkle = ''; + } + + return [ + 'img_hover' => L10n::t('Visit %s\'s profile [%s]', $rr['name'], $rr['url']), + 'edit_hover' => L10n::t('Edit contact'), + 'photo_menu' => Contact::photoMenu($rr), + 'id' => $rr['id'], + 'alt_text' => $alt_text, + 'dir_icon' => $dir_icon, + 'thumb' => ProxyUtils::proxifyUrl($rr['thumb'], false, ProxyUtils::SIZE_THUMB), + 'name' => htmlentities($rr['name']), + 'username' => htmlentities($rr['name']), + 'account_type' => Contact::getAccountType($rr), + 'sparkle' => $sparkle, + 'itemurl' => (($rr['addr'] != "") ? $rr['addr'] : $rr['url']), + 'url' => $url, + 'network' => ContactSelector::networkToName($rr['network'], $rr['url']), + 'nick' => htmlentities($rr['nick']), + ]; + } + + /** + * @brief Gives a array with actions which can performed to a given contact + * + * This includes actions like e.g. 'block', 'hide', 'archive', 'delete' and others + * + * @param array $contact Data about the Contact + * @return array with contact related actions + */ + private static function contact_actions($contact) + { + $poll_enabled = in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL]); + $contact_actions = []; + + // Provide friend suggestion only for Friendica contacts + if ($contact['network'] === Protocol::DFRN) { + $contact_actions['suggest'] = [ + 'label' => L10n::t('Suggest friends'), + 'url' => 'fsuggest/' . $contact['id'], + 'title' => '', + 'sel' => '', + 'id' => 'suggest', + ]; + } + + if ($poll_enabled) { + $contact_actions['update'] = [ + 'label' => L10n::t('Update now'), + 'url' => 'contacts/' . $contact['id'] . '/update', + 'title' => '', + 'sel' => '', + 'id' => 'update', + ]; + } + + $contact_actions['block'] = [ + 'label' => (intval($contact['blocked']) ? L10n::t('Unblock') : L10n::t('Block')), + 'url' => 'contacts/' . $contact['id'] . '/block', + 'title' => L10n::t('Toggle Blocked status'), + 'sel' => (intval($contact['blocked']) ? 'active' : ''), + 'id' => 'toggle-block', + ]; + + $contact_actions['ignore'] = [ + 'label' => (intval($contact['readonly']) ? L10n::t('Unignore') : L10n::t('Ignore')), + 'url' => 'contacts/' . $contact['id'] . '/ignore', + 'title' => L10n::t('Toggle Ignored status'), + 'sel' => (intval($contact['readonly']) ? 'active' : ''), + 'id' => 'toggle-ignore', + ]; + + if ($contact['uid'] != 0) { + $contact_actions['archive'] = [ + 'label' => (intval($contact['archive']) ? L10n::t('Unarchive') : L10n::t('Archive')), + 'url' => 'contacts/' . $contact['id'] . '/archive', + 'title' => L10n::t('Toggle Archive status'), + 'sel' => (intval($contact['archive']) ? 'active' : ''), + 'id' => 'toggle-archive', + ]; + + $contact_actions['delete'] = [ + 'label' => L10n::t('Delete'), + 'url' => 'contacts/' . $contact['id'] . '/drop', + 'title' => L10n::t('Delete contact'), + 'sel' => '', + 'id' => 'delete', + ]; + } + + return $contact_actions; + } + + +} \ No newline at end of file diff --git a/view/theme/frio/theme.php b/view/theme/frio/theme.php index 18fb98cc9..fb9ac95ce 100644 --- a/view/theme/frio/theme.php +++ b/view/theme/frio/theme.php @@ -17,6 +17,7 @@ use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\Model\Profile; +use Friendica\Module\Contacts; $frio = 'view/theme/frio'; @@ -297,8 +298,6 @@ function frio_remote_nav($a, &$nav) */ function frio_acl_lookup(App $a, &$results) { - require_once 'mod/contacts.php'; - $nets = x($_GET, 'nets') ? notags(trim($_GET['nets'])) : ''; // we introduce a new search type, r should do the same query like it's @@ -334,7 +333,7 @@ function frio_acl_lookup(App $a, &$results) if (DBA::isResult($r)) { foreach ($r as $rr) { - $contacts[] = _contact_detail_for_template($rr); + $contacts[] = Contacts::_contact_detail_for_template($rr); } } From ba95487abf3f56edd0ea862fd7859303ceedab46 Mon Sep 17 00:00:00 2001 From: Jonny Tischbein Date: Thu, 11 Oct 2018 23:41:27 +0200 Subject: [PATCH 2/9] Upate Contacts module file --- src/Module/Contacts.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Module/Contacts.php b/src/Module/Contacts.php index a017b55b1..34cc18c3e 100644 --- a/src/Module/Contacts.php +++ b/src/Module/Contacts.php @@ -25,9 +25,9 @@ use Friendica\Core\ACL; use Friendica\Module\Login; /** - * + * Manages and show Contacts and their content * - * + * @brief manages contacts */ class Contacts extends BaseModule { @@ -184,7 +184,7 @@ class Contacts extends BaseModule } if ($a->argv[1] === "batch") { - contacts_batch_actions($a); + self::contacts_batch_actions($a); return; } @@ -805,7 +805,7 @@ class Contacts extends BaseModule intval($_SESSION['uid']) ); if (DBA::isResult($r)) { - $a->set_pager_total($r[0]['total']); + $a->setPagerTotal($r[0]['total']); $total = $r[0]['total']; } @@ -980,7 +980,7 @@ class Contacts extends BaseModule return $o; } - public static function contact_posts($a, $contact_id) + private static function contact_posts($a, $contact_id) { $contact = DBA::selectFirst('contact', ['uid', 'url', 'id'], ['id' => $contact_id]); @@ -1134,5 +1134,4 @@ class Contacts extends BaseModule return $contact_actions; } - } \ No newline at end of file From 93ab82b7f02e9ea1c8fc072e7b3891d0e9f0d617 Mon Sep 17 00:00:00 2001 From: Jonny Tischbein Date: Thu, 11 Oct 2018 23:45:01 +0200 Subject: [PATCH 3/9] Rename Contacts:content function --- mod/update_contacts.php | 2 +- src/Module/Contacts.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/update_contacts.php b/mod/update_contacts.php index 1ad5cd4a3..33ba85055 100644 --- a/mod/update_contacts.php +++ b/mod/update_contacts.php @@ -14,7 +14,7 @@ function update_contacts_content(App $a) echo "
"; if ($_GET["force"] == 1) { - $text = Contacts::contacts_content($a, true); + $text = Contacts::content($a, true); } else { $text = ''; } diff --git a/src/Module/Contacts.php b/src/Module/Contacts.php index 34cc18c3e..8d26b3eb5 100644 --- a/src/Module/Contacts.php +++ b/src/Module/Contacts.php @@ -379,7 +379,7 @@ class Contacts extends BaseModule Contact::remove($orig_record['id']); } - public static function contacts_content($update = 0) + public static function content($update = 0) { $a = self::getApp(); $sort_type = 0; From cdbddd0103d80e8ad935f21134f26e8c5872357a Mon Sep 17 00:00:00 2001 From: Jonny Tischbein Date: Sat, 13 Oct 2018 11:23:52 +0200 Subject: [PATCH 4/9] Renaming functions and class --- mod/allfriends.php | 23 +- mod/common.php | 31 +- mod/contacts.php | 1123 ------------------------------------- mod/crepair.php | 9 +- mod/dirfind.php | 24 +- mod/group.php | 15 +- src/Module/Contacts.php | 69 ++- view/theme/frio/theme.php | 2 +- 8 files changed, 84 insertions(+), 1212 deletions(-) delete mode 100644 mod/contacts.php diff --git a/mod/allfriends.php b/mod/allfriends.php index 190ab12a6..aa5fb0a67 100644 --- a/mod/allfriends.php +++ b/mod/allfriends.php @@ -8,11 +8,10 @@ use Friendica\Content\ContactSelector; use Friendica\Core\L10n; use Friendica\Core\System; use Friendica\Database\DBA; -use Friendica\Model\Contact; -use Friendica\Model\GContact; -use Friendica\Model\Profile; +use Friendica\Model;\ +use Friendica\Module\Contact; use Friendica\Util\Proxy as ProxyUtils; -use Friendica\Module\Contacts; + require_once 'include/dba.php'; @@ -42,13 +41,13 @@ function allfriends_content(App $a) } $a->page['aside'] = ""; - Profile::load($a, "", 0, Contact::getDetailsByURL($contact["url"])); + Model\Profile::load($a, "", 0, Model\Contact::getDetailsByURL($contact["url"])); - $total = GContact::countAllFriends(local_user(), $cid); + $total = Model\GContact::countAllFriends(local_user(), $cid); $a->setPagerTotal($total); - $r = GContact::allFriends(local_user(), $cid, $a->pager['start'], $a->pager['itemspage']); + $r = Model\GContact::allFriends(local_user(), $cid, $a->pager['start'], $a->pager['itemspage']); if (!DBA::isResult($r)) { $o .= L10n::t('No friends to display.'); return $o; @@ -59,7 +58,7 @@ function allfriends_content(App $a) $entries = []; foreach ($r as $rr) { //get further details of the contact - $contact_details = Contact::getDetailsByURL($rr['url'], $uid, $rr); + $contact_details = Model\Contact::getDetailsByURL($rr['url'], $uid, $rr); $photo_menu = ''; @@ -68,11 +67,11 @@ function allfriends_content(App $a) // If the contact is not common to the user, Connect/Follow' will be added to the photo menu if ($rr['cid']) { $rr['id'] = $rr['cid']; - $photo_menu = Contact::photoMenu($rr); + $photo_menu = Model\Contact::photoMenu($rr); } else { $connlnk = System::baseUrl() . '/follow/?url=' . $rr['url']; $photo_menu = [ - 'profile' => [L10n::t("View Profile"), Contact::magicLink($rr['url'])], + 'profile' => [L10n::t("View Profile"), Model\Contact::magicLink($rr['url'])], 'follow' => [L10n::t("Connect/Follow"), $connlnk] ]; } @@ -86,7 +85,7 @@ function allfriends_content(App $a) 'details' => $contact_details['location'], 'tags' => $contact_details['keywords'], 'about' => $contact_details['about'], - 'account_type' => Contact::getAccountType($contact_details), + 'account_type' => Model\Contact::getAccountType($contact_details), 'network' => ContactSelector::networkToName($contact_details['network'], $contact_details['url']), 'photo_menu' => $photo_menu, 'conntxt' => L10n::t('Connect'), @@ -96,7 +95,7 @@ function allfriends_content(App $a) $entries[] = $entry; } - $tab_str = Contacts::contacts_tab($a, $contact, 4); + $tab_str = Contact::getTabsHTML($a, $contact, 4); $tpl = get_markup_template('viewcontact_template.tpl'); diff --git a/mod/common.php b/mod/common.php index 13e5bf092..c011c6d38 100644 --- a/mod/common.php +++ b/mod/common.php @@ -7,11 +7,10 @@ use Friendica\App; use Friendica\Content\ContactSelector; use Friendica\Core\L10n; use Friendica\Database\DBA; -use Friendica\Model\Contact; -use Friendica\Model\GContact; -use Friendica\Model\Profile; +use Friendica\Model; +use Friendica\Module\Contact; use Friendica\Util\Proxy as ProxyUtils; -use Friendica\Module\Contacts; + require_once 'include/dba.php'; @@ -42,7 +41,7 @@ function common_content(App $a) if (DBA::isResult($contact)) { $a->page['aside'] = ""; - Profile::load($a, "", 0, Contact::getDetailsByURL($contact["url"])); + Model\Profile::load($a, "", 0,Model\Contact::getDetailsByURL($contact["url"])); } } else { $contact = DBA::selectFirst('contact', ['name', 'url', 'photo', 'uid', 'id'], ['self' => true, 'uid' => $uid]); @@ -65,12 +64,12 @@ function common_content(App $a) return; } - if (!$cid && Profile::getMyURL()) { - $contact = DBA::selectFirst('contact', ['id'], ['nurl' => normalise_link(Profile::getMyURL()), 'uid' => $uid]); + if (!$cid &&Model\Profile::getMyURL()) { + $contact = DBA::selectFirst('contact', ['id'], ['nurl' => normalise_link(Model\Profile::getMyURL()), 'uid' => $uid]); if (DBA::isResult($contact)) { $cid = $contact['id']; } else { - $gcontact = DBA::selectFirst('gcontact', ['id'], ['nurl' => normalise_link(Profile::getMyURL())]); + $gcontact = DBA::selectFirst('gcontact', ['id'], ['nurl' => normalise_link(Model\Profile::getMyURL())]); if (DBA::isResult($gcontact)) { $zcid = $gcontact['id']; } @@ -82,9 +81,9 @@ function common_content(App $a) } if ($cid) { - $t = GContact::countCommonFriends($uid, $cid); + $t =Model\GContact::countCommonFriends($uid, $cid); } else { - $t = GContact::countCommonFriendsZcid($uid, $zcid); + $t =Model\GContact::countCommonFriendsZcid($uid, $zcid); } if ($t > 0) { @@ -95,9 +94,9 @@ function common_content(App $a) } if ($cid) { - $r = GContact::commonFriends($uid, $cid, $a->pager['start'], $a->pager['itemspage']); + $r =Model\GContact::commonFriends($uid, $cid, $a->pager['start'], $a->pager['itemspage']); } else { - $r = GContact::commonFriendsZcid($uid, $zcid, $a->pager['start'], $a->pager['itemspage']); + $r =Model\GContact::commonFriendsZcid($uid, $zcid, $a->pager['start'], $a->pager['itemspage']); } if (!DBA::isResult($r)) { @@ -109,13 +108,13 @@ function common_content(App $a) $entries = []; foreach ($r as $rr) { //get further details of the contact - $contact_details = Contact::getDetailsByURL($rr['url'], $uid); + $contact_details =Model\Contact::getDetailsByURL($rr['url'], $uid); // $rr['id'] is needed to use contact_photo_menu() /// @TODO Adding '/" here avoids E_NOTICE on missing constants $rr['id'] = $rr['cid']; - $photo_menu = Contact::photoMenu($rr); + $photo_menu =Model\Contact::photoMenu($rr); $entry = [ 'url' => $rr['url'], @@ -126,7 +125,7 @@ function common_content(App $a) 'details' => $contact_details['location'], 'tags' => $contact_details['keywords'], 'about' => $contact_details['about'], - 'account_type' => Contact::getAccountType($contact_details), + 'account_type' =>Model\Contact::getAccountType($contact_details), 'network' => ContactSelector::networkToName($contact_details['network'], $contact_details['url']), 'photo_menu' => $photo_menu, 'id' => ++$id, @@ -137,7 +136,7 @@ function common_content(App $a) $title = ''; $tab_str = ''; if ($cmd === 'loc' && $cid && local_user() == $uid) { - $tab_str = Contacts::contacts_tab($a, $contact, 4); + $tab_str = Contact::getTabsHTML($a, $contact, 4); } else { $title = L10n::t('Common Friends'); } diff --git a/mod/contacts.php b/mod/contacts.php deleted file mode 100644 index 4e149ab74..000000000 --- a/mod/contacts.php +++ /dev/null @@ -1,1123 +0,0 @@ -page, 'aside')) { - $a->page['aside'] = ''; - } - - $contact_id = null; - $contact = null; - if ((($a->argc == 2) && intval($a->argv[1])) || (($a->argc == 3) && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations']))) { - $contact_id = intval($a->argv[1]); - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]); - - if (!DBA::isResult($contact)) { - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => 0]); - } - - // Don't display contacts that are about to be deleted - if ($contact['network'] == Protocol::PHANTOM) { - $contact = false; - } - } - - if (DBA::isResult($contact)) { - if ($contact['self']) { - if (($a->argc == 3) && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations'])) { - goaway('profile/' . $contact['nick']); - } else { - goaway('profile/' . $contact['nick'] . '?tab=profile'); - } - } - - $a->data['contact'] = $contact; - - if (($a->data['contact']['network'] != "") && ($a->data['contact']['network'] != Protocol::DFRN)) { - $networkname = format_network_name($a->data['contact']['network'], $a->data['contact']['url']); - } else { - $networkname = ''; - } - - /// @TODO Add nice spaces - $vcard_widget = replace_macros(get_markup_template("vcard-widget.tpl"), [ - '$name' => htmlentities($a->data['contact']['name']), - '$photo' => $a->data['contact']['photo'], - '$url' => Contact::MagicLink($a->data['contact']['url']), - '$addr' => (($a->data['contact']['addr'] != "") ? ($a->data['contact']['addr']) : ""), - '$network_name' => $networkname, - '$network' => L10n::t('Network:'), - '$account_type' => Contact::getAccountType($a->data['contact']) - ]); - - $findpeople_widget = ''; - $follow_widget = ''; - $networks_widget = ''; - } else { - $vcard_widget = ''; - $networks_widget = Widget::networks('contacts', $nets); - if (isset($_GET['add'])) { - $follow_widget = Widget::follow($_GET['add']); - } else { - $follow_widget = Widget::follow(); - } - - $findpeople_widget = Widget::findPeople(); - } - - if ($contact['uid'] != 0) { - $groups_widget = Group::sidebarWidget('contacts', 'group', 'full', 'everyone', $contact_id); - } else { - $groups_widget = null; - } - - $a->page['aside'] .= replace_macros(get_markup_template("contacts-widget-sidebar.tpl"), [ - '$vcard_widget' => $vcard_widget, - '$findpeople_widget' => $findpeople_widget, - '$follow_widget' => $follow_widget, - '$groups_widget' => $groups_widget, - '$networks_widget' => $networks_widget - ]); - - $base = System::baseUrl(); - $tpl = get_markup_template("contacts-head.tpl"); - $a->page['htmlhead'] .= replace_macros($tpl, [ - '$baseurl' => System::baseUrl(true), - '$base' => $base - ]); -} - -function contacts_batch_actions(App $a) -{ - if (empty($_POST['contact_batch']) || !is_array($_POST['contact_batch'])) { - return; - } - - $contacts_id = $_POST['contact_batch']; - - $orig_records = q("SELECT * FROM `contact` WHERE `id` IN (%s) AND `uid` = %d AND `self` = 0", - implode(",", $contacts_id), - intval(local_user()) - ); - - $count_actions = 0; - foreach ($orig_records as $orig_record) { - $contact_id = $orig_record['id']; - if (x($_POST, 'contacts_batch_update')) { - _contact_update($contact_id); - $count_actions++; - } - if (x($_POST, 'contacts_batch_block')) { - _contact_block($contact_id); - $count_actions++; - } - if (x($_POST, 'contacts_batch_ignore')) { - _contact_ignore($contact_id); - $count_actions++; - } - if (x($_POST, 'contacts_batch_archive')) { - $r = _contact_archive($contact_id, $orig_record); - if ($r) { - $count_actions++; - } - } - if (x($_POST, 'contacts_batch_drop')) { - _contact_drop($orig_record); - $count_actions++; - } - } - if ($count_actions > 0) { - info(L10n::tt("%d contact edited.", "%d contacts edited.", $count_actions)); - } - - goaway('contacts'); -} - -function contacts_post(App $a) -{ - if (!local_user()) { - return; - } - - if ($a->argv[1] === "batch") { - contacts_batch_actions($a); - return; - } - - $contact_id = intval($a->argv[1]); - if (!$contact_id) { - return; - } - - if (!DBA::exists('contact', ['id' => $contact_id, 'uid' => local_user()])) { - notice(L10n::t('Could not access contact record.') . EOL); - goaway('contacts'); - return; // NOTREACHED - } - - Addon::callHooks('contact_edit_post', $_POST); - - $profile_id = intval(defaults($_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); - return; - } - } - - $hidden = intval($_POST['hidden']); - - $notify = intval($_POST['notify']); - - $fetch_further_information = intval(defaults($_POST, 'fetch_further_information', 0)); - - $ffi_keyword_blacklist = escape_tags(trim(defaults($_POST, 'ffi_keyword_blacklist', ''))); - - $priority = intval(defaults($_POST, 'poll', 0)); - if ($priority > 5 || $priority < 0) { - $priority = 0; - } - - $info = escape_tags(trim($_POST['info'])); - - $r = q("UPDATE `contact` SET `profile-id` = %d, `priority` = %d , `info` = '%s', - `hidden` = %d, `notify_new_posts` = %d, `fetch_further_information` = %d, - `ffi_keyword_blacklist` = '%s' WHERE `id` = %d AND `uid` = %d", - intval($profile_id), - intval($priority), - DBA::escape($info), - intval($hidden), - intval($notify), - intval($fetch_further_information), - DBA::escape($ffi_keyword_blacklist), - intval($contact_id), - intval(local_user()) - ); - if (DBA::isResult($r)) { - info(L10n::t('Contact updated.') . EOL); - } else { - notice(L10n::t('Failed to update contact record.') . EOL); - } - - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]); - if (DBA::isResult($contact)) { - $a->data['contact'] = $contact; - } - - return; -} - -/* contact actions */ - -function _contact_update($contact_id) -{ - $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); - if (!DBA::isResult($contact)) { - return; - } - - $uid = $contact["uid"]; - - if ($contact["network"] == Protocol::OSTATUS) { - $result = Contact::createFromProbe($uid, $contact["url"], false, $contact["network"]); - - if ($result['success']) { - q("UPDATE `contact` SET `subhub` = 1 WHERE `id` = %d", intval($contact_id)); - } - } else { - // pull feed and consume it, which should subscribe to the hub. - Worker::add(PRIORITY_HIGH, "OnePoll", $contact_id, "force"); - } -} - -function _contact_update_profile($contact_id) -{ - $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); - 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"]; - $update = []; - - if ($data["network"] == Protocol::OSTATUS) { - $result = Contact::createFromProbe($uid, $data["url"], false); - - if ($result['success']) { - $update["subhub"] = true; - } - } - - foreach ($updatefields AS $field) { - if (isset($data[$field]) && ($data[$field] != "")) { - $update[$field] = $data[$field]; - } - } - - $update["nurl"] = normalise_link($data["url"]); - - $query = ""; - - if (isset($data["priority"]) && ($data["priority"] != 0)) { - $query = "`priority` = " . intval($data["priority"]); - } - - foreach ($update AS $key => $value) { - if ($query != "") { - $query .= ", "; - } - - $query .= "`" . $key . "` = '" . DBA::escape($value) . "'"; - } - - if ($query == "") { - return; - } - - $r = q("UPDATE `contact` SET $query WHERE `id` = %d AND `uid` = %d", - intval($contact_id), - intval(local_user()) - ); - - // Update the entry in the contact table - Contact::updateAvatar($data['photo'], local_user(), $contact_id, true); - - // Update the entry in the gcontact table - GContact::updateFromProbe($data["url"]); -} - -function _contact_block($contact_id) -{ - $blocked = !Contact::isBlockedByUser($contact_id, local_user()); - Contact::setBlockedForUser($contact_id, local_user(), $blocked); -} - -function _contact_ignore($contact_id) -{ - $ignored = !Contact::isIgnoredByUser($contact_id, local_user()); - Contact::setIgnoredForUser($contact_id, local_user(), $ignored); -} - -function _contact_archive($contact_id, $orig_record) -{ - $archived = (($orig_record['archive']) ? 0 : 1); - $r = q("UPDATE `contact` SET `archive` = %d WHERE `id` = %d AND `uid` = %d", - intval($archived), - intval($contact_id), - intval(local_user()) - ); - return DBA::isResult($r); -} - -function _contact_drop($orig_record) -{ - $a = get_app(); - - $r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` - WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1", - intval($a->user['uid']) - ); - if (!DBA::isResult($r)) { - return; - } - - Contact::terminateFriendship($r[0], $orig_record, true); - Contact::remove($orig_record['id']); -} - -function contacts_content(App $a, $update = 0) -{ - $sort_type = 0; - $o = ''; - Nav::setSelected('contacts'); - - if (!local_user()) { - notice(L10n::t('Permission denied.') . EOL); - return Login::form(); - } - - if ($a->argc == 3) { - $contact_id = intval($a->argv[1]); - if (!$contact_id) { - return; - } - - $cmd = $a->argv[2]; - - $orig_record = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => [0, local_user()], 'self' => false]); - if (!DBA::isResult($orig_record)) { - notice(L10n::t('Could not access contact record.') . EOL); - goaway('contacts'); - return; // NOTREACHED - } - - if ($cmd === 'update' && ($orig_record['uid'] != 0)) { - _contact_update($contact_id); - goaway('contacts/' . $contact_id); - // NOTREACHED - } - - if ($cmd === 'updateprofile' && ($orig_record['uid'] != 0)) { - _contact_update_profile($contact_id); - goaway('crepair/' . $contact_id); - // NOTREACHED - } - - if ($cmd === 'block') { - _contact_block($contact_id); - - $blocked = Contact::isBlockedByUser($contact_id, local_user()); - info(($blocked ? L10n::t('Contact has been blocked') : L10n::t('Contact has been unblocked')) . EOL); - - goaway('contacts/' . $contact_id); - return; // NOTREACHED - } - - if ($cmd === 'ignore') { - _contact_ignore($contact_id); - - $ignored = Contact::isIgnoredByUser($contact_id, local_user()); - info(($ignored ? L10n::t('Contact has been ignored') : L10n::t('Contact has been unignored')) . EOL); - - goaway('contacts/' . $contact_id); - return; // NOTREACHED - } - - if ($cmd === 'archive' && ($orig_record['uid'] != 0)) { - $r = _contact_archive($contact_id, $orig_record); - if ($r) { - $archived = (($orig_record['archive']) ? 0 : 1); - info((($archived) ? L10n::t('Contact has been archived') : L10n::t('Contact has been unarchived')) . EOL); - } - - goaway('contacts/' . $contact_id); - return; // NOTREACHED - } - - if ($cmd === 'drop' && ($orig_record['uid'] != 0)) { - // Check if we should do HTML-based delete confirmation - if (x($_REQUEST, 'confirm')) { - // can't take arguments in its "action" parameter - // so add any arguments as hidden inputs - $query = explode_querystring($a->query_string); - $inputs = []; - foreach ($query['args'] as $arg) { - if (strpos($arg, 'confirm=') === false) { - $arg_parts = explode('=', $arg); - $inputs[] = ['name' => $arg_parts[0], 'value' => $arg_parts[1]]; - } - } - - $a->page['aside'] = ''; - - return replace_macros(get_markup_template('contact_drop_confirm.tpl'), [ - '$header' => L10n::t('Drop contact'), - '$contact' => _contact_detail_for_template($orig_record), - '$method' => 'get', - '$message' => L10n::t('Do you really want to delete this contact?'), - '$extra_inputs' => $inputs, - '$confirm' => L10n::t('Yes'), - '$confirm_url' => $query['base'], - '$confirm_name' => 'confirmed', - '$cancel' => L10n::t('Cancel'), - ]); - } - // Now check how the user responded to the confirmation query - if (x($_REQUEST, 'canceled')) { - goaway('contacts'); - } - - _contact_drop($orig_record); - info(L10n::t('Contact has been removed.') . EOL); - - goaway('contacts'); - return; // NOTREACHED - } - if ($cmd === 'posts') { - return contact_posts($a, $contact_id); - } - if ($cmd === 'conversations') { - return contact_conversations($a, $contact_id, $update); - } - } - - $_SESSION['return_url'] = $a->query_string; - - if ((x($a->data, 'contact')) && (is_array($a->data['contact']))) { - $contact_id = $a->data['contact']['id']; - $contact = $a->data['contact']; - - $a->page['htmlhead'] .= replace_macros(get_markup_template('contact_head.tpl'), [ - '$baseurl' => System::baseUrl(true), - ]); - - $contact['blocked'] = Contact::isBlockedByUser($contact['id'], local_user()); - $contact['readonly'] = Contact::isIgnoredByUser($contact['id'], local_user()); - - $dir_icon = ''; - $relation_text = ''; - switch ($contact['rel']) { - case Contact::FRIEND: - $dir_icon = 'images/lrarrow.gif'; - $relation_text = L10n::t('You are mutual friends with %s'); - break; - - case Contact::FOLLOWER; - $dir_icon = 'images/larrow.gif'; - $relation_text = L10n::t('You are sharing with %s'); - break; - - case Contact::SHARING; - $dir_icon = 'images/rarrow.gif'; - $relation_text = L10n::t('%s is sharing with you'); - break; - - default: - break; - } - - if ($contact['uid'] == 0) { - $relation_text = ''; - } - - if (!in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])) { - $relation_text = ""; - } - - $relation_text = sprintf($relation_text, htmlentities($contact['name'])); - - $url = Contact::magicLink($contact['url']); - if (strpos($url, 'redir/') === 0) { - $sparkle = ' class="sparkle" '; - } else { - $sparkle = ''; - } - - $insecure = L10n::t('Private communications are not available for this contact.'); - - $last_update = (($contact['last-update'] <= NULL_DATE) ? L10n::t('Never') : DateTimeFormat::local($contact['last-update'], 'D, j M Y, g:i A')); - - if ($contact['last-update'] > NULL_DATE) { - $last_update .= ' ' . (($contact['last-update'] <= $contact['success_update']) ? L10n::t("\x28Update was successful\x29") : L10n::t("\x28Update was not successful\x29")); - } - $lblsuggest = (($contact['network'] === Protocol::DFRN) ? L10n::t('Suggest friends') : ''); - - $poll_enabled = in_array($contact['network'], [Protocol::DFRN, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL]); - - $nettype = L10n::t('Network type: %s', ContactSelector::networkToName($contact['network'], $contact["url"])); - - // tabs - $tab_str = contacts_tab($a, $contact, 3); - - $lost_contact = (($contact['archive'] && $contact['term-date'] > NULL_DATE && $contact['term-date'] < DateTimeFormat::utcNow()) ? L10n::t('Communications lost with this contact!') : ''); - - $fetch_further_information = null; - if ($contact['network'] == Protocol::FEED) { - $fetch_further_information = [ - 'fetch_further_information', - L10n::t('Fetch further information for feeds'), - $contact['fetch_further_information'], - L10n::t("Fetch information like preview pictures, title and teaser from the feed item. You can activate this if the feed doesn't contain much text. Keywords are taken from the meta header in the feed item and are posted as hash tags."), - ['0' => L10n::t('Disabled'), - '1' => L10n::t('Fetch information'), - '3' => L10n::t('Fetch keywords'), - '2' => L10n::t('Fetch information and keywords') - ] - ]; - } - - $poll_interval = null; - if (in_array($contact['network'], [Protocol::FEED, Protocol::MAIL])) { - $poll_interval = ContactSelector::pollInterval($contact['priority'], (!$poll_enabled)); - } - - $profile_select = null; - if ($contact['network'] == Protocol::DFRN) { - $profile_select = ContactSelector::profileAssign($contact['profile-id'], (($contact['network'] !== Protocol::DFRN) ? true : false)); - } - - /// @todo Only show the following link with DFRN when the remote version supports it - $follow = ''; - $follow_text = ''; - if (in_array($contact['rel'], [Contact::FRIEND, Contact::SHARING])) { - if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) { - $follow = System::baseUrl(true) . "/unfollow?url=" . urlencode($contact["url"]); - $follow_text = L10n::t("Disconnect/Unfollow"); - } - } else { - $follow = System::baseUrl(true) . "/follow?url=" . urlencode($contact["url"]); - $follow_text = L10n::t("Connect/Follow"); - } - - // Load contactact related actions like hide, suggest, delete and others - $contact_actions = contact_actions($contact); - - if ($contact['uid'] != 0) { - $lbl_vis1 = L10n::t('Profile Visibility'); - $lbl_info1 = L10n::t('Contact Information / Notes'); - $contact_settings_label = L10n::t('Contact Settings'); - } else { - $lbl_vis1 = null; - $lbl_info1 = null; - $contact_settings_label = null; - } - - $tpl = get_markup_template("contact_edit.tpl"); - $o .= replace_macros($tpl, [ - '$header' => L10n::t("Contact"), - '$tab_str' => $tab_str, - '$submit' => L10n::t('Submit'), - '$lbl_vis1' => $lbl_vis1, - '$lbl_vis2' => L10n::t('Please choose the profile you would like to display to %s when viewing your profile securely.', $contact['name']), - '$lbl_info1' => $lbl_info1, - '$lbl_info2' => L10n::t('Their personal note'), - '$reason' => trim(notags($contact['reason'])), - '$infedit' => L10n::t('Edit contact notes'), - '$common_link' => 'common/loc/' . local_user() . '/' . $contact['id'], - '$relation_text' => $relation_text, - '$visit' => L10n::t('Visit %s\'s profile [%s]', $contact['name'], $contact['url']), - '$blockunblock' => L10n::t('Block/Unblock contact'), - '$ignorecont' => L10n::t('Ignore contact'), - '$lblcrepair' => L10n::t("Repair URL settings"), - '$lblrecent' => L10n::t('View conversations'), - '$lblsuggest' => $lblsuggest, - '$nettype' => $nettype, - '$poll_interval' => $poll_interval, - '$poll_enabled' => $poll_enabled, - '$lastupdtext' => L10n::t('Last update:'), - '$lost_contact' => $lost_contact, - '$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')), - '$ignore_text' => ($contact['readonly'] ? L10n::t('Unignore') : L10n::t('Ignore')), - '$insecure' => (in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::MAIL, Protocol::DIASPORA]) ? '' : $insecure), - '$info' => $contact['info'], - '$cinfo' => ['info', '', $contact['info'], ''], - '$blocked' => ($contact['blocked'] ? L10n::t('Currently blocked') : ''), - '$ignored' => ($contact['readonly'] ? L10n::t('Currently ignored') : ''), - '$archived' => ($contact['archive'] ? L10n::t('Currently archived') : ''), - '$pending' => ($contact['pending'] ? L10n::t('Awaiting connection acknowledge') : ''), - '$hidden' => ['hidden', L10n::t('Hide this contact from others'), ($contact['hidden'] == 1), L10n::t('Replies/likes to your public posts may still be visible')], - '$notify' => ['notify', L10n::t('Notification for new posts'), ($contact['notify_new_posts'] == 1), L10n::t('Send a notification of every new post of this contact')], - '$fetch_further_information' => $fetch_further_information, - '$ffi_keyword_blacklist' => $contact['ffi_keyword_blacklist'], - '$ffi_keyword_blacklist' => ['ffi_keyword_blacklist', L10n::t('Blacklisted keywords'), $contact['ffi_keyword_blacklist'], L10n::t('Comma separated list of keywords that should not be converted to hashtags, when "Fetch information and keywords" is selected')], - '$photo' => $contact['photo'], - '$name' => htmlentities($contact['name']), - '$dir_icon' => $dir_icon, - '$sparkle' => $sparkle, - '$url' => $url, - '$profileurllabel' => L10n::t('Profile URL'), - '$profileurl' => $contact['url'], - '$account_type' => Contact::getAccountType($contact), - '$location' => BBCode::convert($contact["location"]), - '$location_label' => L10n::t("Location:"), - '$xmpp' => BBCode::convert($contact["xmpp"]), - '$xmpp_label' => L10n::t("XMPP:"), - '$about' => BBCode::convert($contact["about"], false), - '$about_label' => L10n::t("About:"), - '$keywords' => $contact["keywords"], - '$keywords_label' => L10n::t("Tags:"), - '$contact_action_button' => L10n::t("Actions"), - '$contact_actions' => $contact_actions, - '$contact_status' => L10n::t("Status"), - '$contact_settings_label' => $contact_settings_label, - '$contact_profile_label' => L10n::t("Profile"), - ]); - - $arr = ['contact' => $contact, 'output' => $o]; - - Addon::callHooks('contact_edit', $arr); - - return $arr['output']; - } - - $blocked = false; - $hidden = false; - $ignored = false; - $archived = false; - $all = false; - - if (($a->argc == 2) && ($a->argv[1] === 'all')) { - $sql_extra = ''; - $all = true; - } elseif (($a->argc == 2) && ($a->argv[1] === 'blocked')) { - $sql_extra = " AND `blocked` = 1 "; - $blocked = true; - } elseif (($a->argc == 2) && ($a->argv[1] === 'hidden')) { - $sql_extra = " AND `hidden` = 1 "; - $hidden = true; - } elseif (($a->argc == 2) && ($a->argv[1] === 'ignored')) { - $sql_extra = " AND `readonly` = 1 "; - $ignored = true; - } elseif (($a->argc == 2) && ($a->argv[1] === 'archived')) { - $sql_extra = " AND `archive` = 1 "; - $archived = true; - } else { - $sql_extra = " AND `blocked` = 0 "; - } - - $sql_extra .= sprintf(" AND `network` != '%s' ", Protocol::PHANTOM); - - $search = x($_GET, 'search') ? notags(trim($_GET['search'])) : ''; - $nets = x($_GET, 'nets' ) ? notags(trim($_GET['nets'])) : ''; - - $tabs = [ - [ - 'label' => L10n::t('Suggestions'), - 'url' => 'suggest', - 'sel' => '', - 'title' => L10n::t('Suggest potential friends'), - 'id' => 'suggestions-tab', - 'accesskey' => 'g', - ], - [ - 'label' => L10n::t('All Contacts'), - 'url' => 'contacts/all', - 'sel' => ($all) ? 'active' : '', - 'title' => L10n::t('Show all contacts'), - 'id' => 'showall-tab', - 'accesskey' => 'l', - ], - [ - 'label' => L10n::t('Unblocked'), - 'url' => 'contacts', - 'sel' => ((!$all) && (!$blocked) && (!$hidden) && (!$search) && (!$nets) && (!$ignored) && (!$archived)) ? 'active' : '', - 'title' => L10n::t('Only show unblocked contacts'), - 'id' => 'showunblocked-tab', - 'accesskey' => 'o', - ], - [ - 'label' => L10n::t('Blocked'), - 'url' => 'contacts/blocked', - 'sel' => ($blocked) ? 'active' : '', - 'title' => L10n::t('Only show blocked contacts'), - 'id' => 'showblocked-tab', - 'accesskey' => 'b', - ], - [ - 'label' => L10n::t('Ignored'), - 'url' => 'contacts/ignored', - 'sel' => ($ignored) ? 'active' : '', - 'title' => L10n::t('Only show ignored contacts'), - 'id' => 'showignored-tab', - 'accesskey' => 'i', - ], - [ - 'label' => L10n::t('Archived'), - 'url' => 'contacts/archived', - 'sel' => ($archived) ? 'active' : '', - 'title' => L10n::t('Only show archived contacts'), - 'id' => 'showarchived-tab', - 'accesskey' => 'y', - ], - [ - 'label' => L10n::t('Hidden'), - 'url' => 'contacts/hidden', - 'sel' => ($hidden) ? 'active' : '', - 'title' => L10n::t('Only show hidden contacts'), - 'id' => 'showhidden-tab', - 'accesskey' => 'h', - ], - ]; - - $tab_tpl = get_markup_template('common_tabs.tpl'); - $t = replace_macros($tab_tpl, ['$tabs' => $tabs]); - - $total = 0; - $searching = false; - $search_hdr = null; - if ($search) { - $searching = true; - $search_hdr = $search; - $search_txt = DBA::escape(protect_sprintf(preg_quote($search))); - $sql_extra .= " AND (name REGEXP '$search_txt' OR url REGEXP '$search_txt' OR nick REGEXP '$search_txt') "; - } - - if ($nets) { - $sql_extra .= sprintf(" AND network = '%s' ", DBA::escape($nets)); - } - - $sql_extra2 = ((($sort_type > 0) && ($sort_type <= 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 ", - intval($_SESSION['uid']) - ); - if (DBA::isResult($r)) { - $a->setPagerTotal($r[0]['total']); - $total = $r[0]['total']; - } - - $sql_extra3 = Widget::unavailableNetworks(); - - $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 ", - intval($_SESSION['uid']), - intval($a->pager['start']), - intval($a->pager['itemspage']) - ); - if (DBA::isResult($r)) { - foreach ($r as $rr) { - $rr['blocked'] = Contact::isBlockedByUser($rr['id'], local_user()); - $rr['readonly'] = Contact::isIgnoredByUser($rr['id'], local_user()); - $contacts[] = _contact_detail_for_template($rr); - } - } - - $tpl = get_markup_template("contacts-template.tpl"); - $o .= replace_macros($tpl, [ - '$baseurl' => System::baseUrl(), - '$header' => L10n::t('Contacts') . (($nets) ? ' - ' . ContactSelector::networkToName($nets) : ''), - '$tabs' => $t, - '$total' => $total, - '$search' => $search_hdr, - '$desc' => L10n::t('Search your contacts'), - '$finding' => $searching ? L10n::t('Results for: %s', $search) : "", - '$submit' => L10n::t('Find'), - '$cmd' => $a->cmd, - '$contacts' => $contacts, - '$contact_drop_confirm' => L10n::t('Do you really want to delete this contact?'), - 'multiselect' => 1, - '$batch_actions' => [ - 'contacts_batch_update' => L10n::t('Update'), - 'contacts_batch_block' => L10n::t('Block') . "/" . L10n::t("Unblock"), - "contacts_batch_ignore" => L10n::t('Ignore') . "/" . L10n::t("Unignore"), - "contacts_batch_archive" => L10n::t('Archive') . "/" . L10n::t("Unarchive"), - "contacts_batch_drop" => L10n::t('Delete'), - ], - '$h_batch_actions' => L10n::t('Batch Actions'), - '$paginate' => paginate($a), - ]); - - return $o; -} - -/** - * @brief List of pages for the Contact TabBar - * - * Available Pages are 'Status', 'Profile', 'Contacts' and 'Common Friends' - * - * @param App $a - * @param array $contact The contact array - * @param int $active_tab 1 if tab should be marked as active - * - * @return string - */ -function contacts_tab($a, $contact, $active_tab) -{ - // tabs - $tabs = [ - [ - 'label' => L10n::t('Status'), - 'url' => "contacts/" . $contact['id'] . "/conversations", - 'sel' => (($active_tab == 1) ? 'active' : ''), - 'title' => L10n::t('Conversations started by this contact'), - 'id' => 'status-tab', - 'accesskey' => 'm', - ], - [ - 'label' => L10n::t('Posts and Comments'), - 'url' => "contacts/" . $contact['id'] . "/posts", - 'sel' => (($active_tab == 2) ? 'active' : ''), - 'title' => L10n::t('Status Messages and Posts'), - 'id' => 'posts-tab', - 'accesskey' => 'p', - ], - [ - 'label' => L10n::t('Profile'), - 'url' => "contacts/" . $contact['id'], - 'sel' => (($active_tab == 3) ? 'active' : ''), - 'title' => L10n::t('Profile Details'), - 'id' => 'profile-tab', - 'accesskey' => 'o', - ] - ]; - - // Show this tab only if there is visible friend list - $x = GContact::countAllFriends(local_user(), $contact['id']); - if ($x) { - $tabs[] = ['label' => L10n::t('Contacts'), - 'url' => "allfriends/" . $contact['id'], - 'sel' => (($active_tab == 4) ? 'active' : ''), - 'title' => L10n::t('View all contacts'), - 'id' => 'allfriends-tab', - 'accesskey' => 't']; - } - - // Show this tab only if there is visible common friend list - $common = GContact::countCommonFriends(local_user(), $contact['id']); - if ($common) { - $tabs[] = ['label' => L10n::t('Common Friends'), - 'url' => "common/loc/" . local_user() . "/" . $contact['id'], - 'sel' => (($active_tab == 5) ? 'active' : ''), - 'title' => L10n::t('View all common friends'), - 'id' => 'common-loc-tab', - 'accesskey' => 'd' - ]; - } - - if (!empty($contact['uid'])) { - $tabs[] = ['label' => L10n::t('Advanced'), - 'url' => 'crepair/' . $contact['id'], - 'sel' => (($active_tab == 6) ? 'active' : ''), - 'title' => L10n::t('Advanced Contact Settings'), - 'id' => 'advanced-tab', - 'accesskey' => 'r' - ]; - } - - $tab_tpl = get_markup_template('common_tabs.tpl'); - $tab_str = replace_macros($tab_tpl, ['$tabs' => $tabs]); - - return $tab_str; -} - -function contact_conversations(App $a, $contact_id, $update) -{ - $o = ''; - - if (!$update) { - // We need the editor here to be able to reshare an item. - if (local_user()) { - $x = [ - 'is_owner' => true, - 'allow_location' => $a->user['allow_location'], - '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), - 'bang' => '', - 'visitor' => 'block', - 'profile_uid' => local_user(), - ]; - $o = status_editor($a, $x, 0, true); - } - } - - $contact = DBA::selectFirst('contact', ['uid', 'url', 'id'], ['id' => $contact_id]); - - if (!$update) { - $o .= contacts_tab($a, $contact, 1); - } - - if (DBA::isResult($contact)) { - $a->page['aside'] = ""; - - $profiledata = Contact::getDetailsByURL($contact["url"]); - - if (local_user()) { - if (in_array($profiledata["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { - $profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]); - } - } - - Profile::load($a, "", 0, $profiledata, true); - $o .= Contact::getPostsFromUrl($contact["url"], true, $update); - } - - return $o; -} - -function contact_posts(App $a, $contact_id) -{ - $contact = DBA::selectFirst('contact', ['uid', 'url', 'id'], ['id' => $contact_id]); - - $o = contacts_tab($a, $contact, 2); - - if (DBA::isResult($contact)) { - $a->page['aside'] = ""; - - $profiledata = Contact::getDetailsByURL($contact["url"]); - - if (local_user()) { - if (in_array($profiledata["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { - $profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]); - } - } - - Profile::load($a, "", 0, $profiledata, true); - $o .= Contact::getPostsFromUrl($contact["url"]); - } - - return $o; -} - -function _contact_detail_for_template(array $rr) -{ - $dir_icon = ''; - $alt_text = ''; - - switch ($rr['rel']) { - case Contact::FRIEND: - $dir_icon = 'images/lrarrow.gif'; - $alt_text = L10n::t('Mutual Friendship'); - break; - - case Contact::FOLLOWER; - $dir_icon = 'images/larrow.gif'; - $alt_text = L10n::t('is a fan of yours'); - break; - - case Contact::SHARING; - $dir_icon = 'images/rarrow.gif'; - $alt_text = L10n::t('you are a fan of'); - break; - - default: - break; - } - - $url = Contact::magicLink($rr['url']); - - if (strpos($url, 'redir/') === 0) { - $sparkle = ' class="sparkle" '; - } else { - $sparkle = ''; - } - - if ($rr['self']) { - $dir_icon = 'images/larrow.gif'; - $alt_text = L10n::t('This is you'); - $url = $rr['url']; - $sparkle = ''; - } - - return [ - 'img_hover' => L10n::t('Visit %s\'s profile [%s]', $rr['name'], $rr['url']), - 'edit_hover' => L10n::t('Edit contact'), - 'photo_menu' => Contact::photoMenu($rr), - 'id' => $rr['id'], - 'alt_text' => $alt_text, - 'dir_icon' => $dir_icon, - 'thumb' => ProxyUtils::proxifyUrl($rr['thumb'], false, ProxyUtils::SIZE_THUMB), - 'name' => htmlentities($rr['name']), - 'username' => htmlentities($rr['name']), - 'account_type' => Contact::getAccountType($rr), - 'sparkle' => $sparkle, - 'itemurl' => (($rr['addr'] != "") ? $rr['addr'] : $rr['url']), - 'url' => $url, - 'network' => ContactSelector::networkToName($rr['network'], $rr['url']), - 'nick' => htmlentities($rr['nick']), - ]; -} - -/** - * @brief Gives a array with actions which can performed to a given contact - * - * This includes actions like e.g. 'block', 'hide', 'archive', 'delete' and others - * - * @param array $contact Data about the Contact - * @return array with contact related actions - */ -function contact_actions($contact) -{ - $poll_enabled = in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL]); - $contact_actions = []; - - // Provide friend suggestion only for Friendica contacts - if ($contact['network'] === Protocol::DFRN) { - $contact_actions['suggest'] = [ - 'label' => L10n::t('Suggest friends'), - 'url' => 'fsuggest/' . $contact['id'], - 'title' => '', - 'sel' => '', - 'id' => 'suggest', - ]; - } - - if ($poll_enabled) { - $contact_actions['update'] = [ - 'label' => L10n::t('Update now'), - 'url' => 'contacts/' . $contact['id'] . '/update', - 'title' => '', - 'sel' => '', - 'id' => 'update', - ]; - } - - $contact_actions['block'] = [ - 'label' => (intval($contact['blocked']) ? L10n::t('Unblock') : L10n::t('Block')), - 'url' => 'contacts/' . $contact['id'] . '/block', - 'title' => L10n::t('Toggle Blocked status'), - 'sel' => (intval($contact['blocked']) ? 'active' : ''), - 'id' => 'toggle-block', - ]; - - $contact_actions['ignore'] = [ - 'label' => (intval($contact['readonly']) ? L10n::t('Unignore') : L10n::t('Ignore')), - 'url' => 'contacts/' . $contact['id'] . '/ignore', - 'title' => L10n::t('Toggle Ignored status'), - 'sel' => (intval($contact['readonly']) ? 'active' : ''), - 'id' => 'toggle-ignore', - ]; - - if ($contact['uid'] != 0) { - $contact_actions['archive'] = [ - 'label' => (intval($contact['archive']) ? L10n::t('Unarchive') : L10n::t('Archive')), - 'url' => 'contacts/' . $contact['id'] . '/archive', - 'title' => L10n::t('Toggle Archive status'), - 'sel' => (intval($contact['archive']) ? 'active' : ''), - 'id' => 'toggle-archive', - ]; - - $contact_actions['delete'] = [ - 'label' => L10n::t('Delete'), - 'url' => 'contacts/' . $contact['id'] . '/drop', - 'title' => L10n::t('Delete contact'), - 'sel' => '', - 'id' => 'delete', - ]; - } - - return $contact_actions; -} diff --git a/mod/crepair.php b/mod/crepair.php index 99aee1357..e5fb1e334 100644 --- a/mod/crepair.php +++ b/mod/crepair.php @@ -8,9 +8,8 @@ use Friendica\Core\Config; use Friendica\Core\L10n; use Friendica\Core\Protocol; use Friendica\Database\DBA; -use Friendica\Model\Contact; -use Friendica\Model\Profile; -use Friendica\Module\Contacts; +use Friendica\Model; +use Friendica\Module\Contact; require_once 'mod/contacts.php'; @@ -83,7 +82,7 @@ function crepair_post(App $a) if ($photo) { logger('mod-crepair: updating photo from ' . $photo); - Contact::updateAvatar($photo, local_user(), $contact['id']); + Model\Contact::updateAvatar($photo, local_user(), $contact['id']); } if ($r) { @@ -136,7 +135,7 @@ function crepair_content(App $a) $update_profile = in_array($contact['network'], [Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]); - $tab_str = Contacts::contacts_tab($a, $contact, 5); + $tab_str = Contact::getTabsHTML($a, $contact, 5); $tpl = get_markup_template('crepair.tpl'); $o = replace_macros($tpl, [ diff --git a/mod/dirfind.php b/mod/dirfind.php index e183e6c02..8fcf98d40 100644 --- a/mod/dirfind.php +++ b/mod/dirfind.php @@ -12,13 +12,13 @@ use Friendica\Core\Protocol; use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBA; -use Friendica\Model\Contact; -use Friendica\Model\GContact; +use Friendica\Model; +use Friendica\Module\Contact; use Friendica\Network\Probe; use Friendica\Protocol\PortableContact; use Friendica\Util\Network; use Friendica\Util\Proxy as ProxyUtils; -use Friendica\Module\Contacts; + function dirfind_init(App $a) { @@ -82,7 +82,7 @@ function dirfind_content(App $a, $prefix = "") { $objresult->tags = ""; $objresult->network = $user_data["network"]; - $contact = Contact::getDetailsByURL($user_data["url"], local_user()); + $contact = Model\Contact::getDetailsByURL($user_data["url"], local_user()); $objresult->cid = $contact["cid"]; $objresult->pcid = $contact["zid"]; @@ -90,7 +90,7 @@ function dirfind_content(App $a, $prefix = "") { // Add the contact to the global contacts if it isn't already in our system if (($contact["cid"] == 0) && ($contact["zid"] == 0) && ($contact["gid"] == 0)) { - GContact::update($user_data); + Model\GContact::update($user_data); } } elseif ($local) { @@ -155,7 +155,7 @@ function dirfind_content(App $a, $prefix = "") { continue; } - $result = Contact::getDetailsByURL($result["nurl"], local_user()); + $result = Model\Contact::getDetailsByURL($result["nurl"], local_user()); if ($result["name"] == "") { $result["name"] = end(explode("/", $urlparts["path"])); @@ -199,7 +199,7 @@ function dirfind_content(App $a, $prefix = "") { $alt_text = ""; - $contact_details = Contact::getDetailsByURL($jj->url, local_user()); + $contact_details = Model\Contact::getDetailsByURL($jj->url, local_user()); $itemurl = (($contact_details["addr"] != "") ? $contact_details["addr"] : $jj->url); @@ -209,8 +209,8 @@ function dirfind_content(App $a, $prefix = "") { $conntxt = ""; $contact = DBA::selectFirst('contact', [], ['id' => $jj->cid]); if (DBA::isResult($contact)) { - $photo_menu = Contact::photoMenu($contact); - $details = Contacts::_contact_detail_for_template($contact); + $photo_menu =Model\Contact::photoMenu($contact); + $details = Contact::getContactTemplateVars($contact); $alt_text = $details['alt_text']; } else { $photo_menu = []; @@ -221,7 +221,7 @@ function dirfind_content(App $a, $prefix = "") { $contact = DBA::selectFirst('contact', [], ['id' => $jj->pcid]); if (DBA::isResult($contact)) { - $photo_menu = Contact::photoMenu($contact); + $photo_menu = Model\Contact::photoMenu($contact); } else { $photo_menu = []; } @@ -234,7 +234,7 @@ function dirfind_content(App $a, $prefix = "") { $entry = [ 'alt_text' => $alt_text, - 'url' => Contact::magicLink($jj->url), + 'url' => Model\Contact::magicLink($jj->url), 'itemurl' => $itemurl, 'name' => htmlentities($jj->name), 'thumb' => ProxyUtils::proxifyUrl($jj->photo, false, ProxyUtils::SIZE_THUMB), @@ -245,7 +245,7 @@ function dirfind_content(App $a, $prefix = "") { 'details' => $contact_details['location'], 'tags' => $contact_details['keywords'], 'about' => $contact_details['about'], - 'account_type' => Contact::getAccountType($contact_details), + 'account_type' => Model\Contact::getAccountType($contact_details), 'network' => ContactSelector::networkToName($jj->network, $jj->url), 'id' => ++$id, ]; diff --git a/mod/group.php b/mod/group.php index cfcbca4e4..ec4ee4da2 100644 --- a/mod/group.php +++ b/mod/group.php @@ -11,9 +11,8 @@ use Friendica\Core\L10n; use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Database\DBA; -use Friendica\Model\Contact; -use Friendica\Model\Group; -use Friendica\Module\Contacts; +use Friendica\Model; +use Friendica\Module\Contact; function group_init(App $a) { if (local_user()) { @@ -186,7 +185,7 @@ function group_content(App $a) { } $group = $r[0]; - $members = Contact::getByGroupId($group['id']); + $members = Model\Contact::getByGroupId($group['id']); $preselected = []; $entry = []; $id = 0; @@ -204,7 +203,7 @@ function group_content(App $a) { Group::addMember($group['id'], $change); } - $members = Contact::getByGroupId($group['id']); + $members = Model\Contact::getByGroupId($group['id']); $preselected = []; if (count($members)) { foreach ($members as $member) { @@ -250,7 +249,7 @@ function group_content(App $a) { // Format the data of the group members foreach ($members as $member) { if ($member['url']) { - $entry = Contacts::_contact_detail_for_template($member); + $entry = Contact::getContactTemplateVars($member); $entry['label'] = 'members'; $entry['photo_menu'] = ''; $entry['change_member'] = [ @@ -267,7 +266,7 @@ function group_content(App $a) { } if ($nogroup) { - $r = Contact::getUngroupedList(local_user()); + $r = Model\Contact::getUngroupedList(local_user()); } else { $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND NOT `blocked` AND NOT `pending` AND NOT `self` ORDER BY `name` ASC", intval(local_user()) @@ -279,7 +278,7 @@ function group_content(App $a) { // Format the data of the contacts who aren't in the contact group foreach ($r as $member) { if (!in_array($member['id'], $preselected)) { - $entry = Contacts::_contact_detail_for_template($member); + $entry = Contact::getContactTemplateVars($member); $entry['label'] = 'contacts'; if (!$nogroup) $entry['photo_menu'] = []; diff --git a/src/Module/Contacts.php b/src/Module/Contacts.php index 8d26b3eb5..eb21b3b3e 100644 --- a/src/Module/Contacts.php +++ b/src/Module/Contacts.php @@ -29,7 +29,7 @@ use Friendica\Module\Login; * * @brief manages contacts */ -class Contacts extends BaseModule +class Contact extends BaseModule { public static function init() { @@ -129,7 +129,7 @@ class Contacts extends BaseModule ]); } - private static function contacts_batch_actions(App $a) + private static function batchActions(App $a) { if (empty($_POST['contact_batch']) || !is_array($_POST['contact_batch'])) { return; @@ -146,25 +146,25 @@ class Contacts extends BaseModule foreach ($orig_records as $orig_record) { $contact_id = $orig_record['id']; if (x($_POST, 'contacts_batch_update')) { - self::_contact_update($contact_id); + self::updateContactFromPoll($contact_id); $count_actions++; } if (x($_POST, 'contacts_batch_block')) { - self::_contact_block($contact_id); + self::blockContact($contact_id); $count_actions++; } if (x($_POST, 'contacts_batch_ignore')) { - self::_contact_ignore($contact_id); + self::ignoreContact($contact_id); $count_actions++; } if (x($_POST, 'contacts_batch_archive')) { - $r = self::_contact_archive($contact_id, $orig_record); + $r = self::archiveContact($contact_id, $orig_record); if ($r) { $count_actions++; } } if (x($_POST, 'contacts_batch_drop')) { - self::_contact_drop($orig_record); + self::dropContact($orig_record); $count_actions++; } } @@ -184,7 +184,7 @@ class Contacts extends BaseModule } if ($a->argv[1] === "batch") { - self::contacts_batch_actions($a); + self::batchActions($a); return; } @@ -253,7 +253,7 @@ class Contacts extends BaseModule /* contact actions */ - private static function _contact_update($contact_id) + private static function updateContactFromPoll($contact_id) { $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); if (!DBA::isResult($contact)) { @@ -274,7 +274,7 @@ class Contacts extends BaseModule } } - private static function _contact_update_profile($contact_id) + private static function updateContactFromProbe($contact_id) { $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); if (!DBA::isResult($contact)) { @@ -340,19 +340,19 @@ class Contacts extends BaseModule GContact::updateFromProbe($data["url"]); } - private static function _contact_block($contact_id) + private static function blockContact($contact_id) { $blocked = !Contact::isBlockedByUser($contact_id, local_user()); Contact::setBlockedForUser($contact_id, local_user(), $blocked); } - private static function _contact_ignore($contact_id) + private static function ignoreContact($contact_id) { $ignored = !Contact::isIgnoredByUser($contact_id, local_user()); Contact::setIgnoredForUser($contact_id, local_user(), $ignored); } - private static function _contact_archive($contact_id, $orig_record) + private static function archiveContact($contact_id, $orig_record) { $archived = (($orig_record['archive']) ? 0 : 1); $r = q("UPDATE `contact` SET `archive` = %d WHERE `id` = %d AND `uid` = %d", @@ -363,7 +363,7 @@ class Contacts extends BaseModule return DBA::isResult($r); } - private static function _contact_drop($orig_record) + private static function dropContact($orig_record) { $a = get_app(); @@ -407,19 +407,19 @@ class Contacts extends BaseModule } if ($cmd === 'update' && ($orig_record['uid'] != 0)) { - self::_contact_update($contact_id); + self::updateContactFromPoll($contact_id); goaway('contacts/' . $contact_id); // NOTREACHED } if ($cmd === 'updateprofile' && ($orig_record['uid'] != 0)) { - self::_contact_update_profile($contact_id); + self::updateContactFromProbe($contact_id); goaway('crepair/' . $contact_id); // NOTREACHED } if ($cmd === 'block') { - self::_contact_block($contact_id); + self::blockContact($contact_id); $blocked = Contact::isBlockedByUser($contact_id, local_user()); info(($blocked ? L10n::t('Contact has been blocked') : L10n::t('Contact has been unblocked')) . EOL); @@ -429,7 +429,7 @@ class Contacts extends BaseModule } if ($cmd === 'ignore') { - self::_contact_ignore($contact_id); + self::ignoreContact($contact_id); $ignored = Contact::isIgnoredByUser($contact_id, local_user()); info(($ignored ? L10n::t('Contact has been ignored') : L10n::t('Contact has been unignored')) . EOL); @@ -439,7 +439,7 @@ class Contacts extends BaseModule } if ($cmd === 'archive' && ($orig_record['uid'] != 0)) { - $r = self::_contact_archive($contact_id, $orig_record); + $r = self::archiveContact($contact_id, $orig_record); if ($r) { $archived = (($orig_record['archive']) ? 0 : 1); info((($archived) ? L10n::t('Contact has been archived') : L10n::t('Contact has been unarchived')) . EOL); @@ -467,7 +467,7 @@ class Contacts extends BaseModule return replace_macros(get_markup_template('contact_drop_confirm.tpl'), [ '$header' => L10n::t('Drop contact'), - '$contact' => self::_contact_detail_for_template($orig_record), + '$contact' => self::getContactTemplateVars($orig_record), '$method' => 'get', '$message' => L10n::t('Do you really want to delete this contact?'), '$extra_inputs' => $inputs, @@ -482,17 +482,17 @@ class Contacts extends BaseModule goaway('contacts'); } - self::_contact_drop($orig_record); + self::dropContact($orig_record); info(L10n::t('Contact has been removed.') . EOL); goaway('contacts'); return; // NOTREACHED } if ($cmd === 'posts') { - return self::contact_posts($a, $contact_id); + return self::getPostsHTML($a, $contact_id); } if ($cmd === 'conversations') { - return self::contact_conversations($a, $contact_id, $update); + return self::getConversationsHMTL($a, $contact_id, $update); } } @@ -562,7 +562,7 @@ class Contacts extends BaseModule $nettype = L10n::t('Network type: %s', ContactSelector::networkToName($contact['network'], $contact["url"])); // tabs - $tab_str = self::contacts_tab($a, $contact, 3); + $tab_str = self::getTabsHTML($a, $contact, 3); $lost_contact = (($contact['archive'] && $contact['term-date'] > NULL_DATE && $contact['term-date'] < DateTimeFormat::utcNow()) ? L10n::t('Communications lost with this contact!') : ''); @@ -605,7 +605,7 @@ class Contacts extends BaseModule } // Load contactact related actions like hide, suggest, delete and others - $contact_actions = self::contact_actions($contact); + $contact_actions = self::getContactActions($contact); if ($contact['uid'] != 0) { $lbl_vis1 = L10n::t('Profile Visibility'); @@ -822,7 +822,7 @@ class Contacts extends BaseModule foreach ($r as $rr) { $rr['blocked'] = Contact::isBlockedByUser($rr['id'], local_user()); $rr['readonly'] = Contact::isIgnoredByUser($rr['id'], local_user()); - $contacts[] = self::_contact_detail_for_template($rr); + $contacts[] = self::getContactTemplateVars($rr); } } @@ -865,7 +865,7 @@ class Contacts extends BaseModule * * @return string */ - public static function contacts_tab($a, $contact, $active_tab) + public static function getTabsHTML($a, $contact, $active_tab) { // tabs $tabs = [ @@ -934,7 +934,7 @@ class Contacts extends BaseModule return $tab_str; } - private static function contact_conversations($a, $contact_id, $update) + private static function getConversationsHMTL($a, $contact_id, $update) { $o = ''; @@ -959,7 +959,7 @@ class Contacts extends BaseModule $contact = DBA::selectFirst('contact', ['uid', 'url', 'id'], ['id' => $contact_id]); if (!$update) { - $o .= self::contacts_tab($a, $contact, 1); + $o .= self::getTabsHTML($a, $contact, 1); } if (DBA::isResult($contact)) { @@ -980,11 +980,11 @@ class Contacts extends BaseModule return $o; } - private static function contact_posts($a, $contact_id) + private static function getPostsHTML($a, $contact_id) { $contact = DBA::selectFirst('contact', ['uid', 'url', 'id'], ['id' => $contact_id]); - $o = self::contacts_tab($a, $contact, 2); + $o = self::getTabsHTML($a, $contact, 2); if (DBA::isResult($contact)) { $a->page['aside'] = ""; @@ -1004,7 +1004,7 @@ class Contacts extends BaseModule return $o; } - public static function _contact_detail_for_template(array $rr) + public static function getContactTemplateVars(array $rr) { $dir_icon = ''; $alt_text = ''; @@ -1071,7 +1071,7 @@ class Contacts extends BaseModule * @param array $contact Data about the Contact * @return array with contact related actions */ - private static function contact_actions($contact) + private static function getContactActions($contact) { $poll_enabled = in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL]); $contact_actions = []; @@ -1133,5 +1133,4 @@ class Contacts extends BaseModule return $contact_actions; } - -} \ No newline at end of file +} diff --git a/view/theme/frio/theme.php b/view/theme/frio/theme.php index fb9ac95ce..98c1b8e7b 100644 --- a/view/theme/frio/theme.php +++ b/view/theme/frio/theme.php @@ -333,7 +333,7 @@ function frio_acl_lookup(App $a, &$results) if (DBA::isResult($r)) { foreach ($r as $rr) { - $contacts[] = Contacts::_contact_detail_for_template($rr); + $contacts[] = Contacts::getContactTemplateVars($rr); } } From 738cb4ace6cb3dc4a78320577ffbdb3cdb773132 Mon Sep 17 00:00:00 2001 From: Jonny Tischbein Date: Sat, 13 Oct 2018 11:35:51 +0200 Subject: [PATCH 5/9] finish refactoring to Module\Contact --- mod/update_contacts.php | 2 +- src/Module/Contact.php | 1136 +++++++++++++++++++++++++++++++++++++ view/theme/frio/theme.php | 10 +- 3 files changed, 1142 insertions(+), 6 deletions(-) create mode 100644 src/Module/Contact.php diff --git a/mod/update_contacts.php b/mod/update_contacts.php index 33ba85055..6123d0304 100644 --- a/mod/update_contacts.php +++ b/mod/update_contacts.php @@ -14,7 +14,7 @@ function update_contacts_content(App $a) echo "
"; if ($_GET["force"] == 1) { - $text = Contacts::content($a, true); + $text = Contact::content($a, true); } else { $text = ''; } diff --git a/src/Module/Contact.php b/src/Module/Contact.php new file mode 100644 index 000000000..eb21b3b3e --- /dev/null +++ b/src/Module/Contact.php @@ -0,0 +1,1136 @@ +page, 'aside')) { + $a->page['aside'] = ''; + } + + $contact_id = null; + $contact = null; + if ((($a->argc == 2) && intval($a->argv[1])) || (($a->argc == 3) && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations']))) { + $contact_id = intval($a->argv[1]); + $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]); + + if (!DBA::isResult($contact)) { + $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => 0]); + } + + // Don't display contacts that are about to be deleted + if ($contact['network'] == Protocol::PHANTOM) { + $contact = false; + } + } + + if (DBA::isResult($contact)) { + if ($contact['self']) { + if (($a->argc == 3) && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations'])) { + goaway('profile/' . $contact['nick']); + } else { + goaway('profile/' . $contact['nick'] . '?tab=profile'); + } + } + + $a->data['contact'] = $contact; + + if (($a->data['contact']['network'] != "") && ($a->data['contact']['network'] != Protocol::DFRN)) { + $networkname = format_network_name($a->data['contact']['network'], $a->data['contact']['url']); + } else { + $networkname = ''; + } + + /// @TODO Add nice spaces + $vcard_widget = replace_macros(get_markup_template("vcard-widget.tpl"), [ + '$name' => htmlentities($a->data['contact']['name']), + '$photo' => $a->data['contact']['photo'], + '$url' => Contact::MagicLink($a->data['contact']['url']), + '$addr' => (($a->data['contact']['addr'] != "") ? ($a->data['contact']['addr']) : ""), + '$network_name' => $networkname, + '$network' => L10n::t('Network:'), + '$account_type' => Contact::getAccountType($a->data['contact']) + ]); + + $findpeople_widget = ''; + $follow_widget = ''; + $networks_widget = ''; + } else { + $vcard_widget = ''; + $networks_widget = Widget::networks('contacts', $nets); + if (isset($_GET['add'])) { + $follow_widget = Widget::follow($_GET['add']); + } else { + $follow_widget = Widget::follow(); + } + + $findpeople_widget = Widget::findPeople(); + } + + if ($contact['uid'] != 0) { + $groups_widget = Group::sidebarWidget('contacts', 'group', 'full', 'everyone', $contact_id); + } else { + $groups_widget = null; + } + + $a->page['aside'] .= replace_macros(get_markup_template("contacts-widget-sidebar.tpl"), [ + '$vcard_widget' => $vcard_widget, + '$findpeople_widget' => $findpeople_widget, + '$follow_widget' => $follow_widget, + '$groups_widget' => $groups_widget, + '$networks_widget' => $networks_widget + ]); + + $base = System::baseUrl(); + $tpl = get_markup_template("contacts-head.tpl"); + $a->page['htmlhead'] .= replace_macros($tpl, [ + '$baseurl' => System::baseUrl(true), + '$base' => $base + ]); + } + + private static function batchActions(App $a) + { + if (empty($_POST['contact_batch']) || !is_array($_POST['contact_batch'])) { + return; + } + + $contacts_id = $_POST['contact_batch']; + + $orig_records = q("SELECT * FROM `contact` WHERE `id` IN (%s) AND `uid` = %d AND `self` = 0", + implode(",", $contacts_id), + intval(local_user()) + ); + + $count_actions = 0; + foreach ($orig_records as $orig_record) { + $contact_id = $orig_record['id']; + if (x($_POST, 'contacts_batch_update')) { + self::updateContactFromPoll($contact_id); + $count_actions++; + } + if (x($_POST, 'contacts_batch_block')) { + self::blockContact($contact_id); + $count_actions++; + } + if (x($_POST, 'contacts_batch_ignore')) { + self::ignoreContact($contact_id); + $count_actions++; + } + if (x($_POST, 'contacts_batch_archive')) { + $r = self::archiveContact($contact_id, $orig_record); + if ($r) { + $count_actions++; + } + } + if (x($_POST, 'contacts_batch_drop')) { + self::dropContact($orig_record); + $count_actions++; + } + } + if ($count_actions > 0) { + info(L10n::tt("%d contact edited.", "%d contacts edited.", $count_actions)); + } + + goaway('contacts'); + } + + public static function post() + { + $a = self::getApp(); + + if (!local_user()) { + return; + } + + if ($a->argv[1] === "batch") { + self::batchActions($a); + return; + } + + $contact_id = intval($a->argv[1]); + if (!$contact_id) { + return; + } + + if (!DBA::exists('contact', ['id' => $contact_id, 'uid' => local_user()])) { + notice(L10n::t('Could not access contact record.') . EOL); + goaway('contacts'); + return; // NOTREACHED + } + + Addon::callHooks('contact_edit_post', $_POST); + + $profile_id = intval(defaults($_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); + return; + } + } + + $hidden = intval($_POST['hidden']); + + $notify = intval($_POST['notify']); + + $fetch_further_information = intval(defaults($_POST, 'fetch_further_information', 0)); + + $ffi_keyword_blacklist = escape_tags(trim(defaults($_POST, 'ffi_keyword_blacklist', ''))); + + $priority = intval(defaults($_POST, 'poll', 0)); + if ($priority > 5 || $priority < 0) { + $priority = 0; + } + + $info = escape_tags(trim($_POST['info'])); + + $r = q("UPDATE `contact` SET `profile-id` = %d, `priority` = %d , `info` = '%s', + `hidden` = %d, `notify_new_posts` = %d, `fetch_further_information` = %d, + `ffi_keyword_blacklist` = '%s' WHERE `id` = %d AND `uid` = %d", + intval($profile_id), + intval($priority), + DBA::escape($info), + intval($hidden), + intval($notify), + intval($fetch_further_information), + DBA::escape($ffi_keyword_blacklist), + intval($contact_id), + intval(local_user()) + ); + if (DBA::isResult($r)) { + info(L10n::t('Contact updated.') . EOL); + } else { + notice(L10n::t('Failed to update contact record.') . EOL); + } + + $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]); + if (DBA::isResult($contact)) { + $a->data['contact'] = $contact; + } + + return; + } + + /* contact actions */ + + private static function updateContactFromPoll($contact_id) + { + $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); + if (!DBA::isResult($contact)) { + return; + } + + $uid = $contact["uid"]; + + if ($contact["network"] == Protocol::OSTATUS) { + $result = Contact::createFromProbe($uid, $contact["url"], false, $contact["network"]); + + if ($result['success']) { + q("UPDATE `contact` SET `subhub` = 1 WHERE `id` = %d", intval($contact_id)); + } + } else { + // pull feed and consume it, which should subscribe to the hub. + Worker::add(PRIORITY_HIGH, "OnePoll", $contact_id, "force"); + } + } + + private static function updateContactFromProbe($contact_id) + { + $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); + 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"]; + $update = []; + + if ($data["network"] == Protocol::OSTATUS) { + $result = Contact::createFromProbe($uid, $data["url"], false); + + if ($result['success']) { + $update["subhub"] = true; + } + } + + foreach ($updatefields AS $field) { + if (isset($data[$field]) && ($data[$field] != "")) { + $update[$field] = $data[$field]; + } + } + + $update["nurl"] = normalise_link($data["url"]); + + $query = ""; + + if (isset($data["priority"]) && ($data["priority"] != 0)) { + $query = "`priority` = " . intval($data["priority"]); + } + + foreach ($update AS $key => $value) { + if ($query != "") { + $query .= ", "; + } + + $query .= "`" . $key . "` = '" . DBA::escape($value) . "'"; + } + + if ($query == "") { + return; + } + + $r = q("UPDATE `contact` SET $query WHERE `id` = %d AND `uid` = %d", + intval($contact_id), + intval(local_user()) + ); + + // Update the entry in the contact table + Contact::updateAvatar($data['photo'], local_user(), $contact_id, true); + + // Update the entry in the gcontact table + GContact::updateFromProbe($data["url"]); + } + + private static function blockContact($contact_id) + { + $blocked = !Contact::isBlockedByUser($contact_id, local_user()); + Contact::setBlockedForUser($contact_id, local_user(), $blocked); + } + + private static function ignoreContact($contact_id) + { + $ignored = !Contact::isIgnoredByUser($contact_id, local_user()); + Contact::setIgnoredForUser($contact_id, local_user(), $ignored); + } + + private static function archiveContact($contact_id, $orig_record) + { + $archived = (($orig_record['archive']) ? 0 : 1); + $r = q("UPDATE `contact` SET `archive` = %d WHERE `id` = %d AND `uid` = %d", + intval($archived), + intval($contact_id), + intval(local_user()) + ); + return DBA::isResult($r); + } + + private static function dropContact($orig_record) + { + $a = get_app(); + + $r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` + WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1", + intval($a->user['uid']) + ); + if (!DBA::isResult($r)) { + return; + } + + Contact::terminateFriendship($r[0], $orig_record, true); + Contact::remove($orig_record['id']); + } + + public static function content($update = 0) + { + $a = self::getApp(); + $sort_type = 0; + $o = ''; + Nav::setSelected('contacts'); + + if (!local_user()) { + notice(L10n::t('Permission denied.') . EOL); + return Login::form(); + } + + if ($a->argc == 3) { + $contact_id = intval($a->argv[1]); + if (!$contact_id) { + return; + } + + $cmd = $a->argv[2]; + + $orig_record = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => [0, local_user()], 'self' => false]); + if (!DBA::isResult($orig_record)) { + notice(L10n::t('Could not access contact record.') . EOL); + goaway('contacts'); + return; // NOTREACHED + } + + if ($cmd === 'update' && ($orig_record['uid'] != 0)) { + self::updateContactFromPoll($contact_id); + goaway('contacts/' . $contact_id); + // NOTREACHED + } + + if ($cmd === 'updateprofile' && ($orig_record['uid'] != 0)) { + self::updateContactFromProbe($contact_id); + goaway('crepair/' . $contact_id); + // NOTREACHED + } + + if ($cmd === 'block') { + self::blockContact($contact_id); + + $blocked = Contact::isBlockedByUser($contact_id, local_user()); + info(($blocked ? L10n::t('Contact has been blocked') : L10n::t('Contact has been unblocked')) . EOL); + + goaway('contacts/' . $contact_id); + return; // NOTREACHED + } + + if ($cmd === 'ignore') { + self::ignoreContact($contact_id); + + $ignored = Contact::isIgnoredByUser($contact_id, local_user()); + info(($ignored ? L10n::t('Contact has been ignored') : L10n::t('Contact has been unignored')) . EOL); + + goaway('contacts/' . $contact_id); + return; // NOTREACHED + } + + if ($cmd === 'archive' && ($orig_record['uid'] != 0)) { + $r = self::archiveContact($contact_id, $orig_record); + if ($r) { + $archived = (($orig_record['archive']) ? 0 : 1); + info((($archived) ? L10n::t('Contact has been archived') : L10n::t('Contact has been unarchived')) . EOL); + } + + goaway('contacts/' . $contact_id); + return; // NOTREACHED + } + + if ($cmd === 'drop' && ($orig_record['uid'] != 0)) { + // Check if we should do HTML-based delete confirmation + if (x($_REQUEST, 'confirm')) { + // can't take arguments in its "action" parameter + // so add any arguments as hidden inputs + $query = explode_querystring($a->query_string); + $inputs = []; + foreach ($query['args'] as $arg) { + if (strpos($arg, 'confirm=') === false) { + $arg_parts = explode('=', $arg); + $inputs[] = ['name' => $arg_parts[0], 'value' => $arg_parts[1]]; + } + } + + $a->page['aside'] = ''; + + return replace_macros(get_markup_template('contact_drop_confirm.tpl'), [ + '$header' => L10n::t('Drop contact'), + '$contact' => self::getContactTemplateVars($orig_record), + '$method' => 'get', + '$message' => L10n::t('Do you really want to delete this contact?'), + '$extra_inputs' => $inputs, + '$confirm' => L10n::t('Yes'), + '$confirm_url' => $query['base'], + '$confirm_name' => 'confirmed', + '$cancel' => L10n::t('Cancel'), + ]); + } + // Now check how the user responded to the confirmation query + if (x($_REQUEST, 'canceled')) { + goaway('contacts'); + } + + self::dropContact($orig_record); + info(L10n::t('Contact has been removed.') . EOL); + + goaway('contacts'); + return; // NOTREACHED + } + if ($cmd === 'posts') { + return self::getPostsHTML($a, $contact_id); + } + if ($cmd === 'conversations') { + return self::getConversationsHMTL($a, $contact_id, $update); + } + } + + $_SESSION['return_url'] = $a->query_string; + + if ((x($a->data, 'contact')) && (is_array($a->data['contact']))) { + $contact_id = $a->data['contact']['id']; + $contact = $a->data['contact']; + + $a->page['htmlhead'] .= replace_macros(get_markup_template('contact_head.tpl'), [ + '$baseurl' => System::baseUrl(true), + ]); + + $contact['blocked'] = Contact::isBlockedByUser($contact['id'], local_user()); + $contact['readonly'] = Contact::isIgnoredByUser($contact['id'], local_user()); + + $dir_icon = ''; + $relation_text = ''; + switch ($contact['rel']) { + case Contact::FRIEND: + $dir_icon = 'images/lrarrow.gif'; + $relation_text = L10n::t('You are mutual friends with %s'); + break; + + case Contact::FOLLOWER; + $dir_icon = 'images/larrow.gif'; + $relation_text = L10n::t('You are sharing with %s'); + break; + + case Contact::SHARING; + $dir_icon = 'images/rarrow.gif'; + $relation_text = L10n::t('%s is sharing with you'); + break; + + default: + break; + } + + if ($contact['uid'] == 0) { + $relation_text = ''; + } + + if (!in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])) { + $relation_text = ""; + } + + $relation_text = sprintf($relation_text, htmlentities($contact['name'])); + + $url = Contact::magicLink($contact['url']); + if (strpos($url, 'redir/') === 0) { + $sparkle = ' class="sparkle" '; + } else { + $sparkle = ''; + } + + $insecure = L10n::t('Private communications are not available for this contact.'); + + $last_update = (($contact['last-update'] <= NULL_DATE) ? L10n::t('Never') : DateTimeFormat::local($contact['last-update'], 'D, j M Y, g:i A')); + + if ($contact['last-update'] > NULL_DATE) { + $last_update .= ' ' . (($contact['last-update'] <= $contact['success_update']) ? L10n::t("\x28Update was successful\x29") : L10n::t("\x28Update was not successful\x29")); + } + $lblsuggest = (($contact['network'] === Protocol::DFRN) ? L10n::t('Suggest friends') : ''); + + $poll_enabled = in_array($contact['network'], [Protocol::DFRN, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL]); + + $nettype = L10n::t('Network type: %s', ContactSelector::networkToName($contact['network'], $contact["url"])); + + // tabs + $tab_str = self::getTabsHTML($a, $contact, 3); + + $lost_contact = (($contact['archive'] && $contact['term-date'] > NULL_DATE && $contact['term-date'] < DateTimeFormat::utcNow()) ? L10n::t('Communications lost with this contact!') : ''); + + $fetch_further_information = null; + if ($contact['network'] == Protocol::FEED) { + $fetch_further_information = [ + 'fetch_further_information', + L10n::t('Fetch further information for feeds'), + $contact['fetch_further_information'], + L10n::t("Fetch information like preview pictures, title and teaser from the feed item. You can activate this if the feed doesn't contain much text. Keywords are taken from the meta header in the feed item and are posted as hash tags."), + ['0' => L10n::t('Disabled'), + '1' => L10n::t('Fetch information'), + '3' => L10n::t('Fetch keywords'), + '2' => L10n::t('Fetch information and keywords') + ] + ]; + } + + $poll_interval = null; + if (in_array($contact['network'], [Protocol::FEED, Protocol::MAIL])) { + $poll_interval = ContactSelector::pollInterval($contact['priority'], (!$poll_enabled)); + } + + $profile_select = null; + if ($contact['network'] == Protocol::DFRN) { + $profile_select = ContactSelector::profileAssign($contact['profile-id'], (($contact['network'] !== Protocol::DFRN) ? true : false)); + } + + /// @todo Only show the following link with DFRN when the remote version supports it + $follow = ''; + $follow_text = ''; + if (in_array($contact['rel'], [Contact::FRIEND, Contact::SHARING])) { + if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) { + $follow = System::baseUrl(true) . "/unfollow?url=" . urlencode($contact["url"]); + $follow_text = L10n::t("Disconnect/Unfollow"); + } + } else { + $follow = System::baseUrl(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); + + if ($contact['uid'] != 0) { + $lbl_vis1 = L10n::t('Profile Visibility'); + $lbl_info1 = L10n::t('Contact Information / Notes'); + $contact_settings_label = L10n::t('Contact Settings'); + } else { + $lbl_vis1 = null; + $lbl_info1 = null; + $contact_settings_label = null; + } + + $tpl = get_markup_template("contact_edit.tpl"); + $o .= replace_macros($tpl, [ + '$header' => L10n::t("Contact"), + '$tab_str' => $tab_str, + '$submit' => L10n::t('Submit'), + '$lbl_vis1' => $lbl_vis1, + '$lbl_vis2' => L10n::t('Please choose the profile you would like to display to %s when viewing your profile securely.', $contact['name']), + '$lbl_info1' => $lbl_info1, + '$lbl_info2' => L10n::t('Their personal note'), + '$reason' => trim(notags($contact['reason'])), + '$infedit' => L10n::t('Edit contact notes'), + '$common_link' => 'common/loc/' . local_user() . '/' . $contact['id'], + '$relation_text' => $relation_text, + '$visit' => L10n::t('Visit %s\'s profile [%s]', $contact['name'], $contact['url']), + '$blockunblock' => L10n::t('Block/Unblock contact'), + '$ignorecont' => L10n::t('Ignore contact'), + '$lblcrepair' => L10n::t("Repair URL settings"), + '$lblrecent' => L10n::t('View conversations'), + '$lblsuggest' => $lblsuggest, + '$nettype' => $nettype, + '$poll_interval' => $poll_interval, + '$poll_enabled' => $poll_enabled, + '$lastupdtext' => L10n::t('Last update:'), + '$lost_contact' => $lost_contact, + '$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')), + '$ignore_text' => ($contact['readonly'] ? L10n::t('Unignore') : L10n::t('Ignore')), + '$insecure' => (in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::MAIL, Protocol::DIASPORA]) ? '' : $insecure), + '$info' => $contact['info'], + '$cinfo' => ['info', '', $contact['info'], ''], + '$blocked' => ($contact['blocked'] ? L10n::t('Currently blocked') : ''), + '$ignored' => ($contact['readonly'] ? L10n::t('Currently ignored') : ''), + '$archived' => ($contact['archive'] ? L10n::t('Currently archived') : ''), + '$pending' => ($contact['pending'] ? L10n::t('Awaiting connection acknowledge') : ''), + '$hidden' => ['hidden', L10n::t('Hide this contact from others'), ($contact['hidden'] == 1), L10n::t('Replies/likes to your public posts may still be visible')], + '$notify' => ['notify', L10n::t('Notification for new posts'), ($contact['notify_new_posts'] == 1), L10n::t('Send a notification of every new post of this contact')], + '$fetch_further_information' => $fetch_further_information, + '$ffi_keyword_blacklist' => $contact['ffi_keyword_blacklist'], + '$ffi_keyword_blacklist' => ['ffi_keyword_blacklist', L10n::t('Blacklisted keywords'), $contact['ffi_keyword_blacklist'], L10n::t('Comma separated list of keywords that should not be converted to hashtags, when "Fetch information and keywords" is selected')], + '$photo' => $contact['photo'], + '$name' => htmlentities($contact['name']), + '$dir_icon' => $dir_icon, + '$sparkle' => $sparkle, + '$url' => $url, + '$profileurllabel' => L10n::t('Profile URL'), + '$profileurl' => $contact['url'], + '$account_type' => Contact::getAccountType($contact), + '$location' => BBCode::convert($contact["location"]), + '$location_label' => L10n::t("Location:"), + '$xmpp' => BBCode::convert($contact["xmpp"]), + '$xmpp_label' => L10n::t("XMPP:"), + '$about' => BBCode::convert($contact["about"], false), + '$about_label' => L10n::t("About:"), + '$keywords' => $contact["keywords"], + '$keywords_label' => L10n::t("Tags:"), + '$contact_action_button' => L10n::t("Actions"), + '$contact_actions' => $contact_actions, + '$contact_status' => L10n::t("Status"), + '$contact_settings_label' => $contact_settings_label, + '$contact_profile_label' => L10n::t("Profile"), + ]); + + $arr = ['contact' => $contact, 'output' => $o]; + + Addon::callHooks('contact_edit', $arr); + + return $arr['output']; + } + + $blocked = false; + $hidden = false; + $ignored = false; + $archived = false; + $all = false; + + if (($a->argc == 2) && ($a->argv[1] === 'all')) { + $sql_extra = ''; + $all = true; + } elseif (($a->argc == 2) && ($a->argv[1] === 'blocked')) { + $sql_extra = " AND `blocked` = 1 "; + $blocked = true; + } elseif (($a->argc == 2) && ($a->argv[1] === 'hidden')) { + $sql_extra = " AND `hidden` = 1 "; + $hidden = true; + } elseif (($a->argc == 2) && ($a->argv[1] === 'ignored')) { + $sql_extra = " AND `readonly` = 1 "; + $ignored = true; + } elseif (($a->argc == 2) && ($a->argv[1] === 'archived')) { + $sql_extra = " AND `archive` = 1 "; + $archived = true; + } else { + $sql_extra = " AND `blocked` = 0 "; + } + + $sql_extra .= sprintf(" AND `network` != '%s' ", Protocol::PHANTOM); + + $search = x($_GET, 'search') ? notags(trim($_GET['search'])) : ''; + $nets = x($_GET, 'nets' ) ? notags(trim($_GET['nets'])) : ''; + + $tabs = [ + [ + 'label' => L10n::t('Suggestions'), + 'url' => 'suggest', + 'sel' => '', + 'title' => L10n::t('Suggest potential friends'), + 'id' => 'suggestions-tab', + 'accesskey' => 'g', + ], + [ + 'label' => L10n::t('All Contacts'), + 'url' => 'contacts/all', + 'sel' => ($all) ? 'active' : '', + 'title' => L10n::t('Show all contacts'), + 'id' => 'showall-tab', + 'accesskey' => 'l', + ], + [ + 'label' => L10n::t('Unblocked'), + 'url' => 'contacts', + 'sel' => ((!$all) && (!$blocked) && (!$hidden) && (!$search) && (!$nets) && (!$ignored) && (!$archived)) ? 'active' : '', + 'title' => L10n::t('Only show unblocked contacts'), + 'id' => 'showunblocked-tab', + 'accesskey' => 'o', + ], + [ + 'label' => L10n::t('Blocked'), + 'url' => 'contacts/blocked', + 'sel' => ($blocked) ? 'active' : '', + 'title' => L10n::t('Only show blocked contacts'), + 'id' => 'showblocked-tab', + 'accesskey' => 'b', + ], + [ + 'label' => L10n::t('Ignored'), + 'url' => 'contacts/ignored', + 'sel' => ($ignored) ? 'active' : '', + 'title' => L10n::t('Only show ignored contacts'), + 'id' => 'showignored-tab', + 'accesskey' => 'i', + ], + [ + 'label' => L10n::t('Archived'), + 'url' => 'contacts/archived', + 'sel' => ($archived) ? 'active' : '', + 'title' => L10n::t('Only show archived contacts'), + 'id' => 'showarchived-tab', + 'accesskey' => 'y', + ], + [ + 'label' => L10n::t('Hidden'), + 'url' => 'contacts/hidden', + 'sel' => ($hidden) ? 'active' : '', + 'title' => L10n::t('Only show hidden contacts'), + 'id' => 'showhidden-tab', + 'accesskey' => 'h', + ], + ]; + + $tab_tpl = get_markup_template('common_tabs.tpl'); + $t = replace_macros($tab_tpl, ['$tabs' => $tabs]); + + $total = 0; + $searching = false; + $search_hdr = null; + if ($search) { + $searching = true; + $search_hdr = $search; + $search_txt = DBA::escape(protect_sprintf(preg_quote($search))); + $sql_extra .= " AND (name REGEXP '$search_txt' OR url REGEXP '$search_txt' OR nick REGEXP '$search_txt') "; + } + + if ($nets) { + $sql_extra .= sprintf(" AND network = '%s' ", DBA::escape($nets)); + } + + $sql_extra2 = ((($sort_type > 0) && ($sort_type <= 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 ", + intval($_SESSION['uid']) + ); + if (DBA::isResult($r)) { + $a->setPagerTotal($r[0]['total']); + $total = $r[0]['total']; + } + + $sql_extra3 = Widget::unavailableNetworks(); + + $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 ", + intval($_SESSION['uid']), + intval($a->pager['start']), + intval($a->pager['itemspage']) + ); + if (DBA::isResult($r)) { + foreach ($r as $rr) { + $rr['blocked'] = Contact::isBlockedByUser($rr['id'], local_user()); + $rr['readonly'] = Contact::isIgnoredByUser($rr['id'], local_user()); + $contacts[] = self::getContactTemplateVars($rr); + } + } + + $tpl = get_markup_template("contacts-template.tpl"); + $o .= replace_macros($tpl, [ + '$baseurl' => System::baseUrl(), + '$header' => L10n::t('Contacts') . (($nets) ? ' - ' . ContactSelector::networkToName($nets) : ''), + '$tabs' => $t, + '$total' => $total, + '$search' => $search_hdr, + '$desc' => L10n::t('Search your contacts'), + '$finding' => $searching ? L10n::t('Results for: %s', $search) : "", + '$submit' => L10n::t('Find'), + '$cmd' => $a->cmd, + '$contacts' => $contacts, + '$contact_drop_confirm' => L10n::t('Do you really want to delete this contact?'), + 'multiselect' => 1, + '$batch_actions' => [ + 'contacts_batch_update' => L10n::t('Update'), + 'contacts_batch_block' => L10n::t('Block') . "/" . L10n::t("Unblock"), + "contacts_batch_ignore" => L10n::t('Ignore') . "/" . L10n::t("Unignore"), + "contacts_batch_archive" => L10n::t('Archive') . "/" . L10n::t("Unarchive"), + "contacts_batch_drop" => L10n::t('Delete'), + ], + '$h_batch_actions' => L10n::t('Batch Actions'), + '$paginate' => paginate($a), + ]); + + return $o; + } + + /** + * @brief List of pages for the Contact TabBar + * + * Available Pages are 'Status', 'Profile', 'Contacts' and 'Common Friends' + * + * @param App $a + * @param array $contact The contact array + * @param int $active_tab 1 if tab should be marked as active + * + * @return string + */ + public static function getTabsHTML($a, $contact, $active_tab) + { + // tabs + $tabs = [ + [ + 'label' => L10n::t('Status'), + 'url' => "contacts/" . $contact['id'] . "/conversations", + 'sel' => (($active_tab == 1) ? 'active' : ''), + 'title' => L10n::t('Conversations started by this contact'), + 'id' => 'status-tab', + 'accesskey' => 'm', + ], + [ + 'label' => L10n::t('Posts and Comments'), + 'url' => "contacts/" . $contact['id'] . "/posts", + 'sel' => (($active_tab == 2) ? 'active' : ''), + 'title' => L10n::t('Status Messages and Posts'), + 'id' => 'posts-tab', + 'accesskey' => 'p', + ], + [ + 'label' => L10n::t('Profile'), + 'url' => "contacts/" . $contact['id'], + 'sel' => (($active_tab == 3) ? 'active' : ''), + 'title' => L10n::t('Profile Details'), + 'id' => 'profile-tab', + 'accesskey' => 'o', + ] + ]; + + // Show this tab only if there is visible friend list + $x = GContact::countAllFriends(local_user(), $contact['id']); + if ($x) { + $tabs[] = ['label' => L10n::t('Contacts'), + 'url' => "allfriends/" . $contact['id'], + 'sel' => (($active_tab == 4) ? 'active' : ''), + 'title' => L10n::t('View all contacts'), + 'id' => 'allfriends-tab', + 'accesskey' => 't']; + } + + // Show this tab only if there is visible common friend list + $common = GContact::countCommonFriends(local_user(), $contact['id']); + if ($common) { + $tabs[] = ['label' => L10n::t('Common Friends'), + 'url' => "common/loc/" . local_user() . "/" . $contact['id'], + 'sel' => (($active_tab == 5) ? 'active' : ''), + 'title' => L10n::t('View all common friends'), + 'id' => 'common-loc-tab', + 'accesskey' => 'd' + ]; + } + + if (!empty($contact['uid'])) { + $tabs[] = ['label' => L10n::t('Advanced'), + 'url' => 'crepair/' . $contact['id'], + 'sel' => (($active_tab == 6) ? 'active' : ''), + 'title' => L10n::t('Advanced Contact Settings'), + 'id' => 'advanced-tab', + 'accesskey' => 'r' + ]; + } + + $tab_tpl = get_markup_template('common_tabs.tpl'); + $tab_str = replace_macros($tab_tpl, ['$tabs' => $tabs]); + + return $tab_str; + } + + private static function getConversationsHMTL($a, $contact_id, $update) + { + $o = ''; + + if (!$update) { + // We need the editor here to be able to reshare an item. + if (local_user()) { + $x = [ + 'is_owner' => true, + 'allow_location' => $a->user['allow_location'], + '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), + 'bang' => '', + 'visitor' => 'block', + 'profile_uid' => local_user(), + ]; + $o = status_editor($a, $x, 0, true); + } + } + + $contact = DBA::selectFirst('contact', ['uid', 'url', 'id'], ['id' => $contact_id]); + + if (!$update) { + $o .= self::getTabsHTML($a, $contact, 1); + } + + if (DBA::isResult($contact)) { + $a->page['aside'] = ""; + + $profiledata = Contact::getDetailsByURL($contact["url"]); + + if (local_user()) { + if (in_array($profiledata["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { + $profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]); + } + } + + Profile::load($a, "", 0, $profiledata, true); + $o .= Contact::getPostsFromUrl($contact["url"], true, $update); + } + + return $o; + } + + private static function getPostsHTML($a, $contact_id) + { + $contact = DBA::selectFirst('contact', ['uid', 'url', 'id'], ['id' => $contact_id]); + + $o = self::getTabsHTML($a, $contact, 2); + + if (DBA::isResult($contact)) { + $a->page['aside'] = ""; + + $profiledata = Contact::getDetailsByURL($contact["url"]); + + if (local_user()) { + if (in_array($profiledata["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { + $profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]); + } + } + + Profile::load($a, "", 0, $profiledata, true); + $o .= Contact::getPostsFromUrl($contact["url"]); + } + + return $o; + } + + public static function getContactTemplateVars(array $rr) + { + $dir_icon = ''; + $alt_text = ''; + + switch ($rr['rel']) { + case Contact::FRIEND: + $dir_icon = 'images/lrarrow.gif'; + $alt_text = L10n::t('Mutual Friendship'); + break; + + case Contact::FOLLOWER; + $dir_icon = 'images/larrow.gif'; + $alt_text = L10n::t('is a fan of yours'); + break; + + case Contact::SHARING; + $dir_icon = 'images/rarrow.gif'; + $alt_text = L10n::t('you are a fan of'); + break; + + default: + break; + } + + $url = Contact::magicLink($rr['url']); + + if (strpos($url, 'redir/') === 0) { + $sparkle = ' class="sparkle" '; + } else { + $sparkle = ''; + } + + if ($rr['self']) { + $dir_icon = 'images/larrow.gif'; + $alt_text = L10n::t('This is you'); + $url = $rr['url']; + $sparkle = ''; + } + + return [ + 'img_hover' => L10n::t('Visit %s\'s profile [%s]', $rr['name'], $rr['url']), + 'edit_hover' => L10n::t('Edit contact'), + 'photo_menu' => Contact::photoMenu($rr), + 'id' => $rr['id'], + 'alt_text' => $alt_text, + 'dir_icon' => $dir_icon, + 'thumb' => ProxyUtils::proxifyUrl($rr['thumb'], false, ProxyUtils::SIZE_THUMB), + 'name' => htmlentities($rr['name']), + 'username' => htmlentities($rr['name']), + 'account_type' => Contact::getAccountType($rr), + 'sparkle' => $sparkle, + 'itemurl' => (($rr['addr'] != "") ? $rr['addr'] : $rr['url']), + 'url' => $url, + 'network' => ContactSelector::networkToName($rr['network'], $rr['url']), + 'nick' => htmlentities($rr['nick']), + ]; + } + + /** + * @brief Gives a array with actions which can performed to a given contact + * + * This includes actions like e.g. 'block', 'hide', 'archive', 'delete' and others + * + * @param array $contact Data about the Contact + * @return array with contact related actions + */ + private static function getContactActions($contact) + { + $poll_enabled = in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL]); + $contact_actions = []; + + // Provide friend suggestion only for Friendica contacts + if ($contact['network'] === Protocol::DFRN) { + $contact_actions['suggest'] = [ + 'label' => L10n::t('Suggest friends'), + 'url' => 'fsuggest/' . $contact['id'], + 'title' => '', + 'sel' => '', + 'id' => 'suggest', + ]; + } + + if ($poll_enabled) { + $contact_actions['update'] = [ + 'label' => L10n::t('Update now'), + 'url' => 'contacts/' . $contact['id'] . '/update', + 'title' => '', + 'sel' => '', + 'id' => 'update', + ]; + } + + $contact_actions['block'] = [ + 'label' => (intval($contact['blocked']) ? L10n::t('Unblock') : L10n::t('Block')), + 'url' => 'contacts/' . $contact['id'] . '/block', + 'title' => L10n::t('Toggle Blocked status'), + 'sel' => (intval($contact['blocked']) ? 'active' : ''), + 'id' => 'toggle-block', + ]; + + $contact_actions['ignore'] = [ + 'label' => (intval($contact['readonly']) ? L10n::t('Unignore') : L10n::t('Ignore')), + 'url' => 'contacts/' . $contact['id'] . '/ignore', + 'title' => L10n::t('Toggle Ignored status'), + 'sel' => (intval($contact['readonly']) ? 'active' : ''), + 'id' => 'toggle-ignore', + ]; + + if ($contact['uid'] != 0) { + $contact_actions['archive'] = [ + 'label' => (intval($contact['archive']) ? L10n::t('Unarchive') : L10n::t('Archive')), + 'url' => 'contacts/' . $contact['id'] . '/archive', + 'title' => L10n::t('Toggle Archive status'), + 'sel' => (intval($contact['archive']) ? 'active' : ''), + 'id' => 'toggle-archive', + ]; + + $contact_actions['delete'] = [ + 'label' => L10n::t('Delete'), + 'url' => 'contacts/' . $contact['id'] . '/drop', + 'title' => L10n::t('Delete contact'), + 'sel' => '', + 'id' => 'delete', + ]; + } + + return $contact_actions; + } +} diff --git a/view/theme/frio/theme.php b/view/theme/frio/theme.php index 98c1b8e7b..79ec421d2 100644 --- a/view/theme/frio/theme.php +++ b/view/theme/frio/theme.php @@ -16,8 +16,8 @@ use Friendica\Core\L10n; use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Database\DBA; -use Friendica\Model\Profile; -use Friendica\Module\Contacts; +use Friendica\Model; +use Friendica\Module\Contact; $frio = 'view/theme/frio'; @@ -209,7 +209,7 @@ function frio_contact_photo_menu(App $a, &$args) function frio_remote_nav($a, &$nav) { // get the homelink from $_XSESSION - $homelink = Profile::getMyURL(); + $homelink = Model\Profile::getMyURL(); if (!$homelink) { $homelink = defaults($_SESSION, 'visitor_home', ''); } @@ -247,7 +247,7 @@ function frio_remote_nav($a, &$nav) } elseif (!local_user() && remote_user()) { $r = q("SELECT `name`, `nick`, `micro` AS `photo` FROM `contact` WHERE `id` = %d", intval(remote_user())); $nav['remote'] = L10n::t('Guest'); - } elseif (Profile::getMyURL()) { + } elseif (Model\Profile::getMyURL()) { $r = q("SELECT `name`, `nick`, `photo` FROM `gcontact` WHERE `addr` = '%s' AND `network` = 'dfrn'", DBA::escape($webbie)); @@ -333,7 +333,7 @@ function frio_acl_lookup(App $a, &$results) if (DBA::isResult($r)) { foreach ($r as $rr) { - $contacts[] = Contacts::getContactTemplateVars($rr); + $contacts[] = Model\Contact::getContactTemplateVars($rr); } } From bfa05156ca5096fe9db8ca4a66ca32ef4cbf0ca5 Mon Sep 17 00:00:00 2001 From: Jonny Tischbein Date: Sat, 13 Oct 2018 13:29:56 +0200 Subject: [PATCH 6/9] change links from /contacts to /contact --- include/api.php | 2 +- mod/crepair.php | 2 - mod/dfrn_confirm.php | 4 +- mod/dfrn_request.php | 4 +- mod/group.php | 4 +- mod/newmember.php | 6 +- src/Content/Nav.php | 2 +- src/Model/Contact.php | 6 +- src/Module/Contact.php | 199 ++- src/Module/Contacts.php | 1136 ----------------- util/messages.po | 234 ++-- view/templates/contacts-template.tpl | 2 +- view/templates/crepair.tpl | 2 +- view/theme/frio/templates/contact_edit.tpl | 2 +- .../frio/templates/contacts-template.tpl | 2 +- view/theme/frio/templates/crepair.tpl | 2 +- view/theme/frio/theme.php | 6 +- 17 files changed, 232 insertions(+), 1383 deletions(-) delete mode 100644 src/Module/Contacts.php diff --git a/include/api.php b/include/api.php index 01cb93a3b..ff763e988 100644 --- a/include/api.php +++ b/include/api.php @@ -761,7 +761,7 @@ function api_get_user(App $a, $contact_id = null) 'statusnet_blocking' => false, 'notifications' => false, /// @TODO old way? - //'statusnet_profile_url' => System::baseUrl()."/contacts/".$uinfo[0]['cid'], + //'statusnet_profile_url' => System::baseUrl()."/contact/".$uinfo[0]['cid'], 'statusnet_profile_url' => $uinfo[0]['url'], 'uid' => intval($uinfo[0]['uid']), 'cid' => intval($uinfo[0]['cid']), diff --git a/mod/crepair.php b/mod/crepair.php index e5fb1e334..14ed89afb 100644 --- a/mod/crepair.php +++ b/mod/crepair.php @@ -11,8 +11,6 @@ use Friendica\Database\DBA; use Friendica\Model; use Friendica\Module\Contact; -require_once 'mod/contacts.php'; - function crepair_init(App $a) { if (!local_user()) { diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php index 969e2286c..48ce3c6aa 100644 --- a/mod/dfrn_confirm.php +++ b/mod/dfrn_confirm.php @@ -400,7 +400,7 @@ function dfrn_confirm_post(App $a, $handsfree = null) // Let's send our user to the contact editor in case they want to // do anything special with this new friend. if ($handsfree === null) { - goaway(System::baseUrl() . '/contacts/' . intval($contact_id)); + goaway(System::baseUrl() . '/contact/' . intval($contact_id)); } else { return; } @@ -604,7 +604,7 @@ function dfrn_confirm_post(App $a, $handsfree = null) 'to_name' => $combined['username'], 'to_email' => $combined['email'], 'uid' => $combined['uid'], - 'link' => System::baseUrl() . '/contacts/' . $dfrn_record, + 'link' => System::baseUrl() . '/contact/' . $dfrn_record, 'source_name' => ((strlen(stripslashes($combined['name']))) ? stripslashes($combined['name']) : L10n::t('[Name Withheld]')), 'source_link' => $combined['url'], 'source_photo' => $combined['photo'], diff --git a/mod/dfrn_request.php b/mod/dfrn_request.php index e61145828..67db2c628 100644 --- a/mod/dfrn_request.php +++ b/mod/dfrn_request.php @@ -173,9 +173,9 @@ function dfrn_request_post(App $a) Contact::updateAvatar($photo, local_user(), $r[0]["id"], true); } - $forwardurl = System::baseUrl() . "/contacts/" . $r[0]['id']; + $forwardurl = System::baseUrl() . "/contact/" . $r[0]['id']; } else { - $forwardurl = System::baseUrl() . "/contacts"; + $forwardurl = System::baseUrl() . "/contact"; } // Allow the blocked remote notification to complete diff --git a/mod/group.php b/mod/group.php index ec4ee4da2..962697c24 100644 --- a/mod/group.php +++ b/mod/group.php @@ -54,7 +54,7 @@ function group_post(App $a) { ); if (!DBA::isResult($r)) { notice(L10n::t('Group not found.') . EOL); - goaway(System::baseUrl() . '/contacts'); + goaway(System::baseUrl() . '/contact'); return; // NOTREACHED } $group = $r[0]; @@ -181,7 +181,7 @@ function group_content(App $a) { if (!DBA::isResult($r)) { notice(L10n::t('Group not found.') . EOL); - goaway(System::baseUrl() . '/contacts'); + goaway(System::baseUrl() . '/contact'); } $group = $r[0]; diff --git a/mod/newmember.php b/mod/newmember.php index b3bf310d5..cd59cc780 100644 --- a/mod/newmember.php +++ b/mod/newmember.php @@ -36,13 +36,13 @@ function newmember_content(App $a) $o .= '
  • ' . '' . L10n::t('Importing Emails') . '
    ' . L10n::t('Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX') . '
  • ' . EOL; } - $o .= '
  • ' . '' . L10n::t('Go to Your Contacts Page') . '
    ' . L10n::t('Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the Add New Contact dialog.') . '
  • ' . EOL; + $o .= '
  • ' . '' . L10n::t('Go to Your Contacts Page') . '
    ' . L10n::t('Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the Add New Contact dialog.') . '
  • ' . EOL; $o .= '
  • ' . '' . L10n::t("Go to Your Site's Directory") . '
    ' . L10n::t('The Directory page lets you find other people in this network or other federated sites. Look for a Connect or Follow link on their profile page. Provide your own Identity Address if requested.') . '
  • ' . EOL; - $o .= '
  • ' . '' . L10n::t('Finding New People') . '
    ' . L10n::t("On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours.") . '
  • ' . EOL; + $o .= '
  • ' . '' . L10n::t('Finding New People') . '
    ' . L10n::t("On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours.") . '
  • ' . EOL; $o .= ''; $o .= '

    ' . L10n::t('Groups') . '

    '; $o .= '
      '; - $o .= '
    • ' . '' . L10n::t('Group Your Contacts') . '
      ' . L10n::t('Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page.') . '
    • ' . EOL; + $o .= '
    • ' . '' . L10n::t('Group Your Contacts') . '
      ' . L10n::t('Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page.') . '
    • ' . EOL; if (Config::get('system', 'newuser_private')) { $o .= '
    • ' . '' . L10n::t("Why Aren't My Posts Public?") . '
      ' . L10n::t("Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above.") . '
    • ' . EOL; diff --git a/src/Content/Nav.php b/src/Content/Nav.php index 7a1a149a2..4f6f4ae0b 100644 --- a/src/Content/Nav.php +++ b/src/Content/Nav.php @@ -210,7 +210,7 @@ class Nav $nav['profiles'] = ['profiles', L10n::t('Profiles'), '', L10n::t('Manage/Edit Profiles')]; } - $nav['contacts'] = ['contacts', L10n::t('Contacts'), '', L10n::t('Manage/edit friends and contacts')]; + $nav['contacts'] = ['contact', L10n::t('Contacts'), '', L10n::t('Manage/edit friends and contacts')]; } // Show the link to the admin configuration page if user is admin diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 23c31d0b1..1dd84e003 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -923,12 +923,12 @@ class Contact extends BaseObject $poke_link = System::baseUrl() . '/poke/?f=&c=' . $contact['id']; } - $contact_url = System::baseUrl() . '/contacts/' . $contact['id']; + $contact_url = System::baseUrl() . '/contact/' . $contact['id']; - $posts_link = System::baseUrl() . '/contacts/' . $contact['id'] . '/conversations'; + $posts_link = System::baseUrl() . '/contact/' . $contact['id'] . '/conversations'; if (!$contact['self']) { - $contact_drop_link = System::baseUrl() . '/contacts/' . $contact['id'] . '/drop?confirm=1'; + $contact_drop_link = System::baseUrl() . '/contact/' . $contact['id'] . '/drop?confirm=1'; } /** diff --git a/src/Module/Contact.php b/src/Module/Contact.php index eb21b3b3e..07b7c907d 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -14,10 +14,7 @@ use Friendica\Core\Protocol; use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBA; -use Friendica\Model\Contact; -use Friendica\Model\GContact; -use Friendica\Model\Group; -use Friendica\Model\Profile; +use Friendica\Model; use Friendica\Network\Probe; use Friendica\Util\DateTimeFormat; use Friendica\Util\Proxy as ProxyUtils; @@ -85,11 +82,11 @@ class Contact extends BaseModule $vcard_widget = replace_macros(get_markup_template("vcard-widget.tpl"), [ '$name' => htmlentities($a->data['contact']['name']), '$photo' => $a->data['contact']['photo'], - '$url' => Contact::MagicLink($a->data['contact']['url']), + '$url' => Model\Contact::MagicLink($a->data['contact']['url']), '$addr' => (($a->data['contact']['addr'] != "") ? ($a->data['contact']['addr']) : ""), '$network_name' => $networkname, '$network' => L10n::t('Network:'), - '$account_type' => Contact::getAccountType($a->data['contact']) + '$account_type' => Model\Contact::getAccountType($a->data['contact']) ]); $findpeople_widget = ''; @@ -108,7 +105,7 @@ class Contact extends BaseModule } if ($contact['uid'] != 0) { - $groups_widget = Group::sidebarWidget('contacts', 'group', 'full', 'everyone', $contact_id); + $groups_widget = Model\Group::sidebarWidget('contacts', 'group', 'full', 'everyone', $contact_id); } else { $groups_widget = null; } @@ -121,7 +118,7 @@ class Contact extends BaseModule '$networks_widget' => $networks_widget ]); - $base = System::baseUrl(); + $base = $a->getBaseURL(); $tpl = get_markup_template("contacts-head.tpl"); $a->page['htmlhead'] .= replace_macros($tpl, [ '$baseurl' => System::baseUrl(true), @@ -137,33 +134,31 @@ class Contact extends BaseModule $contacts_id = $_POST['contact_batch']; - $orig_records = q("SELECT * FROM `contact` WHERE `id` IN (%s) AND `uid` = %d AND `self` = 0", - implode(",", $contacts_id), - intval(local_user()) - ); - + $stmt = DBA::select('contact', ['id'], ['id' => $contacts_id, 'id' => local_user(), 'self' => false]); + $orig_records = DBA::toArray($stmt); + $count_actions = 0; foreach ($orig_records as $orig_record) { $contact_id = $orig_record['id']; - if (x($_POST, 'contacts_batch_update')) { + if (defaults($_POST, 'contacts_batch_update')) { self::updateContactFromPoll($contact_id); $count_actions++; } - if (x($_POST, 'contacts_batch_block')) { + if (defaults($_POST, 'contacts_batch_block')) { self::blockContact($contact_id); $count_actions++; } - if (x($_POST, 'contacts_batch_ignore')) { + if (defaults($_POST, 'contacts_batch_ignore')) { self::ignoreContact($contact_id); $count_actions++; } - if (x($_POST, 'contacts_batch_archive')) { + if (defaults($_POST, 'contacts_batch_archive')) { $r = self::archiveContact($contact_id, $orig_record); if ($r) { $count_actions++; } } - if (x($_POST, 'contacts_batch_drop')) { + if (defaults($_POST, 'contacts_batch_drop')) { self::dropContact($orig_record); $count_actions++; } @@ -172,7 +167,7 @@ class Contact extends BaseModule info(L10n::tt("%d contact edited.", "%d contacts edited.", $count_actions)); } - goaway('contacts'); + goaway('contact'); } public static function post() @@ -209,9 +204,9 @@ class Contact extends BaseModule } } - $hidden = intval($_POST['hidden']); + $hidden = defaults($_POST['hidden']); - $notify = intval($_POST['notify']); + $notify = defaults($_POST['notify']); $fetch_further_information = intval(defaults($_POST, 'fetch_further_information', 0)); @@ -224,19 +219,16 @@ class Contact extends BaseModule $info = escape_tags(trim($_POST['info'])); - $r = q("UPDATE `contact` SET `profile-id` = %d, `priority` = %d , `info` = '%s', - `hidden` = %d, `notify_new_posts` = %d, `fetch_further_information` = %d, - `ffi_keyword_blacklist` = '%s' WHERE `id` = %d AND `uid` = %d", - intval($profile_id), - intval($priority), - DBA::escape($info), - intval($hidden), - intval($notify), - intval($fetch_further_information), - DBA::escape($ffi_keyword_blacklist), - intval($contact_id), - intval(local_user()) - ); + $r = DBA::update('contact', + ['profile-id' => $profile_id, + 'priority' => $priority, + 'info' => $info, + 'hidden' => $hidden, + 'notify_new_posts' => $notify, + 'fetch_further_information' => $fetch_further_information, + 'ffi_keyword_blacklist' => $ffi_keyword_blacklist], + ['id' => $contact_id, 'uid' => local_user()]); + if (DBA::isResult($r)) { info(L10n::t('Contact updated.') . EOL); } else { @@ -263,10 +255,10 @@ class Contact extends BaseModule $uid = $contact["uid"]; if ($contact["network"] == Protocol::OSTATUS) { - $result = Contact::createFromProbe($uid, $contact["url"], false, $contact["network"]); + $result = Model\Contact::createFromProbe($uid, $contact["url"], false, $contact["network"]); if ($result['success']) { - q("UPDATE `contact` SET `subhub` = 1 WHERE `id` = %d", intval($contact_id)); + DBA::update('contact', ['subhub' => 1], ['id' => $contact_id]); } } else { // pull feed and consume it, which should subscribe to the hub. @@ -295,7 +287,7 @@ class Contact extends BaseModule $update = []; if ($data["network"] == Protocol::OSTATUS) { - $result = Contact::createFromProbe($uid, $data["url"], false); + $result = Model\Contact::createFromProbe($uid, $data["url"], false); if ($result['success']) { $update["subhub"] = true; @@ -313,7 +305,7 @@ class Contact extends BaseModule $query = ""; if (isset($data["priority"]) && ($data["priority"] != 0)) { - $query = "`priority` = " . intval($data["priority"]); + $query = "'priority' => '" . intval($data["priority"]) . "'"; } foreach ($update AS $key => $value) { @@ -321,45 +313,39 @@ class Contact extends BaseModule $query .= ", "; } - $query .= "`" . $key . "` = '" . DBA::escape($value) . "'"; + $query .= "'" . $key . "' => '" . DBA::escape($value) . "'"; } if ($query == "") { return; } - $r = q("UPDATE `contact` SET $query WHERE `id` = %d AND `uid` = %d", - intval($contact_id), - intval(local_user()) - ); + $r = DBA::update('contact', $query, ['id' => $contact_id, 'uid' => local_user()]); // Update the entry in the contact table - Contact::updateAvatar($data['photo'], local_user(), $contact_id, true); + Model\Contact::updateAvatar($data['photo'], local_user(), $contact_id, true); // Update the entry in the gcontact table - GContact::updateFromProbe($data["url"]); + Model\GContact::updateFromProbe($data["url"]); } private static function blockContact($contact_id) { - $blocked = !Contact::isBlockedByUser($contact_id, local_user()); - Contact::setBlockedForUser($contact_id, local_user(), $blocked); + $blocked = !Model\Contact::isBlockedByUser($contact_id, local_user()); + Model\Contact::setBlockedForUser($contact_id, local_user(), $blocked); } private static function ignoreContact($contact_id) { - $ignored = !Contact::isIgnoredByUser($contact_id, local_user()); - Contact::setIgnoredForUser($contact_id, local_user(), $ignored); + $ignored = !Model\Contact::isIgnoredByUser($contact_id, local_user()); + Model\Contact::setIgnoredForUser($contact_id, local_user(), $ignored); } private static function archiveContact($contact_id, $orig_record) { $archived = (($orig_record['archive']) ? 0 : 1); - $r = q("UPDATE `contact` SET `archive` = %d WHERE `id` = %d AND `uid` = %d", - intval($archived), - intval($contact_id), - intval(local_user()) - ); + $r = DBA::update('contact', ['archive' => $archived], ['id' => $contact_id, 'uid' => local_user()]); + return DBA::isResult($r); } @@ -375,8 +361,8 @@ class Contact extends BaseModule return; } - Contact::terminateFriendship($r[0], $orig_record, true); - Contact::remove($orig_record['id']); + Model\Contact::terminateFriendship($r[0], $orig_record, true); + Model\Contact::remove($orig_record['id']); } public static function content($update = 0) @@ -421,7 +407,7 @@ class Contact extends BaseModule if ($cmd === 'block') { self::blockContact($contact_id); - $blocked = Contact::isBlockedByUser($contact_id, local_user()); + $blocked = Model\Contact::isBlockedByUser($contact_id, local_user()); info(($blocked ? L10n::t('Contact has been blocked') : L10n::t('Contact has been unblocked')) . EOL); goaway('contacts/' . $contact_id); @@ -431,7 +417,7 @@ class Contact extends BaseModule if ($cmd === 'ignore') { self::ignoreContact($contact_id); - $ignored = Contact::isIgnoredByUser($contact_id, local_user()); + $ignored = Model\Contact::isIgnoredByUser($contact_id, local_user()); info(($ignored ? L10n::t('Contact has been ignored') : L10n::t('Contact has been unignored')) . EOL); goaway('contacts/' . $contact_id); @@ -451,7 +437,7 @@ class Contact extends BaseModule if ($cmd === 'drop' && ($orig_record['uid'] != 0)) { // Check if we should do HTML-based delete confirmation - if (x($_REQUEST, 'confirm')) { + if (defaults($_REQUEST, 'confirm')) { // can't take arguments in its "action" parameter // so add any arguments as hidden inputs $query = explode_querystring($a->query_string); @@ -478,7 +464,7 @@ class Contact extends BaseModule ]); } // Now check how the user responded to the confirmation query - if (x($_REQUEST, 'canceled')) { + if (defaults($_REQUEST, 'canceled')) { goaway('contacts'); } @@ -498,31 +484,31 @@ class Contact extends BaseModule $_SESSION['return_url'] = $a->query_string; - if ((x($a->data, 'contact')) && (is_array($a->data['contact']))) { + if ((defaults($a->data, 'contact')) && (is_array($a->data['contact']))) { $contact_id = $a->data['contact']['id']; $contact = $a->data['contact']; $a->page['htmlhead'] .= replace_macros(get_markup_template('contact_head.tpl'), [ - '$baseurl' => System::baseUrl(true), + '$baseurl' => $a->getBaseURL(true), ]); - $contact['blocked'] = Contact::isBlockedByUser($contact['id'], local_user()); - $contact['readonly'] = Contact::isIgnoredByUser($contact['id'], local_user()); + $contact['blocked'] = Model\Contact::isBlockedByUser($contact['id'], local_user()); + $contact['readonly'] = Model\Contact::isIgnoredByUser($contact['id'], local_user()); $dir_icon = ''; $relation_text = ''; switch ($contact['rel']) { - case Contact::FRIEND: + case Model\Contact::FRIEND: $dir_icon = 'images/lrarrow.gif'; $relation_text = L10n::t('You are mutual friends with %s'); break; - case Contact::FOLLOWER; + case Model\Contact::FOLLOWER; $dir_icon = 'images/larrow.gif'; $relation_text = L10n::t('You are sharing with %s'); break; - case Contact::SHARING; + case Model\Contact::SHARING; $dir_icon = 'images/rarrow.gif'; $relation_text = L10n::t('%s is sharing with you'); break; @@ -541,7 +527,7 @@ class Contact extends BaseModule $relation_text = sprintf($relation_text, htmlentities($contact['name'])); - $url = Contact::magicLink($contact['url']); + $url = Model\Contact::magicLink($contact['url']); if (strpos($url, 'redir/') === 0) { $sparkle = ' class="sparkle" '; } else { @@ -594,13 +580,13 @@ class Contact extends BaseModule /// @todo Only show the following link with DFRN when the remote version supports it $follow = ''; $follow_text = ''; - if (in_array($contact['rel'], [Contact::FRIEND, Contact::SHARING])) { + if (in_array($contact['rel'], [Model\Contact::FRIEND, Model\Contact::SHARING])) { if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) { - $follow = System::baseUrl(true) . "/unfollow?url=" . urlencode($contact["url"]); + $follow = $a->getBaseURL(true) . "/unfollow?url=" . urlencode($contact["url"]); $follow_text = L10n::t("Disconnect/Unfollow"); } } else { - $follow = System::baseUrl(true) . "/follow?url=" . urlencode($contact["url"]); + $follow = $a->getBaseURL(true) . "/follow?url=" . urlencode($contact["url"]); $follow_text = L10n::t("Connect/Follow"); } @@ -669,7 +655,7 @@ class Contact extends BaseModule '$url' => $url, '$profileurllabel' => L10n::t('Profile URL'), '$profileurl' => $contact['url'], - '$account_type' => Contact::getAccountType($contact), + '$account_type' => Model\Contact::getAccountType($contact), '$location' => BBCode::convert($contact["location"]), '$location_label' => L10n::t("Location:"), '$xmpp' => BBCode::convert($contact["xmpp"]), @@ -719,8 +705,8 @@ class Contact extends BaseModule $sql_extra .= sprintf(" AND `network` != '%s' ", Protocol::PHANTOM); - $search = x($_GET, 'search') ? notags(trim($_GET['search'])) : ''; - $nets = x($_GET, 'nets' ) ? notags(trim($_GET['nets'])) : ''; + $search = defaults($_GET, 'search') ? notags(trim($_GET['search'])) : ''; + $nets = defaults($_GET, 'nets' ) ? notags(trim($_GET['nets'])) : ''; $tabs = [ [ @@ -733,7 +719,7 @@ class Contact extends BaseModule ], [ 'label' => L10n::t('All Contacts'), - 'url' => 'contacts/all', + 'url' => 'contact/all', 'sel' => ($all) ? 'active' : '', 'title' => L10n::t('Show all contacts'), 'id' => 'showall-tab', @@ -741,7 +727,7 @@ class Contact extends BaseModule ], [ 'label' => L10n::t('Unblocked'), - 'url' => 'contacts', + 'url' => 'contact', 'sel' => ((!$all) && (!$blocked) && (!$hidden) && (!$search) && (!$nets) && (!$ignored) && (!$archived)) ? 'active' : '', 'title' => L10n::t('Only show unblocked contacts'), 'id' => 'showunblocked-tab', @@ -749,7 +735,7 @@ class Contact extends BaseModule ], [ 'label' => L10n::t('Blocked'), - 'url' => 'contacts/blocked', + 'url' => 'contact/blocked', 'sel' => ($blocked) ? 'active' : '', 'title' => L10n::t('Only show blocked contacts'), 'id' => 'showblocked-tab', @@ -757,7 +743,7 @@ class Contact extends BaseModule ], [ 'label' => L10n::t('Ignored'), - 'url' => 'contacts/ignored', + 'url' => 'contact/ignored', 'sel' => ($ignored) ? 'active' : '', 'title' => L10n::t('Only show ignored contacts'), 'id' => 'showignored-tab', @@ -765,7 +751,7 @@ class Contact extends BaseModule ], [ 'label' => L10n::t('Archived'), - 'url' => 'contacts/archived', + 'url' => 'contact/archived', 'sel' => ($archived) ? 'active' : '', 'title' => L10n::t('Only show archived contacts'), 'id' => 'showarchived-tab', @@ -773,7 +759,7 @@ class Contact extends BaseModule ], [ 'label' => L10n::t('Hidden'), - 'url' => 'contacts/hidden', + 'url' => 'contact/hidden', 'sel' => ($hidden) ? 'active' : '', 'title' => L10n::t('Only show hidden contacts'), 'id' => 'showhidden-tab', @@ -798,7 +784,7 @@ class Contact extends BaseModule $sql_extra .= sprintf(" AND network = '%s' ", DBA::escape($nets)); } - $sql_extra2 = ((($sort_type > 0) && ($sort_type <= Contact::FRIEND)) ? sprintf(" AND `rel` = %d ", intval($sort_type)) : ''); + $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 ", @@ -820,8 +806,8 @@ class Contact extends BaseModule ); if (DBA::isResult($r)) { foreach ($r as $rr) { - $rr['blocked'] = Contact::isBlockedByUser($rr['id'], local_user()); - $rr['readonly'] = Contact::isIgnoredByUser($rr['id'], local_user()); + $rr['blocked'] = Model\Contact::isBlockedByUser($rr['id'], local_user()); + $rr['readonly'] = Model\Contact::isIgnoredByUser($rr['id'], local_user()); $contacts[] = self::getContactTemplateVars($rr); } } @@ -863,7 +849,8 @@ class Contact extends BaseModule * @param array $contact The contact array * @param int $active_tab 1 if tab should be marked as active * - * @return string + * @return string | HTML string of the contact page tabs buttons. + */ public static function getTabsHTML($a, $contact, $active_tab) { @@ -871,7 +858,7 @@ class Contact extends BaseModule $tabs = [ [ 'label' => L10n::t('Status'), - 'url' => "contacts/" . $contact['id'] . "/conversations", + 'url' => "contact/" . $contact['id'] . "/conversations", 'sel' => (($active_tab == 1) ? 'active' : ''), 'title' => L10n::t('Conversations started by this contact'), 'id' => 'status-tab', @@ -879,7 +866,7 @@ class Contact extends BaseModule ], [ 'label' => L10n::t('Posts and Comments'), - 'url' => "contacts/" . $contact['id'] . "/posts", + 'url' => "contact/" . $contact['id'] . "/posts", 'sel' => (($active_tab == 2) ? 'active' : ''), 'title' => L10n::t('Status Messages and Posts'), 'id' => 'posts-tab', @@ -887,7 +874,7 @@ class Contact extends BaseModule ], [ 'label' => L10n::t('Profile'), - 'url' => "contacts/" . $contact['id'], + 'url' => "contact/" . $contact['id'], 'sel' => (($active_tab == 3) ? 'active' : ''), 'title' => L10n::t('Profile Details'), 'id' => 'profile-tab', @@ -896,7 +883,7 @@ class Contact extends BaseModule ]; // Show this tab only if there is visible friend list - $x = GContact::countAllFriends(local_user(), $contact['id']); + $x = Model\GContact::countAllFriends(local_user(), $contact['id']); if ($x) { $tabs[] = ['label' => L10n::t('Contacts'), 'url' => "allfriends/" . $contact['id'], @@ -907,7 +894,7 @@ class Contact extends BaseModule } // Show this tab only if there is visible common friend list - $common = GContact::countCommonFriends(local_user(), $contact['id']); + $common = Model\GContact::countCommonFriends(local_user(), $contact['id']); if ($common) { $tabs[] = ['label' => L10n::t('Common Friends'), 'url' => "common/loc/" . local_user() . "/" . $contact['id'], @@ -965,7 +952,7 @@ class Contact extends BaseModule if (DBA::isResult($contact)) { $a->page['aside'] = ""; - $profiledata = Contact::getDetailsByURL($contact["url"]); + $profiledata = Model\Contact::getDetailsByURL($contact["url"]); if (local_user()) { if (in_array($profiledata["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { @@ -973,8 +960,8 @@ class Contact extends BaseModule } } - Profile::load($a, "", 0, $profiledata, true); - $o .= Contact::getPostsFromUrl($contact["url"], true, $update); + Model\Profile::load($a, "", 0, $profiledata, true); + $o .= Model\Contact::getPostsFromUrl($contact["url"], true, $update); } return $o; @@ -989,7 +976,7 @@ class Contact extends BaseModule if (DBA::isResult($contact)) { $a->page['aside'] = ""; - $profiledata = Contact::getDetailsByURL($contact["url"]); + $profiledata = Model\Contact::getDetailsByURL($contact["url"]); if (local_user()) { if (in_array($profiledata["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { @@ -997,8 +984,8 @@ class Contact extends BaseModule } } - Profile::load($a, "", 0, $profiledata, true); - $o .= Contact::getPostsFromUrl($contact["url"]); + Model\Profile::load($a, "", 0, $profiledata, true); + $o .= Model\Contact::getPostsFromUrl($contact["url"]); } return $o; @@ -1010,17 +997,17 @@ class Contact extends BaseModule $alt_text = ''; switch ($rr['rel']) { - case Contact::FRIEND: + case Model\Contact::FRIEND: $dir_icon = 'images/lrarrow.gif'; $alt_text = L10n::t('Mutual Friendship'); break; - case Contact::FOLLOWER; + case Model\Contact::FOLLOWER; $dir_icon = 'images/larrow.gif'; $alt_text = L10n::t('is a fan of yours'); break; - case Contact::SHARING; + case Model\Contact::SHARING; $dir_icon = 'images/rarrow.gif'; $alt_text = L10n::t('you are a fan of'); break; @@ -1029,7 +1016,7 @@ class Contact extends BaseModule break; } - $url = Contact::magicLink($rr['url']); + $url = Model\Contact::magicLink($rr['url']); if (strpos($url, 'redir/') === 0) { $sparkle = ' class="sparkle" '; @@ -1047,14 +1034,14 @@ class Contact extends BaseModule return [ 'img_hover' => L10n::t('Visit %s\'s profile [%s]', $rr['name'], $rr['url']), 'edit_hover' => L10n::t('Edit contact'), - 'photo_menu' => Contact::photoMenu($rr), + 'photo_menu' => Model\Contact::photoMenu($rr), 'id' => $rr['id'], 'alt_text' => $alt_text, 'dir_icon' => $dir_icon, 'thumb' => ProxyUtils::proxifyUrl($rr['thumb'], false, ProxyUtils::SIZE_THUMB), 'name' => htmlentities($rr['name']), 'username' => htmlentities($rr['name']), - 'account_type' => Contact::getAccountType($rr), + 'account_type' => Model\Contact::getAccountType($rr), 'sparkle' => $sparkle, 'itemurl' => (($rr['addr'] != "") ? $rr['addr'] : $rr['url']), 'url' => $url, @@ -1090,7 +1077,7 @@ class Contact extends BaseModule if ($poll_enabled) { $contact_actions['update'] = [ 'label' => L10n::t('Update now'), - 'url' => 'contacts/' . $contact['id'] . '/update', + 'url' => 'contact/' . $contact['id'] . '/update', 'title' => '', 'sel' => '', 'id' => 'update', @@ -1099,7 +1086,7 @@ class Contact extends BaseModule $contact_actions['block'] = [ 'label' => (intval($contact['blocked']) ? L10n::t('Unblock') : L10n::t('Block')), - 'url' => 'contacts/' . $contact['id'] . '/block', + 'url' => 'contact/' . $contact['id'] . '/block', 'title' => L10n::t('Toggle Blocked status'), 'sel' => (intval($contact['blocked']) ? 'active' : ''), 'id' => 'toggle-block', @@ -1107,7 +1094,7 @@ class Contact extends BaseModule $contact_actions['ignore'] = [ 'label' => (intval($contact['readonly']) ? L10n::t('Unignore') : L10n::t('Ignore')), - 'url' => 'contacts/' . $contact['id'] . '/ignore', + 'url' => 'contact/' . $contact['id'] . '/ignore', 'title' => L10n::t('Toggle Ignored status'), 'sel' => (intval($contact['readonly']) ? 'active' : ''), 'id' => 'toggle-ignore', @@ -1116,7 +1103,7 @@ class Contact extends BaseModule if ($contact['uid'] != 0) { $contact_actions['archive'] = [ 'label' => (intval($contact['archive']) ? L10n::t('Unarchive') : L10n::t('Archive')), - 'url' => 'contacts/' . $contact['id'] . '/archive', + 'url' => 'contact/' . $contact['id'] . '/archive', 'title' => L10n::t('Toggle Archive status'), 'sel' => (intval($contact['archive']) ? 'active' : ''), 'id' => 'toggle-archive', @@ -1124,7 +1111,7 @@ class Contact extends BaseModule $contact_actions['delete'] = [ 'label' => L10n::t('Delete'), - 'url' => 'contacts/' . $contact['id'] . '/drop', + 'url' => 'contact/' . $contact['id'] . '/drop', 'title' => L10n::t('Delete contact'), 'sel' => '', 'id' => 'delete', diff --git a/src/Module/Contacts.php b/src/Module/Contacts.php deleted file mode 100644 index eb21b3b3e..000000000 --- a/src/Module/Contacts.php +++ /dev/null @@ -1,1136 +0,0 @@ -page, 'aside')) { - $a->page['aside'] = ''; - } - - $contact_id = null; - $contact = null; - if ((($a->argc == 2) && intval($a->argv[1])) || (($a->argc == 3) && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations']))) { - $contact_id = intval($a->argv[1]); - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]); - - if (!DBA::isResult($contact)) { - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => 0]); - } - - // Don't display contacts that are about to be deleted - if ($contact['network'] == Protocol::PHANTOM) { - $contact = false; - } - } - - if (DBA::isResult($contact)) { - if ($contact['self']) { - if (($a->argc == 3) && intval($a->argv[1]) && in_array($a->argv[2], ['posts', 'conversations'])) { - goaway('profile/' . $contact['nick']); - } else { - goaway('profile/' . $contact['nick'] . '?tab=profile'); - } - } - - $a->data['contact'] = $contact; - - if (($a->data['contact']['network'] != "") && ($a->data['contact']['network'] != Protocol::DFRN)) { - $networkname = format_network_name($a->data['contact']['network'], $a->data['contact']['url']); - } else { - $networkname = ''; - } - - /// @TODO Add nice spaces - $vcard_widget = replace_macros(get_markup_template("vcard-widget.tpl"), [ - '$name' => htmlentities($a->data['contact']['name']), - '$photo' => $a->data['contact']['photo'], - '$url' => Contact::MagicLink($a->data['contact']['url']), - '$addr' => (($a->data['contact']['addr'] != "") ? ($a->data['contact']['addr']) : ""), - '$network_name' => $networkname, - '$network' => L10n::t('Network:'), - '$account_type' => Contact::getAccountType($a->data['contact']) - ]); - - $findpeople_widget = ''; - $follow_widget = ''; - $networks_widget = ''; - } else { - $vcard_widget = ''; - $networks_widget = Widget::networks('contacts', $nets); - if (isset($_GET['add'])) { - $follow_widget = Widget::follow($_GET['add']); - } else { - $follow_widget = Widget::follow(); - } - - $findpeople_widget = Widget::findPeople(); - } - - if ($contact['uid'] != 0) { - $groups_widget = Group::sidebarWidget('contacts', 'group', 'full', 'everyone', $contact_id); - } else { - $groups_widget = null; - } - - $a->page['aside'] .= replace_macros(get_markup_template("contacts-widget-sidebar.tpl"), [ - '$vcard_widget' => $vcard_widget, - '$findpeople_widget' => $findpeople_widget, - '$follow_widget' => $follow_widget, - '$groups_widget' => $groups_widget, - '$networks_widget' => $networks_widget - ]); - - $base = System::baseUrl(); - $tpl = get_markup_template("contacts-head.tpl"); - $a->page['htmlhead'] .= replace_macros($tpl, [ - '$baseurl' => System::baseUrl(true), - '$base' => $base - ]); - } - - private static function batchActions(App $a) - { - if (empty($_POST['contact_batch']) || !is_array($_POST['contact_batch'])) { - return; - } - - $contacts_id = $_POST['contact_batch']; - - $orig_records = q("SELECT * FROM `contact` WHERE `id` IN (%s) AND `uid` = %d AND `self` = 0", - implode(",", $contacts_id), - intval(local_user()) - ); - - $count_actions = 0; - foreach ($orig_records as $orig_record) { - $contact_id = $orig_record['id']; - if (x($_POST, 'contacts_batch_update')) { - self::updateContactFromPoll($contact_id); - $count_actions++; - } - if (x($_POST, 'contacts_batch_block')) { - self::blockContact($contact_id); - $count_actions++; - } - if (x($_POST, 'contacts_batch_ignore')) { - self::ignoreContact($contact_id); - $count_actions++; - } - if (x($_POST, 'contacts_batch_archive')) { - $r = self::archiveContact($contact_id, $orig_record); - if ($r) { - $count_actions++; - } - } - if (x($_POST, 'contacts_batch_drop')) { - self::dropContact($orig_record); - $count_actions++; - } - } - if ($count_actions > 0) { - info(L10n::tt("%d contact edited.", "%d contacts edited.", $count_actions)); - } - - goaway('contacts'); - } - - public static function post() - { - $a = self::getApp(); - - if (!local_user()) { - return; - } - - if ($a->argv[1] === "batch") { - self::batchActions($a); - return; - } - - $contact_id = intval($a->argv[1]); - if (!$contact_id) { - return; - } - - if (!DBA::exists('contact', ['id' => $contact_id, 'uid' => local_user()])) { - notice(L10n::t('Could not access contact record.') . EOL); - goaway('contacts'); - return; // NOTREACHED - } - - Addon::callHooks('contact_edit_post', $_POST); - - $profile_id = intval(defaults($_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); - return; - } - } - - $hidden = intval($_POST['hidden']); - - $notify = intval($_POST['notify']); - - $fetch_further_information = intval(defaults($_POST, 'fetch_further_information', 0)); - - $ffi_keyword_blacklist = escape_tags(trim(defaults($_POST, 'ffi_keyword_blacklist', ''))); - - $priority = intval(defaults($_POST, 'poll', 0)); - if ($priority > 5 || $priority < 0) { - $priority = 0; - } - - $info = escape_tags(trim($_POST['info'])); - - $r = q("UPDATE `contact` SET `profile-id` = %d, `priority` = %d , `info` = '%s', - `hidden` = %d, `notify_new_posts` = %d, `fetch_further_information` = %d, - `ffi_keyword_blacklist` = '%s' WHERE `id` = %d AND `uid` = %d", - intval($profile_id), - intval($priority), - DBA::escape($info), - intval($hidden), - intval($notify), - intval($fetch_further_information), - DBA::escape($ffi_keyword_blacklist), - intval($contact_id), - intval(local_user()) - ); - if (DBA::isResult($r)) { - info(L10n::t('Contact updated.') . EOL); - } else { - notice(L10n::t('Failed to update contact record.') . EOL); - } - - $contact = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => local_user()]); - if (DBA::isResult($contact)) { - $a->data['contact'] = $contact; - } - - return; - } - - /* contact actions */ - - private static function updateContactFromPoll($contact_id) - { - $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); - if (!DBA::isResult($contact)) { - return; - } - - $uid = $contact["uid"]; - - if ($contact["network"] == Protocol::OSTATUS) { - $result = Contact::createFromProbe($uid, $contact["url"], false, $contact["network"]); - - if ($result['success']) { - q("UPDATE `contact` SET `subhub` = 1 WHERE `id` = %d", intval($contact_id)); - } - } else { - // pull feed and consume it, which should subscribe to the hub. - Worker::add(PRIORITY_HIGH, "OnePoll", $contact_id, "force"); - } - } - - private static function updateContactFromProbe($contact_id) - { - $contact = DBA::selectFirst('contact', ['uid', 'url', 'network'], ['id' => $contact_id, 'uid' => local_user()]); - 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"]; - $update = []; - - if ($data["network"] == Protocol::OSTATUS) { - $result = Contact::createFromProbe($uid, $data["url"], false); - - if ($result['success']) { - $update["subhub"] = true; - } - } - - foreach ($updatefields AS $field) { - if (isset($data[$field]) && ($data[$field] != "")) { - $update[$field] = $data[$field]; - } - } - - $update["nurl"] = normalise_link($data["url"]); - - $query = ""; - - if (isset($data["priority"]) && ($data["priority"] != 0)) { - $query = "`priority` = " . intval($data["priority"]); - } - - foreach ($update AS $key => $value) { - if ($query != "") { - $query .= ", "; - } - - $query .= "`" . $key . "` = '" . DBA::escape($value) . "'"; - } - - if ($query == "") { - return; - } - - $r = q("UPDATE `contact` SET $query WHERE `id` = %d AND `uid` = %d", - intval($contact_id), - intval(local_user()) - ); - - // Update the entry in the contact table - Contact::updateAvatar($data['photo'], local_user(), $contact_id, true); - - // Update the entry in the gcontact table - GContact::updateFromProbe($data["url"]); - } - - private static function blockContact($contact_id) - { - $blocked = !Contact::isBlockedByUser($contact_id, local_user()); - Contact::setBlockedForUser($contact_id, local_user(), $blocked); - } - - private static function ignoreContact($contact_id) - { - $ignored = !Contact::isIgnoredByUser($contact_id, local_user()); - Contact::setIgnoredForUser($contact_id, local_user(), $ignored); - } - - private static function archiveContact($contact_id, $orig_record) - { - $archived = (($orig_record['archive']) ? 0 : 1); - $r = q("UPDATE `contact` SET `archive` = %d WHERE `id` = %d AND `uid` = %d", - intval($archived), - intval($contact_id), - intval(local_user()) - ); - return DBA::isResult($r); - } - - private static function dropContact($orig_record) - { - $a = get_app(); - - $r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` - WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1", - intval($a->user['uid']) - ); - if (!DBA::isResult($r)) { - return; - } - - Contact::terminateFriendship($r[0], $orig_record, true); - Contact::remove($orig_record['id']); - } - - public static function content($update = 0) - { - $a = self::getApp(); - $sort_type = 0; - $o = ''; - Nav::setSelected('contacts'); - - if (!local_user()) { - notice(L10n::t('Permission denied.') . EOL); - return Login::form(); - } - - if ($a->argc == 3) { - $contact_id = intval($a->argv[1]); - if (!$contact_id) { - return; - } - - $cmd = $a->argv[2]; - - $orig_record = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => [0, local_user()], 'self' => false]); - if (!DBA::isResult($orig_record)) { - notice(L10n::t('Could not access contact record.') . EOL); - goaway('contacts'); - return; // NOTREACHED - } - - if ($cmd === 'update' && ($orig_record['uid'] != 0)) { - self::updateContactFromPoll($contact_id); - goaway('contacts/' . $contact_id); - // NOTREACHED - } - - if ($cmd === 'updateprofile' && ($orig_record['uid'] != 0)) { - self::updateContactFromProbe($contact_id); - goaway('crepair/' . $contact_id); - // NOTREACHED - } - - if ($cmd === 'block') { - self::blockContact($contact_id); - - $blocked = Contact::isBlockedByUser($contact_id, local_user()); - info(($blocked ? L10n::t('Contact has been blocked') : L10n::t('Contact has been unblocked')) . EOL); - - goaway('contacts/' . $contact_id); - return; // NOTREACHED - } - - if ($cmd === 'ignore') { - self::ignoreContact($contact_id); - - $ignored = Contact::isIgnoredByUser($contact_id, local_user()); - info(($ignored ? L10n::t('Contact has been ignored') : L10n::t('Contact has been unignored')) . EOL); - - goaway('contacts/' . $contact_id); - return; // NOTREACHED - } - - if ($cmd === 'archive' && ($orig_record['uid'] != 0)) { - $r = self::archiveContact($contact_id, $orig_record); - if ($r) { - $archived = (($orig_record['archive']) ? 0 : 1); - info((($archived) ? L10n::t('Contact has been archived') : L10n::t('Contact has been unarchived')) . EOL); - } - - goaway('contacts/' . $contact_id); - return; // NOTREACHED - } - - if ($cmd === 'drop' && ($orig_record['uid'] != 0)) { - // Check if we should do HTML-based delete confirmation - if (x($_REQUEST, 'confirm')) { - // can't take arguments in its "action" parameter - // so add any arguments as hidden inputs - $query = explode_querystring($a->query_string); - $inputs = []; - foreach ($query['args'] as $arg) { - if (strpos($arg, 'confirm=') === false) { - $arg_parts = explode('=', $arg); - $inputs[] = ['name' => $arg_parts[0], 'value' => $arg_parts[1]]; - } - } - - $a->page['aside'] = ''; - - return replace_macros(get_markup_template('contact_drop_confirm.tpl'), [ - '$header' => L10n::t('Drop contact'), - '$contact' => self::getContactTemplateVars($orig_record), - '$method' => 'get', - '$message' => L10n::t('Do you really want to delete this contact?'), - '$extra_inputs' => $inputs, - '$confirm' => L10n::t('Yes'), - '$confirm_url' => $query['base'], - '$confirm_name' => 'confirmed', - '$cancel' => L10n::t('Cancel'), - ]); - } - // Now check how the user responded to the confirmation query - if (x($_REQUEST, 'canceled')) { - goaway('contacts'); - } - - self::dropContact($orig_record); - info(L10n::t('Contact has been removed.') . EOL); - - goaway('contacts'); - return; // NOTREACHED - } - if ($cmd === 'posts') { - return self::getPostsHTML($a, $contact_id); - } - if ($cmd === 'conversations') { - return self::getConversationsHMTL($a, $contact_id, $update); - } - } - - $_SESSION['return_url'] = $a->query_string; - - if ((x($a->data, 'contact')) && (is_array($a->data['contact']))) { - $contact_id = $a->data['contact']['id']; - $contact = $a->data['contact']; - - $a->page['htmlhead'] .= replace_macros(get_markup_template('contact_head.tpl'), [ - '$baseurl' => System::baseUrl(true), - ]); - - $contact['blocked'] = Contact::isBlockedByUser($contact['id'], local_user()); - $contact['readonly'] = Contact::isIgnoredByUser($contact['id'], local_user()); - - $dir_icon = ''; - $relation_text = ''; - switch ($contact['rel']) { - case Contact::FRIEND: - $dir_icon = 'images/lrarrow.gif'; - $relation_text = L10n::t('You are mutual friends with %s'); - break; - - case Contact::FOLLOWER; - $dir_icon = 'images/larrow.gif'; - $relation_text = L10n::t('You are sharing with %s'); - break; - - case Contact::SHARING; - $dir_icon = 'images/rarrow.gif'; - $relation_text = L10n::t('%s is sharing with you'); - break; - - default: - break; - } - - if ($contact['uid'] == 0) { - $relation_text = ''; - } - - if (!in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])) { - $relation_text = ""; - } - - $relation_text = sprintf($relation_text, htmlentities($contact['name'])); - - $url = Contact::magicLink($contact['url']); - if (strpos($url, 'redir/') === 0) { - $sparkle = ' class="sparkle" '; - } else { - $sparkle = ''; - } - - $insecure = L10n::t('Private communications are not available for this contact.'); - - $last_update = (($contact['last-update'] <= NULL_DATE) ? L10n::t('Never') : DateTimeFormat::local($contact['last-update'], 'D, j M Y, g:i A')); - - if ($contact['last-update'] > NULL_DATE) { - $last_update .= ' ' . (($contact['last-update'] <= $contact['success_update']) ? L10n::t("\x28Update was successful\x29") : L10n::t("\x28Update was not successful\x29")); - } - $lblsuggest = (($contact['network'] === Protocol::DFRN) ? L10n::t('Suggest friends') : ''); - - $poll_enabled = in_array($contact['network'], [Protocol::DFRN, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL]); - - $nettype = L10n::t('Network type: %s', ContactSelector::networkToName($contact['network'], $contact["url"])); - - // tabs - $tab_str = self::getTabsHTML($a, $contact, 3); - - $lost_contact = (($contact['archive'] && $contact['term-date'] > NULL_DATE && $contact['term-date'] < DateTimeFormat::utcNow()) ? L10n::t('Communications lost with this contact!') : ''); - - $fetch_further_information = null; - if ($contact['network'] == Protocol::FEED) { - $fetch_further_information = [ - 'fetch_further_information', - L10n::t('Fetch further information for feeds'), - $contact['fetch_further_information'], - L10n::t("Fetch information like preview pictures, title and teaser from the feed item. You can activate this if the feed doesn't contain much text. Keywords are taken from the meta header in the feed item and are posted as hash tags."), - ['0' => L10n::t('Disabled'), - '1' => L10n::t('Fetch information'), - '3' => L10n::t('Fetch keywords'), - '2' => L10n::t('Fetch information and keywords') - ] - ]; - } - - $poll_interval = null; - if (in_array($contact['network'], [Protocol::FEED, Protocol::MAIL])) { - $poll_interval = ContactSelector::pollInterval($contact['priority'], (!$poll_enabled)); - } - - $profile_select = null; - if ($contact['network'] == Protocol::DFRN) { - $profile_select = ContactSelector::profileAssign($contact['profile-id'], (($contact['network'] !== Protocol::DFRN) ? true : false)); - } - - /// @todo Only show the following link with DFRN when the remote version supports it - $follow = ''; - $follow_text = ''; - if (in_array($contact['rel'], [Contact::FRIEND, Contact::SHARING])) { - if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) { - $follow = System::baseUrl(true) . "/unfollow?url=" . urlencode($contact["url"]); - $follow_text = L10n::t("Disconnect/Unfollow"); - } - } else { - $follow = System::baseUrl(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); - - if ($contact['uid'] != 0) { - $lbl_vis1 = L10n::t('Profile Visibility'); - $lbl_info1 = L10n::t('Contact Information / Notes'); - $contact_settings_label = L10n::t('Contact Settings'); - } else { - $lbl_vis1 = null; - $lbl_info1 = null; - $contact_settings_label = null; - } - - $tpl = get_markup_template("contact_edit.tpl"); - $o .= replace_macros($tpl, [ - '$header' => L10n::t("Contact"), - '$tab_str' => $tab_str, - '$submit' => L10n::t('Submit'), - '$lbl_vis1' => $lbl_vis1, - '$lbl_vis2' => L10n::t('Please choose the profile you would like to display to %s when viewing your profile securely.', $contact['name']), - '$lbl_info1' => $lbl_info1, - '$lbl_info2' => L10n::t('Their personal note'), - '$reason' => trim(notags($contact['reason'])), - '$infedit' => L10n::t('Edit contact notes'), - '$common_link' => 'common/loc/' . local_user() . '/' . $contact['id'], - '$relation_text' => $relation_text, - '$visit' => L10n::t('Visit %s\'s profile [%s]', $contact['name'], $contact['url']), - '$blockunblock' => L10n::t('Block/Unblock contact'), - '$ignorecont' => L10n::t('Ignore contact'), - '$lblcrepair' => L10n::t("Repair URL settings"), - '$lblrecent' => L10n::t('View conversations'), - '$lblsuggest' => $lblsuggest, - '$nettype' => $nettype, - '$poll_interval' => $poll_interval, - '$poll_enabled' => $poll_enabled, - '$lastupdtext' => L10n::t('Last update:'), - '$lost_contact' => $lost_contact, - '$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')), - '$ignore_text' => ($contact['readonly'] ? L10n::t('Unignore') : L10n::t('Ignore')), - '$insecure' => (in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::MAIL, Protocol::DIASPORA]) ? '' : $insecure), - '$info' => $contact['info'], - '$cinfo' => ['info', '', $contact['info'], ''], - '$blocked' => ($contact['blocked'] ? L10n::t('Currently blocked') : ''), - '$ignored' => ($contact['readonly'] ? L10n::t('Currently ignored') : ''), - '$archived' => ($contact['archive'] ? L10n::t('Currently archived') : ''), - '$pending' => ($contact['pending'] ? L10n::t('Awaiting connection acknowledge') : ''), - '$hidden' => ['hidden', L10n::t('Hide this contact from others'), ($contact['hidden'] == 1), L10n::t('Replies/likes to your public posts may still be visible')], - '$notify' => ['notify', L10n::t('Notification for new posts'), ($contact['notify_new_posts'] == 1), L10n::t('Send a notification of every new post of this contact')], - '$fetch_further_information' => $fetch_further_information, - '$ffi_keyword_blacklist' => $contact['ffi_keyword_blacklist'], - '$ffi_keyword_blacklist' => ['ffi_keyword_blacklist', L10n::t('Blacklisted keywords'), $contact['ffi_keyword_blacklist'], L10n::t('Comma separated list of keywords that should not be converted to hashtags, when "Fetch information and keywords" is selected')], - '$photo' => $contact['photo'], - '$name' => htmlentities($contact['name']), - '$dir_icon' => $dir_icon, - '$sparkle' => $sparkle, - '$url' => $url, - '$profileurllabel' => L10n::t('Profile URL'), - '$profileurl' => $contact['url'], - '$account_type' => Contact::getAccountType($contact), - '$location' => BBCode::convert($contact["location"]), - '$location_label' => L10n::t("Location:"), - '$xmpp' => BBCode::convert($contact["xmpp"]), - '$xmpp_label' => L10n::t("XMPP:"), - '$about' => BBCode::convert($contact["about"], false), - '$about_label' => L10n::t("About:"), - '$keywords' => $contact["keywords"], - '$keywords_label' => L10n::t("Tags:"), - '$contact_action_button' => L10n::t("Actions"), - '$contact_actions' => $contact_actions, - '$contact_status' => L10n::t("Status"), - '$contact_settings_label' => $contact_settings_label, - '$contact_profile_label' => L10n::t("Profile"), - ]); - - $arr = ['contact' => $contact, 'output' => $o]; - - Addon::callHooks('contact_edit', $arr); - - return $arr['output']; - } - - $blocked = false; - $hidden = false; - $ignored = false; - $archived = false; - $all = false; - - if (($a->argc == 2) && ($a->argv[1] === 'all')) { - $sql_extra = ''; - $all = true; - } elseif (($a->argc == 2) && ($a->argv[1] === 'blocked')) { - $sql_extra = " AND `blocked` = 1 "; - $blocked = true; - } elseif (($a->argc == 2) && ($a->argv[1] === 'hidden')) { - $sql_extra = " AND `hidden` = 1 "; - $hidden = true; - } elseif (($a->argc == 2) && ($a->argv[1] === 'ignored')) { - $sql_extra = " AND `readonly` = 1 "; - $ignored = true; - } elseif (($a->argc == 2) && ($a->argv[1] === 'archived')) { - $sql_extra = " AND `archive` = 1 "; - $archived = true; - } else { - $sql_extra = " AND `blocked` = 0 "; - } - - $sql_extra .= sprintf(" AND `network` != '%s' ", Protocol::PHANTOM); - - $search = x($_GET, 'search') ? notags(trim($_GET['search'])) : ''; - $nets = x($_GET, 'nets' ) ? notags(trim($_GET['nets'])) : ''; - - $tabs = [ - [ - 'label' => L10n::t('Suggestions'), - 'url' => 'suggest', - 'sel' => '', - 'title' => L10n::t('Suggest potential friends'), - 'id' => 'suggestions-tab', - 'accesskey' => 'g', - ], - [ - 'label' => L10n::t('All Contacts'), - 'url' => 'contacts/all', - 'sel' => ($all) ? 'active' : '', - 'title' => L10n::t('Show all contacts'), - 'id' => 'showall-tab', - 'accesskey' => 'l', - ], - [ - 'label' => L10n::t('Unblocked'), - 'url' => 'contacts', - 'sel' => ((!$all) && (!$blocked) && (!$hidden) && (!$search) && (!$nets) && (!$ignored) && (!$archived)) ? 'active' : '', - 'title' => L10n::t('Only show unblocked contacts'), - 'id' => 'showunblocked-tab', - 'accesskey' => 'o', - ], - [ - 'label' => L10n::t('Blocked'), - 'url' => 'contacts/blocked', - 'sel' => ($blocked) ? 'active' : '', - 'title' => L10n::t('Only show blocked contacts'), - 'id' => 'showblocked-tab', - 'accesskey' => 'b', - ], - [ - 'label' => L10n::t('Ignored'), - 'url' => 'contacts/ignored', - 'sel' => ($ignored) ? 'active' : '', - 'title' => L10n::t('Only show ignored contacts'), - 'id' => 'showignored-tab', - 'accesskey' => 'i', - ], - [ - 'label' => L10n::t('Archived'), - 'url' => 'contacts/archived', - 'sel' => ($archived) ? 'active' : '', - 'title' => L10n::t('Only show archived contacts'), - 'id' => 'showarchived-tab', - 'accesskey' => 'y', - ], - [ - 'label' => L10n::t('Hidden'), - 'url' => 'contacts/hidden', - 'sel' => ($hidden) ? 'active' : '', - 'title' => L10n::t('Only show hidden contacts'), - 'id' => 'showhidden-tab', - 'accesskey' => 'h', - ], - ]; - - $tab_tpl = get_markup_template('common_tabs.tpl'); - $t = replace_macros($tab_tpl, ['$tabs' => $tabs]); - - $total = 0; - $searching = false; - $search_hdr = null; - if ($search) { - $searching = true; - $search_hdr = $search; - $search_txt = DBA::escape(protect_sprintf(preg_quote($search))); - $sql_extra .= " AND (name REGEXP '$search_txt' OR url REGEXP '$search_txt' OR nick REGEXP '$search_txt') "; - } - - if ($nets) { - $sql_extra .= sprintf(" AND network = '%s' ", DBA::escape($nets)); - } - - $sql_extra2 = ((($sort_type > 0) && ($sort_type <= 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 ", - intval($_SESSION['uid']) - ); - if (DBA::isResult($r)) { - $a->setPagerTotal($r[0]['total']); - $total = $r[0]['total']; - } - - $sql_extra3 = Widget::unavailableNetworks(); - - $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 ", - intval($_SESSION['uid']), - intval($a->pager['start']), - intval($a->pager['itemspage']) - ); - if (DBA::isResult($r)) { - foreach ($r as $rr) { - $rr['blocked'] = Contact::isBlockedByUser($rr['id'], local_user()); - $rr['readonly'] = Contact::isIgnoredByUser($rr['id'], local_user()); - $contacts[] = self::getContactTemplateVars($rr); - } - } - - $tpl = get_markup_template("contacts-template.tpl"); - $o .= replace_macros($tpl, [ - '$baseurl' => System::baseUrl(), - '$header' => L10n::t('Contacts') . (($nets) ? ' - ' . ContactSelector::networkToName($nets) : ''), - '$tabs' => $t, - '$total' => $total, - '$search' => $search_hdr, - '$desc' => L10n::t('Search your contacts'), - '$finding' => $searching ? L10n::t('Results for: %s', $search) : "", - '$submit' => L10n::t('Find'), - '$cmd' => $a->cmd, - '$contacts' => $contacts, - '$contact_drop_confirm' => L10n::t('Do you really want to delete this contact?'), - 'multiselect' => 1, - '$batch_actions' => [ - 'contacts_batch_update' => L10n::t('Update'), - 'contacts_batch_block' => L10n::t('Block') . "/" . L10n::t("Unblock"), - "contacts_batch_ignore" => L10n::t('Ignore') . "/" . L10n::t("Unignore"), - "contacts_batch_archive" => L10n::t('Archive') . "/" . L10n::t("Unarchive"), - "contacts_batch_drop" => L10n::t('Delete'), - ], - '$h_batch_actions' => L10n::t('Batch Actions'), - '$paginate' => paginate($a), - ]); - - return $o; - } - - /** - * @brief List of pages for the Contact TabBar - * - * Available Pages are 'Status', 'Profile', 'Contacts' and 'Common Friends' - * - * @param App $a - * @param array $contact The contact array - * @param int $active_tab 1 if tab should be marked as active - * - * @return string - */ - public static function getTabsHTML($a, $contact, $active_tab) - { - // tabs - $tabs = [ - [ - 'label' => L10n::t('Status'), - 'url' => "contacts/" . $contact['id'] . "/conversations", - 'sel' => (($active_tab == 1) ? 'active' : ''), - 'title' => L10n::t('Conversations started by this contact'), - 'id' => 'status-tab', - 'accesskey' => 'm', - ], - [ - 'label' => L10n::t('Posts and Comments'), - 'url' => "contacts/" . $contact['id'] . "/posts", - 'sel' => (($active_tab == 2) ? 'active' : ''), - 'title' => L10n::t('Status Messages and Posts'), - 'id' => 'posts-tab', - 'accesskey' => 'p', - ], - [ - 'label' => L10n::t('Profile'), - 'url' => "contacts/" . $contact['id'], - 'sel' => (($active_tab == 3) ? 'active' : ''), - 'title' => L10n::t('Profile Details'), - 'id' => 'profile-tab', - 'accesskey' => 'o', - ] - ]; - - // Show this tab only if there is visible friend list - $x = GContact::countAllFriends(local_user(), $contact['id']); - if ($x) { - $tabs[] = ['label' => L10n::t('Contacts'), - 'url' => "allfriends/" . $contact['id'], - 'sel' => (($active_tab == 4) ? 'active' : ''), - 'title' => L10n::t('View all contacts'), - 'id' => 'allfriends-tab', - 'accesskey' => 't']; - } - - // Show this tab only if there is visible common friend list - $common = GContact::countCommonFriends(local_user(), $contact['id']); - if ($common) { - $tabs[] = ['label' => L10n::t('Common Friends'), - 'url' => "common/loc/" . local_user() . "/" . $contact['id'], - 'sel' => (($active_tab == 5) ? 'active' : ''), - 'title' => L10n::t('View all common friends'), - 'id' => 'common-loc-tab', - 'accesskey' => 'd' - ]; - } - - if (!empty($contact['uid'])) { - $tabs[] = ['label' => L10n::t('Advanced'), - 'url' => 'crepair/' . $contact['id'], - 'sel' => (($active_tab == 6) ? 'active' : ''), - 'title' => L10n::t('Advanced Contact Settings'), - 'id' => 'advanced-tab', - 'accesskey' => 'r' - ]; - } - - $tab_tpl = get_markup_template('common_tabs.tpl'); - $tab_str = replace_macros($tab_tpl, ['$tabs' => $tabs]); - - return $tab_str; - } - - private static function getConversationsHMTL($a, $contact_id, $update) - { - $o = ''; - - if (!$update) { - // We need the editor here to be able to reshare an item. - if (local_user()) { - $x = [ - 'is_owner' => true, - 'allow_location' => $a->user['allow_location'], - '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), - 'bang' => '', - 'visitor' => 'block', - 'profile_uid' => local_user(), - ]; - $o = status_editor($a, $x, 0, true); - } - } - - $contact = DBA::selectFirst('contact', ['uid', 'url', 'id'], ['id' => $contact_id]); - - if (!$update) { - $o .= self::getTabsHTML($a, $contact, 1); - } - - if (DBA::isResult($contact)) { - $a->page['aside'] = ""; - - $profiledata = Contact::getDetailsByURL($contact["url"]); - - if (local_user()) { - if (in_array($profiledata["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { - $profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]); - } - } - - Profile::load($a, "", 0, $profiledata, true); - $o .= Contact::getPostsFromUrl($contact["url"], true, $update); - } - - return $o; - } - - private static function getPostsHTML($a, $contact_id) - { - $contact = DBA::selectFirst('contact', ['uid', 'url', 'id'], ['id' => $contact_id]); - - $o = self::getTabsHTML($a, $contact, 2); - - if (DBA::isResult($contact)) { - $a->page['aside'] = ""; - - $profiledata = Contact::getDetailsByURL($contact["url"]); - - if (local_user()) { - if (in_array($profiledata["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { - $profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]); - } - } - - Profile::load($a, "", 0, $profiledata, true); - $o .= Contact::getPostsFromUrl($contact["url"]); - } - - return $o; - } - - public static function getContactTemplateVars(array $rr) - { - $dir_icon = ''; - $alt_text = ''; - - switch ($rr['rel']) { - case Contact::FRIEND: - $dir_icon = 'images/lrarrow.gif'; - $alt_text = L10n::t('Mutual Friendship'); - break; - - case Contact::FOLLOWER; - $dir_icon = 'images/larrow.gif'; - $alt_text = L10n::t('is a fan of yours'); - break; - - case Contact::SHARING; - $dir_icon = 'images/rarrow.gif'; - $alt_text = L10n::t('you are a fan of'); - break; - - default: - break; - } - - $url = Contact::magicLink($rr['url']); - - if (strpos($url, 'redir/') === 0) { - $sparkle = ' class="sparkle" '; - } else { - $sparkle = ''; - } - - if ($rr['self']) { - $dir_icon = 'images/larrow.gif'; - $alt_text = L10n::t('This is you'); - $url = $rr['url']; - $sparkle = ''; - } - - return [ - 'img_hover' => L10n::t('Visit %s\'s profile [%s]', $rr['name'], $rr['url']), - 'edit_hover' => L10n::t('Edit contact'), - 'photo_menu' => Contact::photoMenu($rr), - 'id' => $rr['id'], - 'alt_text' => $alt_text, - 'dir_icon' => $dir_icon, - 'thumb' => ProxyUtils::proxifyUrl($rr['thumb'], false, ProxyUtils::SIZE_THUMB), - 'name' => htmlentities($rr['name']), - 'username' => htmlentities($rr['name']), - 'account_type' => Contact::getAccountType($rr), - 'sparkle' => $sparkle, - 'itemurl' => (($rr['addr'] != "") ? $rr['addr'] : $rr['url']), - 'url' => $url, - 'network' => ContactSelector::networkToName($rr['network'], $rr['url']), - 'nick' => htmlentities($rr['nick']), - ]; - } - - /** - * @brief Gives a array with actions which can performed to a given contact - * - * This includes actions like e.g. 'block', 'hide', 'archive', 'delete' and others - * - * @param array $contact Data about the Contact - * @return array with contact related actions - */ - private static function getContactActions($contact) - { - $poll_enabled = in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL]); - $contact_actions = []; - - // Provide friend suggestion only for Friendica contacts - if ($contact['network'] === Protocol::DFRN) { - $contact_actions['suggest'] = [ - 'label' => L10n::t('Suggest friends'), - 'url' => 'fsuggest/' . $contact['id'], - 'title' => '', - 'sel' => '', - 'id' => 'suggest', - ]; - } - - if ($poll_enabled) { - $contact_actions['update'] = [ - 'label' => L10n::t('Update now'), - 'url' => 'contacts/' . $contact['id'] . '/update', - 'title' => '', - 'sel' => '', - 'id' => 'update', - ]; - } - - $contact_actions['block'] = [ - 'label' => (intval($contact['blocked']) ? L10n::t('Unblock') : L10n::t('Block')), - 'url' => 'contacts/' . $contact['id'] . '/block', - 'title' => L10n::t('Toggle Blocked status'), - 'sel' => (intval($contact['blocked']) ? 'active' : ''), - 'id' => 'toggle-block', - ]; - - $contact_actions['ignore'] = [ - 'label' => (intval($contact['readonly']) ? L10n::t('Unignore') : L10n::t('Ignore')), - 'url' => 'contacts/' . $contact['id'] . '/ignore', - 'title' => L10n::t('Toggle Ignored status'), - 'sel' => (intval($contact['readonly']) ? 'active' : ''), - 'id' => 'toggle-ignore', - ]; - - if ($contact['uid'] != 0) { - $contact_actions['archive'] = [ - 'label' => (intval($contact['archive']) ? L10n::t('Unarchive') : L10n::t('Archive')), - 'url' => 'contacts/' . $contact['id'] . '/archive', - 'title' => L10n::t('Toggle Archive status'), - 'sel' => (intval($contact['archive']) ? 'active' : ''), - 'id' => 'toggle-archive', - ]; - - $contact_actions['delete'] = [ - 'label' => L10n::t('Delete'), - 'url' => 'contacts/' . $contact['id'] . '/drop', - 'title' => L10n::t('Delete contact'), - 'sel' => '', - 'id' => 'delete', - ]; - } - - return $contact_actions; - } -} diff --git a/util/messages.po b/util/messages.po index c27fb2562..6365f6cc0 100644 --- a/util/messages.po +++ b/util/messages.po @@ -51,7 +51,7 @@ msgstr "" #: mod/profile_photo.php:198 mod/wall_attach.php:80 mod/wall_attach.php:83 #: mod/item.php:166 mod/uimport.php:15 mod/cal.php:306 mod/regmod.php:108 #: mod/editpost.php:19 mod/fsuggest.php:80 mod/allfriends.php:23 -#: mod/contacts.php:387 mod/events.php:195 mod/follow.php:54 mod/follow.php:118 +#: mod/contact.php:387 mod/events.php:195 mod/follow.php:54 mod/follow.php:118 #: mod/attach.php:39 mod/poke.php:144 mod/invite.php:21 mod/invite.php:112 #: mod/notes.php:32 mod/profiles.php:179 mod/profiles.php:511 #: mod/photos.php:183 mod/photos.php:1067 @@ -94,7 +94,7 @@ msgstr "" #: view/theme/vier/config.php:119 view/theme/frio/config.php:118 #: mod/crepair.php:150 mod/install.php:204 mod/install.php:242 #: mod/manage.php:184 mod/message.php:264 mod/message.php:430 -#: mod/fsuggest.php:114 mod/contacts.php:631 mod/events.php:560 +#: mod/fsuggest.php:114 mod/contact.php:631 mod/events.php:560 #: mod/localtime.php:56 mod/poke.php:194 mod/invite.php:155 #: mod/profiles.php:577 mod/photos.php:1096 mod/photos.php:1182 #: mod/photos.php:1454 mod/photos.php:1499 mod/photos.php:1538 @@ -186,7 +186,7 @@ msgstr "" #: view/theme/vier/theme.php:199 include/conversation.php:881 #: mod/dirfind.php:231 mod/match.php:90 mod/suggest.php:86 -#: mod/allfriends.php:76 mod/contacts.php:611 mod/follow.php:143 +#: mod/allfriends.php:76 mod/contact.php:611 mod/follow.php:143 #: src/Model/Contact.php:944 src/Content/Widget.php:61 msgid "Connect/Follow" msgstr "" @@ -195,7 +195,7 @@ msgstr "" msgid "Examples: Robert Morgenstein, Fishing" msgstr "" -#: view/theme/vier/theme.php:201 mod/directory.php:214 mod/contacts.php:845 +#: view/theme/vier/theme.php:201 mod/directory.php:214 mod/contact.php:845 #: src/Content/Widget.php:63 msgid "Find" msgstr "" @@ -320,7 +320,7 @@ msgstr "" msgid "End this session" msgstr "" -#: view/theme/frio/theme.php:269 mod/contacts.php:690 mod/contacts.php:880 +#: view/theme/frio/theme.php:269 mod/contact.php:690 mod/contact.php:880 #: src/Model/Profile.php:888 src/Content/Nav.php:100 msgid "Status" msgstr "" @@ -331,7 +331,7 @@ msgid "Your posts and conversations" msgstr "" #: view/theme/frio/theme.php:270 mod/newmember.php:24 mod/profperm.php:116 -#: mod/contacts.php:692 mod/contacts.php:896 src/Model/Profile.php:730 +#: mod/contact.php:692 mod/contact.php:896 src/Model/Profile.php:730 #: src/Model/Profile.php:863 src/Model/Profile.php:896 src/Content/Nav.php:101 msgid "Profile" msgstr "" @@ -400,7 +400,7 @@ msgid "Account settings" msgstr "" #: view/theme/frio/theme.php:280 include/text.php:906 mod/viewcontacts.php:125 -#: mod/contacts.php:839 mod/contacts.php:908 src/Model/Profile.php:967 +#: mod/contact.php:839 mod/contact.php:908 src/Model/Profile.php:967 #: src/Model/Profile.php:970 src/Content/Nav.php:147 src/Content/Nav.php:213 msgid "Contacts" msgstr "" @@ -475,7 +475,7 @@ msgstr "" #: mod/settings.php:1153 mod/settings.php:1154 mod/settings.php:1155 #: mod/settings.php:1156 mod/settings.php:1157 mod/register.php:237 #: mod/message.php:154 mod/suggest.php:40 mod/dfrn_request.php:645 -#: mod/api.php:110 mod/contacts.php:471 mod/follow.php:150 mod/profiles.php:541 +#: mod/api.php:110 mod/contact.php:471 mod/follow.php:150 mod/profiles.php:541 #: mod/profiles.php:544 mod/profiles.php:566 msgid "Yes" msgstr "" @@ -483,7 +483,7 @@ msgstr "" #: include/items.php:399 include/conversation.php:1179 mod/videos.php:146 #: mod/settings.php:676 mod/settings.php:702 mod/unfollow.php:130 #: mod/message.php:157 mod/tagrm.php:19 mod/tagrm.php:91 mod/suggest.php:43 -#: mod/dfrn_request.php:655 mod/editpost.php:146 mod/contacts.php:474 +#: mod/dfrn_request.php:655 mod/editpost.php:146 mod/contact.php:474 #: mod/follow.php:161 mod/fbrowser.php:104 mod/fbrowser.php:135 #: mod/photos.php:255 mod/photos.php:327 msgid "Cancel" @@ -586,7 +586,7 @@ msgid "Select" msgstr "" #: include/conversation.php:627 mod/settings.php:736 mod/admin.php:1906 -#: mod/contacts.php:855 mod/contacts.php:1133 mod/photos.php:1567 +#: mod/contact.php:855 mod/contact.php:1133 mod/photos.php:1567 msgid "Delete" msgstr "" @@ -2014,7 +2014,7 @@ msgstr "" msgid "Only logged in users are permitted to perform a probing." msgstr "" -#: mod/directory.php:151 mod/notifications.php:248 mod/contacts.php:681 +#: mod/directory.php:151 mod/notifications.php:248 mod/contact.php:681 #: mod/events.php:548 src/Model/Event.php:67 src/Model/Event.php:94 #: src/Model/Event.php:431 src/Model/Event.php:922 src/Model/Profile.php:430 msgid "Location:" @@ -2033,7 +2033,7 @@ msgstr "" msgid "Homepage:" msgstr "" -#: mod/directory.php:159 mod/notifications.php:250 mod/contacts.php:685 +#: mod/directory.php:159 mod/notifications.php:250 mod/contact.php:685 #: src/Model/Profile.php:436 src/Model/Profile.php:806 msgid "About:" msgstr "" @@ -2114,7 +2114,7 @@ msgstr "" msgid "Missing some important data!" msgstr "" -#: mod/settings.php:176 mod/settings.php:701 mod/contacts.php:851 +#: mod/settings.php:176 mod/settings.php:701 mod/contact.php:851 msgid "Update" msgstr "" @@ -3006,7 +3006,7 @@ msgstr "" msgid "Items tagged with: %s" msgstr "" -#: mod/search.php:248 mod/contacts.php:844 +#: mod/search.php:248 mod/contact.php:844 #, php-format msgid "Results for: %s" msgstr "" @@ -3015,7 +3015,7 @@ msgstr "" msgid "No contacts in common." msgstr "" -#: mod/common.php:142 mod/contacts.php:919 +#: mod/common.php:142 mod/contact.php:919 msgid "Common Friends" msgstr "" @@ -3177,7 +3177,7 @@ msgstr "" msgid "Members" msgstr "" -#: mod/group.php:246 mod/contacts.php:742 +#: mod/group.php:246 mod/contact.php:742 msgid "All Contacts" msgstr "" @@ -3301,7 +3301,7 @@ msgstr "" msgid "No contacts." msgstr "" -#: mod/viewcontacts.php:106 mod/contacts.php:640 mod/contacts.php:1055 +#: mod/viewcontacts.php:106 mod/contact.php:640 mod/contact.php:1055 #, php-format msgid "Visit %s's profile [%s]" msgstr "" @@ -3318,7 +3318,7 @@ msgstr "" msgid "Contact unfollowed" msgstr "" -#: mod/unfollow.php:113 mod/contacts.php:607 +#: mod/unfollow.php:113 mod/contact.php:607 msgid "Disconnect/Unfollow" msgstr "" @@ -3331,11 +3331,11 @@ msgid "Submit Request" msgstr "" #: mod/unfollow.php:135 mod/notifications.php:174 mod/notifications.php:258 -#: mod/admin.php:500 mod/admin.php:510 mod/contacts.php:677 mod/follow.php:166 +#: mod/admin.php:500 mod/admin.php:510 mod/contact.php:677 mod/follow.php:166 msgid "Profile URL" msgstr "" -#: mod/unfollow.php:145 mod/contacts.php:891 mod/follow.php:189 +#: mod/unfollow.php:145 mod/contact.php:891 mod/follow.php:189 #: src/Model/Profile.php:891 msgid "Status Messages and Posts" msgstr "" @@ -3472,7 +3472,7 @@ msgid "Discard" msgstr "" #: mod/notifications.php:57 mod/notifications.php:181 mod/notifications.php:266 -#: mod/contacts.php:659 mod/contacts.php:853 mod/contacts.php:1116 +#: mod/contact.php:659 mod/contact.php:853 mod/contact.php:1116 msgid "Ignore" msgstr "" @@ -3520,7 +3520,7 @@ msgstr "" msgid "Suggested by:" msgstr "" -#: mod/notifications.php:176 mod/notifications.php:255 mod/contacts.php:667 +#: mod/notifications.php:176 mod/notifications.php:255 mod/contact.php:667 msgid "Hide this contact from others" msgstr "" @@ -3577,12 +3577,12 @@ msgstr "" msgid "Subscriber" msgstr "" -#: mod/notifications.php:252 mod/contacts.php:687 mod/follow.php:177 +#: mod/notifications.php:252 mod/contact.php:687 mod/follow.php:177 #: src/Model/Profile.php:794 msgid "Tags:" msgstr "" -#: mod/notifications.php:261 mod/contacts.php:81 src/Model/Profile.php:533 +#: mod/notifications.php:261 mod/contact.php:81 src/Model/Profile.php:533 msgid "Network:" msgstr "" @@ -4500,13 +4500,13 @@ msgstr "" msgid "select none" msgstr "" -#: mod/admin.php:494 mod/admin.php:1907 mod/contacts.php:658 -#: mod/contacts.php:852 mod/contacts.php:1108 +#: mod/admin.php:494 mod/admin.php:1907 mod/contact.php:658 +#: mod/contact.php:852 mod/contact.php:1108 msgid "Block" msgstr "" -#: mod/admin.php:495 mod/admin.php:1909 mod/contacts.php:658 -#: mod/contacts.php:852 mod/contacts.php:1108 +#: mod/admin.php:495 mod/admin.php:1909 mod/contact.php:658 +#: mod/contact.php:852 mod/contact.php:1108 msgid "Unblock" msgstr "" @@ -4769,7 +4769,7 @@ msgid "Public postings from local users and the federated network" msgstr "" #: mod/admin.php:1353 mod/admin.php:1520 mod/admin.php:1530 -#: mod/contacts.php:583 +#: mod/contact.php:583 msgid "Disabled" msgstr "" @@ -4849,7 +4849,7 @@ msgstr "" msgid "Policies" msgstr "" -#: mod/admin.php:1431 mod/contacts.php:929 mod/events.php:562 +#: mod/admin.php:1431 mod/contact.php:929 mod/events.php:562 #: src/Model/Profile.php:865 msgid "Advanced" msgstr "" @@ -6143,7 +6143,7 @@ msgstr "" msgid "Disallowed profile URL." msgstr "" -#: mod/dfrn_request.php:412 mod/contacts.php:241 +#: mod/dfrn_request.php:412 mod/contact.php:241 msgid "Failed to update contact record." msgstr "" @@ -6552,364 +6552,364 @@ msgstr "" msgid "No friends to display." msgstr "" -#: mod/contacts.php:168 +#: mod/contact.php:168 #, php-format msgid "%d contact edited." msgid_plural "%d contacts edited." msgstr[0] "" msgstr[1] "" -#: mod/contacts.php:195 mod/contacts.php:401 +#: mod/contact.php:195 mod/contact.php:401 msgid "Could not access contact record." msgstr "" -#: mod/contacts.php:205 +#: mod/contact.php:205 msgid "Could not locate selected profile." msgstr "" -#: mod/contacts.php:239 +#: mod/contact.php:239 msgid "Contact updated." msgstr "" -#: mod/contacts.php:422 +#: mod/contact.php:422 msgid "Contact has been blocked" msgstr "" -#: mod/contacts.php:422 +#: mod/contact.php:422 msgid "Contact has been unblocked" msgstr "" -#: mod/contacts.php:432 +#: mod/contact.php:432 msgid "Contact has been ignored" msgstr "" -#: mod/contacts.php:432 +#: mod/contact.php:432 msgid "Contact has been unignored" msgstr "" -#: mod/contacts.php:442 +#: mod/contact.php:442 msgid "Contact has been archived" msgstr "" -#: mod/contacts.php:442 +#: mod/contact.php:442 msgid "Contact has been unarchived" msgstr "" -#: mod/contacts.php:466 +#: mod/contact.php:466 msgid "Drop contact" msgstr "" -#: mod/contacts.php:469 mod/contacts.php:848 +#: mod/contact.php:469 mod/contact.php:848 msgid "Do you really want to delete this contact?" msgstr "" -#: mod/contacts.php:487 +#: mod/contact.php:487 msgid "Contact has been removed." msgstr "" -#: mod/contacts.php:524 +#: mod/contact.php:524 #, php-format msgid "You are mutual friends with %s" msgstr "" -#: mod/contacts.php:529 +#: mod/contact.php:529 #, php-format msgid "You are sharing with %s" msgstr "" -#: mod/contacts.php:534 +#: mod/contact.php:534 #, php-format msgid "%s is sharing with you" msgstr "" -#: mod/contacts.php:558 +#: mod/contact.php:558 msgid "Private communications are not available for this contact." msgstr "" -#: mod/contacts.php:560 +#: mod/contact.php:560 msgid "Never" msgstr "" -#: mod/contacts.php:563 +#: mod/contact.php:563 msgid "(Update was successful)" msgstr "" -#: mod/contacts.php:563 +#: mod/contact.php:563 msgid "(Update was not successful)" msgstr "" -#: mod/contacts.php:565 mod/contacts.php:1089 +#: mod/contact.php:565 mod/contact.php:1089 msgid "Suggest friends" msgstr "" -#: mod/contacts.php:569 +#: mod/contact.php:569 #, php-format msgid "Network type: %s" msgstr "" -#: mod/contacts.php:574 +#: mod/contact.php:574 msgid "Communications lost with this contact!" msgstr "" -#: mod/contacts.php:580 +#: mod/contact.php:580 msgid "Fetch further information for feeds" msgstr "" -#: mod/contacts.php:582 +#: mod/contact.php:582 msgid "" "Fetch information like preview pictures, title and teaser from the feed " "item. You can activate this if the feed doesn't contain much text. Keywords " "are taken from the meta header in the feed item and are posted as hash tags." msgstr "" -#: mod/contacts.php:584 +#: mod/contact.php:584 msgid "Fetch information" msgstr "" -#: mod/contacts.php:585 +#: mod/contact.php:585 msgid "Fetch keywords" msgstr "" -#: mod/contacts.php:586 +#: mod/contact.php:586 msgid "Fetch information and keywords" msgstr "" -#: mod/contacts.php:618 +#: mod/contact.php:618 msgid "Profile Visibility" msgstr "" -#: mod/contacts.php:619 +#: mod/contact.php:619 msgid "Contact Information / Notes" msgstr "" -#: mod/contacts.php:620 +#: mod/contact.php:620 msgid "Contact Settings" msgstr "" -#: mod/contacts.php:629 +#: mod/contact.php:629 msgid "Contact" msgstr "" -#: mod/contacts.php:633 +#: mod/contact.php:633 #, php-format msgid "" "Please choose the profile you would like to display to %s when viewing your " "profile securely." msgstr "" -#: mod/contacts.php:635 +#: mod/contact.php:635 msgid "Their personal note" msgstr "" -#: mod/contacts.php:637 +#: mod/contact.php:637 msgid "Edit contact notes" msgstr "" -#: mod/contacts.php:641 +#: mod/contact.php:641 msgid "Block/Unblock contact" msgstr "" -#: mod/contacts.php:642 +#: mod/contact.php:642 msgid "Ignore contact" msgstr "" -#: mod/contacts.php:643 +#: mod/contact.php:643 msgid "Repair URL settings" msgstr "" -#: mod/contacts.php:644 +#: mod/contact.php:644 msgid "View conversations" msgstr "" -#: mod/contacts.php:649 +#: mod/contact.php:649 msgid "Last update:" msgstr "" -#: mod/contacts.php:651 +#: mod/contact.php:651 msgid "Update public posts" msgstr "" -#: mod/contacts.php:653 mod/contacts.php:1099 +#: mod/contact.php:653 mod/contact.php:1099 msgid "Update now" msgstr "" -#: mod/contacts.php:659 mod/contacts.php:853 mod/contacts.php:1116 +#: mod/contact.php:659 mod/contact.php:853 mod/contact.php:1116 msgid "Unignore" msgstr "" -#: mod/contacts.php:663 +#: mod/contact.php:663 msgid "Currently blocked" msgstr "" -#: mod/contacts.php:664 +#: mod/contact.php:664 msgid "Currently ignored" msgstr "" -#: mod/contacts.php:665 +#: mod/contact.php:665 msgid "Currently archived" msgstr "" -#: mod/contacts.php:666 +#: mod/contact.php:666 msgid "Awaiting connection acknowledge" msgstr "" -#: mod/contacts.php:667 +#: mod/contact.php:667 msgid "" "Replies/likes to your public posts may still be visible" msgstr "" -#: mod/contacts.php:668 +#: mod/contact.php:668 msgid "Notification for new posts" msgstr "" -#: mod/contacts.php:668 +#: mod/contact.php:668 msgid "Send a notification of every new post of this contact" msgstr "" -#: mod/contacts.php:671 +#: mod/contact.php:671 msgid "Blacklisted keywords" msgstr "" -#: mod/contacts.php:671 +#: mod/contact.php:671 msgid "" "Comma separated list of keywords that should not be converted to hashtags, " "when \"Fetch information and keywords\" is selected" msgstr "" -#: mod/contacts.php:683 src/Model/Profile.php:437 +#: mod/contact.php:683 src/Model/Profile.php:437 msgid "XMPP:" msgstr "" -#: mod/contacts.php:688 +#: mod/contact.php:688 msgid "Actions" msgstr "" -#: mod/contacts.php:734 +#: mod/contact.php:734 msgid "Suggestions" msgstr "" -#: mod/contacts.php:737 +#: mod/contact.php:737 msgid "Suggest potential friends" msgstr "" -#: mod/contacts.php:745 +#: mod/contact.php:745 msgid "Show all contacts" msgstr "" -#: mod/contacts.php:750 +#: mod/contact.php:750 msgid "Unblocked" msgstr "" -#: mod/contacts.php:753 +#: mod/contact.php:753 msgid "Only show unblocked contacts" msgstr "" -#: mod/contacts.php:758 +#: mod/contact.php:758 msgid "Blocked" msgstr "" -#: mod/contacts.php:761 +#: mod/contact.php:761 msgid "Only show blocked contacts" msgstr "" -#: mod/contacts.php:766 +#: mod/contact.php:766 msgid "Ignored" msgstr "" -#: mod/contacts.php:769 +#: mod/contact.php:769 msgid "Only show ignored contacts" msgstr "" -#: mod/contacts.php:774 +#: mod/contact.php:774 msgid "Archived" msgstr "" -#: mod/contacts.php:777 +#: mod/contact.php:777 msgid "Only show archived contacts" msgstr "" -#: mod/contacts.php:782 +#: mod/contact.php:782 msgid "Hidden" msgstr "" -#: mod/contacts.php:785 +#: mod/contact.php:785 msgid "Only show hidden contacts" msgstr "" -#: mod/contacts.php:843 +#: mod/contact.php:843 msgid "Search your contacts" msgstr "" -#: mod/contacts.php:854 mod/contacts.php:1125 +#: mod/contact.php:854 mod/contact.php:1125 msgid "Archive" msgstr "" -#: mod/contacts.php:854 mod/contacts.php:1125 +#: mod/contact.php:854 mod/contact.php:1125 msgid "Unarchive" msgstr "" -#: mod/contacts.php:857 +#: mod/contact.php:857 msgid "Batch Actions" msgstr "" -#: mod/contacts.php:883 +#: mod/contact.php:883 msgid "Conversations started by this contact" msgstr "" -#: mod/contacts.php:888 +#: mod/contact.php:888 msgid "Posts and Comments" msgstr "" -#: mod/contacts.php:899 src/Model/Profile.php:899 +#: mod/contact.php:899 src/Model/Profile.php:899 msgid "Profile Details" msgstr "" -#: mod/contacts.php:911 +#: mod/contact.php:911 msgid "View all contacts" msgstr "" -#: mod/contacts.php:922 +#: mod/contact.php:922 msgid "View all common friends" msgstr "" -#: mod/contacts.php:932 +#: mod/contact.php:932 msgid "Advanced Contact Settings" msgstr "" -#: mod/contacts.php:1022 +#: mod/contact.php:1022 msgid "Mutual Friendship" msgstr "" -#: mod/contacts.php:1027 +#: mod/contact.php:1027 msgid "is a fan of yours" msgstr "" -#: mod/contacts.php:1032 +#: mod/contact.php:1032 msgid "you are a fan of" msgstr "" -#: mod/contacts.php:1049 mod/photos.php:1496 mod/photos.php:1535 +#: mod/contact.php:1049 mod/photos.php:1496 mod/photos.php:1535 #: mod/photos.php:1595 src/Object/Post.php:792 msgid "This is you" msgstr "" -#: mod/contacts.php:1056 +#: mod/contact.php:1056 msgid "Edit contact" msgstr "" -#: mod/contacts.php:1110 +#: mod/contact.php:1110 msgid "Toggle Blocked status" msgstr "" -#: mod/contacts.php:1118 +#: mod/contact.php:1118 msgid "Toggle Ignored status" msgstr "" -#: mod/contacts.php:1127 +#: mod/contact.php:1127 msgid "Toggle Archive status" msgstr "" -#: mod/contacts.php:1135 +#: mod/contact.php:1135 msgid "Delete contact" msgstr "" diff --git a/view/templates/contacts-template.tpl b/view/templates/contacts-template.tpl index bec295924..d85fcfb5a 100644 --- a/view/templates/contacts-template.tpl +++ b/view/templates/contacts-template.tpl @@ -14,7 +14,7 @@ {{$tabs}} - + {{foreach $contacts as $contact}} {{include file="contact_template.tpl"}} {{/foreach}} diff --git a/view/templates/crepair.tpl b/view/templates/crepair.tpl index ba04073b6..72528bd26 100644 --- a/view/templates/crepair.tpl +++ b/view/templates/crepair.tpl @@ -15,7 +15,7 @@
      {{if $update_profile}} - {{$udprofilenow}} + {{$udprofilenow}} {{/if}}
      diff --git a/view/theme/frio/templates/contact_edit.tpl b/view/theme/frio/templates/contact_edit.tpl index 3db3fde03..4c12948dc 100644 --- a/view/theme/frio/templates/contact_edit.tpl +++ b/view/theme/frio/templates/contact_edit.tpl @@ -45,7 +45,7 @@ {{if $poll_enabled}}
    • {{$lastupdtext}} {{$last_update}}
      {{if $poll_interval}} - + {{$updpub}} {{$poll_interval}}
    • diff --git a/view/theme/frio/templates/contacts-template.tpl b/view/theme/frio/templates/contacts-template.tpl index 6f6422401..705e377ed 100644 --- a/view/theme/frio/templates/contacts-template.tpl +++ b/view/theme/frio/templates/contacts-template.tpl @@ -28,7 +28,7 @@
      {{* we need the form container to make batch actions work *}} -
      + {{* we put here a hidden input element. This is needed to transmit the batch actions with javascript*}} diff --git a/view/theme/frio/templates/crepair.tpl b/view/theme/frio/templates/crepair.tpl index 22605bb7a..3d45c6ddc 100644 --- a/view/theme/frio/templates/crepair.tpl +++ b/view/theme/frio/templates/crepair.tpl @@ -17,7 +17,7 @@
      {{if $update_profile}} - {{$udprofilenow}} + {{$udprofilenow}} {{/if}}
      diff --git a/view/theme/frio/theme.php b/view/theme/frio/theme.php index 79ec421d2..58904911c 100644 --- a/view/theme/frio/theme.php +++ b/view/theme/frio/theme.php @@ -278,7 +278,7 @@ function frio_remote_nav($a, &$nav) $nav['events'] = [$server_url . '/events', L10n::t('Events'), '', L10n::t('Events and Calendar')]; $nav['messages'] = [$server_url . '/message', L10n::t('Messages'), '', L10n::t('Private mail')]; $nav['settings'] = [$server_url . '/settings', L10n::t('Settings'), '', L10n::t('Account settings')]; - $nav['contacts'] = [$server_url . '/contacts', L10n::t('Contacts'), '', L10n::t('Manage/edit friends and contacts')]; + $nav['contacts'] = [$server_url . '/contact', L10n::t('Contacts'), '', L10n::t('Manage/edit friends and contacts')]; $nav['sitename'] = Config::get('config', 'sitename'); } } @@ -287,7 +287,7 @@ function frio_remote_nav($a, &$nav) * @brief: Search for contacts * * This function search for a users contacts. The code is copied from contact search - * in /mod/contacts.php. With this function the contacts will permitted to acl_lookup() + * in /src/Module/Contact.php. With this function the contacts will permitted to acl_lookup() * and can grabbed as json. For this we use the type="r". This is usful to to let js * grab the contact data. * We use this to give the data to textcomplete and have a filter function at the @@ -301,7 +301,7 @@ function frio_acl_lookup(App $a, &$results) $nets = x($_GET, 'nets') ? notags(trim($_GET['nets'])) : ''; // we introduce a new search type, r should do the same query like it's - // done in /mod/contacts for connections + // done in /src/Module/Contact.php for connections if ($results['type'] !== 'r') { return; } From 5fd44020747d16fc90d902cfb89a2fca40d2d9ee Mon Sep 17 00:00:00 2001 From: Jonny Tischbein Date: Sun, 14 Oct 2018 20:03:22 +0200 Subject: [PATCH 7/9] code standards + fixing navigation links to /contact/... --- mod/allfriends.php | 6 +++--- mod/common.php | 22 +++++++++++----------- mod/crepair.php | 6 +++--- mod/dirfind.php | 8 ++++---- mod/group.php | 6 +++--- src/Module/Contact.php | 18 +++++++++--------- view/theme/frio/theme.php | 4 ++-- 7 files changed, 35 insertions(+), 35 deletions(-) diff --git a/mod/allfriends.php b/mod/allfriends.php index aa5fb0a67..cee067e97 100644 --- a/mod/allfriends.php +++ b/mod/allfriends.php @@ -8,8 +8,8 @@ use Friendica\Content\ContactSelector; use Friendica\Core\L10n; use Friendica\Core\System; use Friendica\Database\DBA; -use Friendica\Model;\ -use Friendica\Module\Contact; +use Friendica\Model; +use Friendica\Module; use Friendica\Util\Proxy as ProxyUtils; @@ -95,7 +95,7 @@ function allfriends_content(App $a) $entries[] = $entry; } - $tab_str = Contact::getTabsHTML($a, $contact, 4); + $tab_str = Module\Contact::getTabsHTML($a, $contact, 4); $tpl = get_markup_template('viewcontact_template.tpl'); diff --git a/mod/common.php b/mod/common.php index c011c6d38..25a6aef17 100644 --- a/mod/common.php +++ b/mod/common.php @@ -8,7 +8,7 @@ use Friendica\Content\ContactSelector; use Friendica\Core\L10n; use Friendica\Database\DBA; use Friendica\Model; -use Friendica\Module\Contact; +use Friendica\Module; use Friendica\Util\Proxy as ProxyUtils; @@ -41,7 +41,7 @@ function common_content(App $a) if (DBA::isResult($contact)) { $a->page['aside'] = ""; - Model\Profile::load($a, "", 0,Model\Contact::getDetailsByURL($contact["url"])); + Model\Profile::load($a, "", 0, Model\Contact::getDetailsByURL($contact["url"])); } } else { $contact = DBA::selectFirst('contact', ['name', 'url', 'photo', 'uid', 'id'], ['self' => true, 'uid' => $uid]); @@ -64,7 +64,7 @@ function common_content(App $a) return; } - if (!$cid &&Model\Profile::getMyURL()) { + if (!$cid && Model\Profile::getMyURL()) { $contact = DBA::selectFirst('contact', ['id'], ['nurl' => normalise_link(Model\Profile::getMyURL()), 'uid' => $uid]); if (DBA::isResult($contact)) { $cid = $contact['id']; @@ -81,9 +81,9 @@ function common_content(App $a) } if ($cid) { - $t =Model\GContact::countCommonFriends($uid, $cid); + $t = Model\GContact::countCommonFriends($uid, $cid); } else { - $t =Model\GContact::countCommonFriendsZcid($uid, $zcid); + $t = Model\GContact::countCommonFriendsZcid($uid, $zcid); } if ($t > 0) { @@ -94,9 +94,9 @@ function common_content(App $a) } if ($cid) { - $r =Model\GContact::commonFriends($uid, $cid, $a->pager['start'], $a->pager['itemspage']); + $r = Model\GContact::commonFriends($uid, $cid, $a->pager['start'], $a->pager['itemspage']); } else { - $r =Model\GContact::commonFriendsZcid($uid, $zcid, $a->pager['start'], $a->pager['itemspage']); + $r = Model\GContact::commonFriendsZcid($uid, $zcid, $a->pager['start'], $a->pager['itemspage']); } if (!DBA::isResult($r)) { @@ -108,13 +108,13 @@ function common_content(App $a) $entries = []; foreach ($r as $rr) { //get further details of the contact - $contact_details =Model\Contact::getDetailsByURL($rr['url'], $uid); + $contact_details = Model\Contact::getDetailsByURL($rr['url'], $uid); // $rr['id'] is needed to use contact_photo_menu() /// @TODO Adding '/" here avoids E_NOTICE on missing constants $rr['id'] = $rr['cid']; - $photo_menu =Model\Contact::photoMenu($rr); + $photo_menu = Model\Contact::photoMenu($rr); $entry = [ 'url' => $rr['url'], @@ -125,7 +125,7 @@ function common_content(App $a) 'details' => $contact_details['location'], 'tags' => $contact_details['keywords'], 'about' => $contact_details['about'], - 'account_type' =>Model\Contact::getAccountType($contact_details), + 'account_type' => Model\Contact::getAccountType($contact_details), 'network' => ContactSelector::networkToName($contact_details['network'], $contact_details['url']), 'photo_menu' => $photo_menu, 'id' => ++$id, @@ -136,7 +136,7 @@ function common_content(App $a) $title = ''; $tab_str = ''; if ($cmd === 'loc' && $cid && local_user() == $uid) { - $tab_str = Contact::getTabsHTML($a, $contact, 4); + $tab_str = Module\Contact::getTabsHTML($a, $contact, 4); } else { $title = L10n::t('Common Friends'); } diff --git a/mod/crepair.php b/mod/crepair.php index 14ed89afb..c9050b3cc 100644 --- a/mod/crepair.php +++ b/mod/crepair.php @@ -9,7 +9,7 @@ use Friendica\Core\L10n; use Friendica\Core\Protocol; use Friendica\Database\DBA; use Friendica\Model; -use Friendica\Module\Contact; +use Friendica\Module; function crepair_init(App $a) { @@ -28,7 +28,7 @@ function crepair_init(App $a) if (DBA::isResult($contact)) { $a->data['contact'] = $contact; - Profile::load($a, "", 0, Contact::getDetailsByURL($contact["url"])); + Profile::load($a, "", 0, Module\Contact::getDetailsByURL($contact["url"])); } } @@ -133,7 +133,7 @@ function crepair_content(App $a) $update_profile = in_array($contact['network'], [Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]); - $tab_str = Contact::getTabsHTML($a, $contact, 5); + $tab_str = Module\Contact::getTabsHTML($a, $contact, 5); $tpl = get_markup_template('crepair.tpl'); $o = replace_macros($tpl, [ diff --git a/mod/dirfind.php b/mod/dirfind.php index 8fcf98d40..ea5aae669 100644 --- a/mod/dirfind.php +++ b/mod/dirfind.php @@ -13,7 +13,7 @@ use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\Model; -use Friendica\Module\Contact; +use Friendica\Module; use Friendica\Network\Probe; use Friendica\Protocol\PortableContact; use Friendica\Util\Network; @@ -209,8 +209,8 @@ function dirfind_content(App $a, $prefix = "") { $conntxt = ""; $contact = DBA::selectFirst('contact', [], ['id' => $jj->cid]); if (DBA::isResult($contact)) { - $photo_menu =Model\Contact::photoMenu($contact); - $details = Contact::getContactTemplateVars($contact); + $photo_menu = Model\Contact::photoMenu($contact); + $details = Module\Contact::getContactTemplateVars($contact); $alt_text = $details['alt_text']; } else { $photo_menu = []; @@ -226,7 +226,7 @@ function dirfind_content(App $a, $prefix = "") { $photo_menu = []; } - $photo_menu['profile'] = [L10n::t("View Profile"), Contact::magicLink($jj->url)]; + $photo_menu['profile'] = [L10n::t("View Profile"), Module\Contact::magicLink($jj->url)]; $photo_menu['follow'] = [L10n::t("Connect/Follow"), $connlnk]; } diff --git a/mod/group.php b/mod/group.php index 962697c24..5bc188e50 100644 --- a/mod/group.php +++ b/mod/group.php @@ -12,7 +12,7 @@ use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\Model; -use Friendica\Module\Contact; +use Friendica\Module; function group_init(App $a) { if (local_user()) { @@ -249,7 +249,7 @@ function group_content(App $a) { // Format the data of the group members foreach ($members as $member) { if ($member['url']) { - $entry = Contact::getContactTemplateVars($member); + $entry = Module\Contact::getContactTemplateVars($member); $entry['label'] = 'members'; $entry['photo_menu'] = ''; $entry['change_member'] = [ @@ -278,7 +278,7 @@ function group_content(App $a) { // Format the data of the contacts who aren't in the contact group foreach ($r as $member) { if (!in_array($member['id'], $preselected)) { - $entry = Contact::getContactTemplateVars($member); + $entry = Module\Contact::getContactTemplateVars($member); $entry['label'] = 'contacts'; if (!$nogroup) $entry['photo_menu'] = []; diff --git a/src/Module/Contact.php b/src/Module/Contact.php index 07b7c907d..ba06b7e0b 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -190,7 +190,7 @@ class Contact extends BaseModule if (!DBA::exists('contact', ['id' => $contact_id, 'uid' => local_user()])) { notice(L10n::t('Could not access contact record.') . EOL); - goaway('contacts'); + goaway('contact'); return; // NOTREACHED } @@ -370,7 +370,7 @@ class Contact extends BaseModule $a = self::getApp(); $sort_type = 0; $o = ''; - Nav::setSelected('contacts'); + Nav::setSelected('contact'); if (!local_user()) { notice(L10n::t('Permission denied.') . EOL); @@ -388,13 +388,13 @@ class Contact extends BaseModule $orig_record = DBA::selectFirst('contact', [], ['id' => $contact_id, 'uid' => [0, local_user()], 'self' => false]); if (!DBA::isResult($orig_record)) { notice(L10n::t('Could not access contact record.') . EOL); - goaway('contacts'); + goaway('contact'); return; // NOTREACHED } if ($cmd === 'update' && ($orig_record['uid'] != 0)) { self::updateContactFromPoll($contact_id); - goaway('contacts/' . $contact_id); + goaway('contact/' . $contact_id); // NOTREACHED } @@ -410,7 +410,7 @@ class Contact extends BaseModule $blocked = Model\Contact::isBlockedByUser($contact_id, local_user()); info(($blocked ? L10n::t('Contact has been blocked') : L10n::t('Contact has been unblocked')) . EOL); - goaway('contacts/' . $contact_id); + goaway('contact/' . $contact_id); return; // NOTREACHED } @@ -420,7 +420,7 @@ class Contact extends BaseModule $ignored = Model\Contact::isIgnoredByUser($contact_id, local_user()); info(($ignored ? L10n::t('Contact has been ignored') : L10n::t('Contact has been unignored')) . EOL); - goaway('contacts/' . $contact_id); + goaway('contact/' . $contact_id); return; // NOTREACHED } @@ -431,7 +431,7 @@ class Contact extends BaseModule info((($archived) ? L10n::t('Contact has been archived') : L10n::t('Contact has been unarchived')) . EOL); } - goaway('contacts/' . $contact_id); + goaway('contact/' . $contact_id); return; // NOTREACHED } @@ -465,13 +465,13 @@ class Contact extends BaseModule } // Now check how the user responded to the confirmation query if (defaults($_REQUEST, 'canceled')) { - goaway('contacts'); + goaway('contact'); } self::dropContact($orig_record); info(L10n::t('Contact has been removed.') . EOL); - goaway('contacts'); + goaway('contact'); return; // NOTREACHED } if ($cmd === 'posts') { diff --git a/view/theme/frio/theme.php b/view/theme/frio/theme.php index 58904911c..f46b42788 100644 --- a/view/theme/frio/theme.php +++ b/view/theme/frio/theme.php @@ -17,7 +17,7 @@ use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\Model; -use Friendica\Module\Contact; +use Friendica\Module; $frio = 'view/theme/frio'; @@ -333,7 +333,7 @@ function frio_acl_lookup(App $a, &$results) if (DBA::isResult($r)) { foreach ($r as $rr) { - $contacts[] = Model\Contact::getContactTemplateVars($rr); + $contacts[] = Module\Contact::getContactTemplateVars($rr); } } From d54e56c659103e43647fab68bb740b24528ddf0c Mon Sep 17 00:00:00 2001 From: Jonny Tischbein Date: Sun, 14 Oct 2018 21:14:32 +0200 Subject: [PATCH 8/9] Fix batch action query + Fix Namespace import --- mod/crepair.php | 2 +- mod/dirfind.php | 2 +- src/Module/Contact.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/crepair.php b/mod/crepair.php index c9050b3cc..af9575ed6 100644 --- a/mod/crepair.php +++ b/mod/crepair.php @@ -28,7 +28,7 @@ function crepair_init(App $a) if (DBA::isResult($contact)) { $a->data['contact'] = $contact; - Profile::load($a, "", 0, Module\Contact::getDetailsByURL($contact["url"])); + Model\Profile::load($a, "", 0, Model\Contact::getDetailsByURL($contact["url"])); } } diff --git a/mod/dirfind.php b/mod/dirfind.php index ea5aae669..3e5aa83a7 100644 --- a/mod/dirfind.php +++ b/mod/dirfind.php @@ -226,7 +226,7 @@ function dirfind_content(App $a, $prefix = "") { $photo_menu = []; } - $photo_menu['profile'] = [L10n::t("View Profile"), Module\Contact::magicLink($jj->url)]; + $photo_menu['profile'] = [L10n::t("View Profile"), Model\Contact::magicLink($jj->url)]; $photo_menu['follow'] = [L10n::t("Connect/Follow"), $connlnk]; } diff --git a/src/Module/Contact.php b/src/Module/Contact.php index ba06b7e0b..30ad60d4b 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -134,7 +134,7 @@ class Contact extends BaseModule $contacts_id = $_POST['contact_batch']; - $stmt = DBA::select('contact', ['id'], ['id' => $contacts_id, 'id' => local_user(), 'self' => false]); + $stmt = DBA::select('contact', ['id'], ['id' => $contacts_id, 'uid' => local_user(), 'self' => false]); $orig_records = DBA::toArray($stmt); $count_actions = 0; From e41c59b1934e55178be75e9201b013e5ec7b9ba9 Mon Sep 17 00:00:00 2001 From: Jonny Tischbein Date: Sun, 14 Oct 2018 21:38:38 +0200 Subject: [PATCH 9/9] Fix batch action choice - All Actions for one contact were taken before --- src/Module/Contact.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Module/Contact.php b/src/Module/Contact.php index 30ad60d4b..db1675a7f 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -140,25 +140,25 @@ class Contact extends BaseModule $count_actions = 0; foreach ($orig_records as $orig_record) { $contact_id = $orig_record['id']; - if (defaults($_POST, 'contacts_batch_update')) { + if (defaults($_POST, 'contacts_batch_update', '')) { self::updateContactFromPoll($contact_id); $count_actions++; } - if (defaults($_POST, 'contacts_batch_block')) { + if (defaults($_POST, 'contacts_batch_block', '')) { self::blockContact($contact_id); $count_actions++; } - if (defaults($_POST, 'contacts_batch_ignore')) { + if (defaults($_POST, 'contacts_batch_ignore', '')) { self::ignoreContact($contact_id); $count_actions++; } - if (defaults($_POST, 'contacts_batch_archive')) { + if (defaults($_POST, 'contacts_batch_archive', '')) { $r = self::archiveContact($contact_id, $orig_record); if ($r) { $count_actions++; } } - if (defaults($_POST, 'contacts_batch_drop')) { + if (defaults($_POST, 'contacts_batch_drop', '')) { self::dropContact($orig_record); $count_actions++; }