From 80ea86113d7646e9ab24948fcdf11183d07920df Mon Sep 17 00:00:00 2001 From: Jonny Tischbein Date: Thu, 11 Oct 2018 23:14:12 +0200 Subject: [PATCH 01/20] 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 b41d0c891b..190ab12a66 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 d694527b86..13e5bf0927 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 076c611db4..99aee13578 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 5fe9ae13af..e183e6c029 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 8f65eb643d..cfcbca4e47 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 863542e666..1ad5cd4a3b 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 0000000000..a017b55b1e --- /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 18fb98cc9d..fb9ac95cea 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 02/20] 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 a017b55b1e..34cc18c3e9 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 03/20] 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 1ad5cd4a3b..33ba85055f 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 34cc18c3e9..8d26b3eb5e 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 04/20] 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 190ab12a66..aa5fb0a679 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 13e5bf0927..c011c6d38a 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 4e149ab74f..0000000000 --- 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 99aee13578..e5fb1e3347 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 e183e6c029..8fcf98d402 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 cfcbca4e47..ec4ee4da2b 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 8d26b3eb5e..eb21b3b3e1 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 fb9ac95cea..98c1b8e7b3 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 05/20] 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 33ba85055f..6123d03045 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 0000000000..eb21b3b3e1 --- /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 98c1b8e7b3..79ec421d2b 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 06/20] 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 01cb93a3b8..ff763e9885 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 e5fb1e3347..14ed89afbc 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 969e2286c8..48ce3c6aa6 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 e611458281..67db2c6285 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 ec4ee4da2b..962697c24f 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 b3bf310d5b..cd59cc780c 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 7a1a149a2f..4f6f4ae0b9 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 23c31d0b17..1dd84e0037 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 eb21b3b3e1..07b7c907da 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 eb21b3b3e1..0000000000 --- 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 c27fb25627..6365f6cc0d 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 bec295924e..d85fcfb5af 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 ba04073b60..72528bd261 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 3db3fde032..4c12948dce 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 6f64224015..705e377ed3 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 22605bb7a5..3d45c6ddca 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 79ec421d2b..58904911c1 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 07/20] 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 aa5fb0a679..cee067e97a 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 c011c6d38a..25a6aef17a 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 14ed89afbc..c9050b3cce 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 8fcf98d402..ea5aae669a 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 962697c24f..5bc188e50d 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 07b7c907da..ba06b7e0b3 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 58904911c1..f46b42788f 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 08/20] 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 c9050b3cce..af9575ed6d 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 ea5aae669a..3e5aa83a72 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 ba06b7e0b3..30ad60d4b7 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 09/20] 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 30ad60d4b7..db1675a7f8 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++; } From 3a95644848ecf3729df274dbd84b266283e9d204 Mon Sep 17 00:00:00 2001 From: Jonny Tischbein Date: Sun, 14 Oct 2018 22:57:44 +0200 Subject: [PATCH 10/20] Add Support for relativeDateTime in future + update Admin user waiting for deleting table header --- mod/admin.php | 2 +- src/Util/Temporal.php | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/mod/admin.php b/mod/admin.php index d0e8ab0e38..b02db73bdd 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -1922,7 +1922,7 @@ function admin_page_users(App $a) '$h_users' => L10n::t('Users'), '$h_newuser' => L10n::t('New User'), - '$th_deleted' => [L10n::t('Name'), L10n::t('Email'), L10n::t('Register date'), L10n::t('Last login'), L10n::t('Last item'), L10n::t('Deleted since')], + '$th_deleted' => [L10n::t('Name'), L10n::t('Email'), L10n::t('Register date'), L10n::t('Last login'), L10n::t('Last item'), L10n::t('Delete in')], '$th_users' => $th_users, '$order_users' => $order, '$order_direction_users' => $order_direction, diff --git a/src/Util/Temporal.php b/src/Util/Temporal.php index 46bd8bba50..696721e458 100644 --- a/src/Util/Temporal.php +++ b/src/Util/Temporal.php @@ -294,12 +294,18 @@ class Temporal return L10n::t('never'); } + $isfuture = false; $etime = time() - $abs; - if ($etime < 1) { + if ($etime < 1 && $etime >= 0) { return L10n::t('less than a second ago'); } + if ($etime < 0){ + $etime = -$etime; + $isfuture = true; + } + $a = [12 * 30 * 24 * 60 * 60 => [L10n::t('year'), L10n::t('years')], 30 * 24 * 60 * 60 => [L10n::t('month'), L10n::t('months')], 7 * 24 * 60 * 60 => [L10n::t('week'), L10n::t('weeks')], @@ -315,7 +321,12 @@ class Temporal $r = round($d); // translators - e.g. 22 hours ago, 1 minute ago if (!$format) { - $format = L10n::t('%1$d %2$s ago'); + if($isfuture){ + $format = L10n::t('in %1$d %2$s'); + } + else { + $format = L10n::t('%1$d %2$s ago'); + } } return sprintf($format, $r, (($r == 1) ? $str[0] : $str[1])); From 756a4f111163195eb46442d86b915d6676aa0935 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 14 Oct 2018 18:02:54 -0400 Subject: [PATCH 11/20] Fix remaining instances of "contacts" --- src/Model/Group.php | 4 ++-- src/Module/Contact.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Model/Group.php b/src/Model/Group.php index 71f7941189..e313842e41 100644 --- a/src/Model/Group.php +++ b/src/Model/Group.php @@ -349,7 +349,7 @@ class Group extends BaseObject * @param int $cid * @return string */ - public static function sidebarWidget($every = 'contacts', $each = 'group', $editmode = 'standard', $group_id = '', $cid = 0) + public static function sidebarWidget($every = 'contact', $each = 'group', $editmode = 'standard', $group_id = '', $cid = 0) { $o = ''; @@ -404,7 +404,7 @@ class Group extends BaseObject 'newgroup' => $editmode == 'extended' || $editmode == 'full' ? 1 : '', 'grouppage' => 'group/', '$edittext' => L10n::t('Edit group'), - '$ungrouped' => $every === 'contacts' ? L10n::t('Contacts not in any group') : '', + '$ungrouped' => $every === 'contact' ? L10n::t('Contacts not in any group') : '', '$ungrouped_selected' => (($group_id === 'none') ? 'group-selected' : ''), '$createtext' => L10n::t('Create a new group'), '$creategroup' => L10n::t('Group Name: '), diff --git a/src/Module/Contact.php b/src/Module/Contact.php index db1675a7f8..560e91560b 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -94,7 +94,7 @@ class Contact extends BaseModule $networks_widget = ''; } else { $vcard_widget = ''; - $networks_widget = Widget::networks('contacts', $nets); + $networks_widget = Widget::networks('contact', $nets); if (isset($_GET['add'])) { $follow_widget = Widget::follow($_GET['add']); } else { @@ -105,7 +105,7 @@ class Contact extends BaseModule } if ($contact['uid'] != 0) { - $groups_widget = Model\Group::sidebarWidget('contacts', 'group', 'full', 'everyone', $contact_id); + $groups_widget = Model\Group::sidebarWidget('contact', 'group', 'full', 'everyone', $contact_id); } else { $groups_widget = null; } From 57e8fb5cb176dfd551ea3ee8d975d1240bb0d1bf Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 14 Oct 2018 18:17:22 -0400 Subject: [PATCH 12/20] Normalize uses of defaults() in Module\Contact - Remove uses without default value - Add relevant uses --- src/Module/Contact.php | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/Module/Contact.php b/src/Module/Contact.php index 560e91560b..93b05df659 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -83,7 +83,7 @@ class Contact extends BaseModule '$name' => htmlentities($a->data['contact']['name']), '$photo' => $a->data['contact']['photo'], '$url' => Model\Contact::MagicLink($a->data['contact']['url']), - '$addr' => (($a->data['contact']['addr'] != "") ? ($a->data['contact']['addr']) : ""), + '$addr' => defaults($contact, 'addr', ''), '$network_name' => $networkname, '$network' => L10n::t('Network:'), '$account_type' => Model\Contact::getAccountType($a->data['contact']) @@ -140,25 +140,24 @@ 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 (!empty($_POST['contacts_batch_update'])) { self::updateContactFromPoll($contact_id); $count_actions++; } - if (defaults($_POST, 'contacts_batch_block', '')) { + if (!empty($_POST['contacts_batch_block'])) { self::blockContact($contact_id); $count_actions++; } - if (defaults($_POST, 'contacts_batch_ignore', '')) { + if (!empty($_POST['contacts_batch_ignore'])) { self::ignoreContact($contact_id); $count_actions++; } - if (defaults($_POST, 'contacts_batch_archive', '')) { - $r = self::archiveContact($contact_id, $orig_record); - if ($r) { - $count_actions++; - } + if (!empty($_POST['contacts_batch_archive']) + && self::archiveContact($contact_id, $orig_record) + ) { + $count_actions++; } - if (defaults($_POST, 'contacts_batch_drop', '')) { + if (!empty($_POST['contacts_batch_drop'])) { self::dropContact($orig_record); $count_actions++; } @@ -204,9 +203,9 @@ class Contact extends BaseModule } } - $hidden = defaults($_POST['hidden']); + $hidden = !empty($_POST['hidden']); - $notify = defaults($_POST['notify']); + $notify = !empty($_POST['notify']); $fetch_further_information = intval(defaults($_POST, 'fetch_further_information', 0)); @@ -437,8 +436,8 @@ class Contact extends BaseModule if ($cmd === 'drop' && ($orig_record['uid'] != 0)) { // Check if we should do HTML-based delete confirmation - if (defaults($_REQUEST, 'confirm')) { - // can't take arguments in its "action" parameter + if (!empty($_REQUEST['confirm'])) { + // can't take arguments in its 'action' parameter // so add any arguments as hidden inputs $query = explode_querystring($a->query_string); $inputs = []; @@ -464,7 +463,7 @@ class Contact extends BaseModule ]); } // Now check how the user responded to the confirmation query - if (defaults($_REQUEST, 'canceled')) { + if (!empty($_REQUEST['canceled'])) { goaway('contact'); } @@ -484,7 +483,7 @@ class Contact extends BaseModule $_SESSION['return_url'] = $a->query_string; - if ((defaults($a->data, 'contact')) && (is_array($a->data['contact']))) { + if (!empty($a->data['contact']) && is_array($a->data['contact'])) { $contact_id = $a->data['contact']['id']; $contact = $a->data['contact']; @@ -705,8 +704,8 @@ class Contact extends BaseModule $sql_extra .= sprintf(" AND `network` != '%s' ", Protocol::PHANTOM); - $search = defaults($_GET, 'search') ? notags(trim($_GET['search'])) : ''; - $nets = defaults($_GET, 'nets' ) ? notags(trim($_GET['nets'])) : ''; + $search = notags(trim(defaults($_GET, 'search', ''))); + $nets = notags(trim(defaults($_GET, 'nets' , ''))); $tabs = [ [ @@ -1043,7 +1042,7 @@ class Contact extends BaseModule 'username' => htmlentities($rr['name']), 'account_type' => Model\Contact::getAccountType($rr), 'sparkle' => $sparkle, - 'itemurl' => (($rr['addr'] != "") ? $rr['addr'] : $rr['url']), + 'itemurl' => defaults($rr, 'addr', $rr['url']), 'url' => $url, 'network' => ContactSelector::networkToName($rr['network'], $rr['url']), 'nick' => htmlentities($rr['nick']), From 12ddb3bb5472cac5292131b9002935904e846fc2 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 14 Oct 2018 18:25:44 -0400 Subject: [PATCH 13/20] Replace unwarranted uses of $a->data['contact'] --- src/Module/Contact.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Module/Contact.php b/src/Module/Contact.php index 93b05df659..74dac524a0 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -72,21 +72,21 @@ class Contact extends BaseModule $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']); + if (($contact['network'] != '') && ($contact['network'] != Protocol::DFRN)) { + $networkname = format_network_name($contact['network'], $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' => Model\Contact::MagicLink($a->data['contact']['url']), + $vcard_widget = replace_macros(get_markup_template('vcard-widget.tpl'), [ + '$name' => htmlentities($contact['name']), + '$photo' => $contact['photo'], + '$url' => Model\Contact::MagicLink($contact['url']), '$addr' => defaults($contact, 'addr', ''), '$network_name' => $networkname, - '$network' => L10n::t('Network:'), - '$account_type' => Model\Contact::getAccountType($a->data['contact']) + '$network' => L10n::t('Network:'), + '$account_type' => Model\Contact::getAccountType($contact) ]); $findpeople_widget = ''; From a883a99fe6533c4378091c37fac1c8e335c1bdeb Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 14 Oct 2018 18:27:24 -0400 Subject: [PATCH 14/20] Replace string fields by array in Module\Contact --- src/Module/Contact.php | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/src/Module/Contact.php b/src/Module/Contact.php index 74dac524a0..6c0d876050 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -281,45 +281,34 @@ class Contact extends BaseModule return; } - $updatefields = ["name", "nick", "url", "addr", "batch", "notify", "poll", "request", "confirm", - "poco", "network", "alias"]; - $update = []; + $updatefields = ['name', 'nick', 'url', 'addr', 'batch', 'notify', 'poll', 'request', 'confirm', 'poco', 'network', 'alias']; + $fields = []; - if ($data["network"] == Protocol::OSTATUS) { - $result = Model\Contact::createFromProbe($uid, $data["url"], false); + if ($data['network'] == Protocol::OSTATUS) { + $result = Model\Contact::createFromProbe($uid, $data['url'], false); if ($result['success']) { - $update["subhub"] = true; + $fields['subhub'] = true; } } foreach ($updatefields AS $field) { - if (isset($data[$field]) && ($data[$field] != "")) { - $update[$field] = $data[$field]; + if (!empty($data[$field])) { + $fields[$field] = $data[$field]; } } - $update["nurl"] = normalise_link($data["url"]); + $fields['nurl'] = normalise_link($data['url']); - $query = ""; - - if (isset($data["priority"]) && ($data["priority"] != 0)) { - $query = "'priority' => '" . intval($data["priority"]) . "'"; + if (!empty($data['priority'])) { + $fields['priority'] = intval($data['priority']); } - foreach ($update AS $key => $value) { - if ($query != "") { - $query .= ", "; - } - - $query .= "'" . $key . "' => '" . DBA::escape($value) . "'"; - } - - if ($query == "") { + if (empty($fields)) { return; } - $r = DBA::update('contact', $query, ['id' => $contact_id, 'uid' => local_user()]); + $r = DBA::update('contact', $fields, ['id' => $contact_id, 'uid' => local_user()]); // Update the entry in the contact table Model\Contact::updateAvatar($data['photo'], local_user(), $contact_id, true); From aa8039373a0017001dd8e020031d78c16d064d0d Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 14 Oct 2018 18:30:02 -0400 Subject: [PATCH 15/20] Update formatting of Module\Contact - Replace double quotes with single - Align array declarations - Replace q() call with Model\User::getOwnerDataById() --- src/Module/Contact.php | 305 ++++++++++++++++++++--------------------- 1 file changed, 150 insertions(+), 155 deletions(-) diff --git a/src/Module/Contact.php b/src/Module/Contact.php index 6c0d876050..0eb912e00a 100644 --- a/src/Module/Contact.php +++ b/src/Module/Contact.php @@ -26,7 +26,7 @@ use Friendica\Module\Login; * * @brief manages contacts */ -class Contact extends BaseModule +class Contact extends BaseModule { public static function init() { @@ -37,8 +37,8 @@ class Contact extends BaseModule } $nets = defaults($_GET, 'nets', ''); - if ($nets == "all") { - $nets = ""; + if ($nets == 'all') { + $nets = ''; } if (!x($a->page, 'aside')) { @@ -47,7 +47,9 @@ class Contact extends BaseModule $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']))) { + 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()]); @@ -110,16 +112,16 @@ class Contact extends BaseModule $groups_widget = null; } - $a->page['aside'] .= replace_macros(get_markup_template("contacts-widget-sidebar.tpl"), [ - '$vcard_widget' => $vcard_widget, + $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 + '$follow_widget' => $follow_widget, + '$groups_widget' => $groups_widget, + '$networks_widget' => $networks_widget ]); $base = $a->getBaseURL(); - $tpl = get_markup_template("contacts-head.tpl"); + $tpl = get_markup_template('contacts-head.tpl'); $a->page['htmlhead'] .= replace_macros($tpl, [ '$baseurl' => System::baseUrl(true), '$base' => $base @@ -136,7 +138,7 @@ class Contact extends BaseModule $stmt = DBA::select('contact', ['id'], ['id' => $contacts_id, 'uid' => local_user(), 'self' => false]); $orig_records = DBA::toArray($stmt); - + $count_actions = 0; foreach ($orig_records as $orig_record) { $contact_id = $orig_record['id']; @@ -163,7 +165,7 @@ class Contact extends BaseModule } } if ($count_actions > 0) { - info(L10n::tt("%d contact edited.", "%d contacts edited.", $count_actions)); + info(L10n::tt('%d contact edited.', '%d contacts edited.', $count_actions)); } goaway('contact'); @@ -177,7 +179,7 @@ class Contact extends BaseModule return; } - if ($a->argv[1] === "batch") { + if ($a->argv[1] === 'batch') { self::batchActions($a); return; } @@ -218,15 +220,16 @@ class Contact extends BaseModule $info = escape_tags(trim($_POST['info'])); - $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()]); + $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); @@ -251,17 +254,17 @@ class Contact extends BaseModule return; } - $uid = $contact["uid"]; + $uid = $contact['uid']; - if ($contact["network"] == Protocol::OSTATUS) { - $result = Model\Contact::createFromProbe($uid, $contact["url"], false, $contact["network"]); + if ($contact['network'] == Protocol::OSTATUS) { + $result = Model\Contact::createFromProbe($uid, $contact['url'], false, $contact['network']); if ($result['success']) { DBA::update('contact', ['subhub' => 1], ['id' => $contact_id]); } } else { // pull feed and consume it, which should subscribe to the hub. - Worker::add(PRIORITY_HIGH, "OnePoll", $contact_id, "force"); + Worker::add(PRIORITY_HIGH, 'OnePoll', $contact_id, 'force'); } } @@ -272,12 +275,12 @@ class Contact extends BaseModule return; } - $uid = $contact["uid"]; + $uid = $contact['uid']; - $data = Probe::uri($contact["url"], "", 0, false); + $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"])) { + // 'Feed' or 'Unknown' is mostly a sign of communication problems + if ((in_array($data['network'], [Protocol::FEED, Protocol::PHANTOM])) && ($data['network'] != $contact['network'])) { return; } @@ -314,7 +317,7 @@ class Contact extends BaseModule Model\Contact::updateAvatar($data['photo'], local_user(), $contact_id, true); // Update the entry in the gcontact table - Model\GContact::updateFromProbe($data["url"]); + Model\GContact::updateFromProbe($data['url']); } private static function blockContact($contact_id) @@ -339,17 +342,12 @@ class Contact extends BaseModule 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)) { + $owner = Model\User::getOwnerDataById(local_user()); + if (!DBA::isResult($owner)) { return; } - Model\Contact::terminateFriendship($r[0], $orig_record, true); + Model\Contact::terminateFriendship($owner, $orig_record, true); Model\Contact::remove($orig_record['id']); } @@ -480,7 +478,7 @@ class Contact extends BaseModule '$baseurl' => $a->getBaseURL(true), ]); - $contact['blocked'] = Model\Contact::isBlockedByUser($contact['id'], local_user()); + $contact['blocked'] = Model\Contact::isBlockedByUser($contact['id'], local_user()); $contact['readonly'] = Model\Contact::isIgnoredByUser($contact['id'], local_user()); $dir_icon = ''; @@ -510,7 +508,7 @@ class Contact extends BaseModule } if (!in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])) { - $relation_text = ""; + $relation_text = ''; } $relation_text = sprintf($relation_text, htmlentities($contact['name'])); @@ -527,13 +525,13 @@ class Contact extends BaseModule $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")); + $last_update .= ' ' . (($contact['last-update'] <= $contact['success_update']) ? L10n::t('(Update was successful)') : L10n::t('(Update was not successful)')); } $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"])); + $nettype = L10n::t('Network type: %s', ContactSelector::networkToName($contact['network'], $contact['url'])); // tabs $tab_str = self::getTabsHTML($a, $contact, 3); @@ -546,8 +544,9 @@ class Contact extends BaseModule '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'), + 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') @@ -557,12 +556,12 @@ class Contact extends BaseModule $poll_interval = null; if (in_array($contact['network'], [Protocol::FEED, Protocol::MAIL])) { - $poll_interval = ContactSelector::pollInterval($contact['priority'], (!$poll_enabled)); + $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)); + $profile_select = ContactSelector::profileAssign($contact['profile-id'], $contact['network'] !== Protocol::DFRN); } /// @todo Only show the following link with DFRN when the remote version supports it @@ -570,12 +569,12 @@ class Contact extends BaseModule $follow_text = ''; if (in_array($contact['rel'], [Model\Contact::FRIEND, Model\Contact::SHARING])) { if (in_array($contact['network'], Protocol::NATIVE_SUPPORT)) { - $follow = $a->getBaseURL(true) . "/unfollow?url=" . urlencode($contact["url"]); - $follow_text = L10n::t("Disconnect/Unfollow"); + $follow = $a->getBaseURL(true) . '/unfollow?url=' . urlencode($contact['url']); + $follow_text = L10n::t('Disconnect/Unfollow'); } } else { - $follow = $a->getBaseURL(true) . "/follow?url=" . urlencode($contact["url"]); - $follow_text = L10n::t("Connect/Follow"); + $follow = $a->getBaseURL(true) . '/follow?url=' . urlencode($contact['url']); + $follow_text = L10n::t('Connect/Follow'); } // Load contactact related actions like hide, suggest, delete and others @@ -591,72 +590,72 @@ class Contact extends BaseModule $contact_settings_label = null; } - $tpl = get_markup_template("contact_edit.tpl"); + $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, + '$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')], + '$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' => Model\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"), + '$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' => Model\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"), + '$contact_profile_label' => L10n::t('Profile'), ]); $arr = ['contact' => $contact, 'output' => $o]; @@ -800,29 +799,29 @@ class Contact extends BaseModule } } - $tpl = get_markup_template("contacts-template.tpl"); + $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, + '$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'), + '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), + '$paginate' => paginate($a), ]); return $o; @@ -938,18 +937,16 @@ class Contact extends BaseModule } if (DBA::isResult($contact)) { - $a->page['aside'] = ""; + $a->page['aside'] = ''; - $profiledata = Model\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])) { - $profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]); - } + if (local_user() && in_array($profiledata['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { + $profiledata['remoteconnect'] = System::baseUrl() . '/follow?url=' . urlencode($profiledata['url']); } - Model\Profile::load($a, "", 0, $profiledata, true); - $o .= Model\Contact::getPostsFromUrl($contact["url"], true, $update); + Model\Profile::load($a, '', 0, $profiledata, true); + $o .= Model\Contact::getPostsFromUrl($contact['url'], true, $update); } return $o; @@ -962,18 +959,16 @@ class Contact extends BaseModule $o = self::getTabsHTML($a, $contact, 2); if (DBA::isResult($contact)) { - $a->page['aside'] = ""; + $a->page['aside'] = ''; - $profiledata = Model\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])) { - $profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]); - } + if (local_user() && in_array($profiledata['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { + $profiledata['remoteconnect'] = System::baseUrl() . '/follow?url=' . urlencode($profiledata['url']); } - Model\Profile::load($a, "", 0, $profiledata, true); - $o .= Model\Contact::getPostsFromUrl($contact["url"]); + Model\Profile::load($a, '', 0, $profiledata, true); + $o .= Model\Contact::getPostsFromUrl($contact['url']); } return $o; @@ -1021,20 +1016,20 @@ 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' => 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']), + 'edit_hover'=> L10n::t('Edit contact'), + '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' => Model\Contact::getAccountType($rr), - 'sparkle' => $sparkle, + 'sparkle' => $sparkle, 'itemurl' => defaults($rr, 'addr', $rr['url']), - 'url' => $url, - 'network' => ContactSelector::networkToName($rr['network'], $rr['url']), - 'nick' => htmlentities($rr['nick']), + 'url' => $url, + 'network' => ContactSelector::networkToName($rr['network'], $rr['url']), + 'nick' => htmlentities($rr['nick']), ]; } From ea8b159df476ac6048d9e1152aa2a6490fca3aa3 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 14 Oct 2018 23:09:11 -0400 Subject: [PATCH 16/20] Fix wrong use statement in mod/update_contacts --- mod/update_contacts.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/update_contacts.php b/mod/update_contacts.php index 6123d03045..1144ed1427 100644 --- a/mod/update_contacts.php +++ b/mod/update_contacts.php @@ -5,7 +5,7 @@ use Friendica\App; use Friendica\Core\L10n; use Friendica\Core\PConfig; -use Friendica\Module\Contacts; +use Friendica\Module\Contact; function update_contacts_content(App $a) { From e2762e032ceb0cd42d411b1e7832d576fb511f40 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 15 Oct 2018 05:19:35 +0000 Subject: [PATCH 17/20] Poddibility to defer worker execution --- boot.php | 2 +- config/dbstructure.json | 6 +++-- src/Core/Worker.php | 49 +++++++++++++++++++++++++++++++++++------ 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/boot.php b/boot.php index eda4ed1e8d..f40edaf907 100644 --- a/boot.php +++ b/boot.php @@ -41,7 +41,7 @@ define('FRIENDICA_PLATFORM', 'Friendica'); define('FRIENDICA_CODENAME', 'The Tazmans Flax-lily'); define('FRIENDICA_VERSION', '2018.12-dev'); define('DFRN_PROTOCOL_VERSION', '2.23'); -define('DB_UPDATE_VERSION', 1285); +define('DB_UPDATE_VERSION', 1286); define('NEW_UPDATE_ROUTINE_VERSION', 1170); /** diff --git a/config/dbstructure.json b/config/dbstructure.json index 443f9bd755..8ea5aaa4bf 100644 --- a/config/dbstructure.json +++ b/config/dbstructure.json @@ -1298,14 +1298,16 @@ "created": {"type": "datetime", "not null": "1", "default": "0001-01-01 00:00:00", "comment": "Creation date"}, "pid": {"type": "int unsigned", "not null": "1", "default": "0", "comment": "Process id of the worker"}, "executed": {"type": "datetime", "not null": "1", "default": "0001-01-01 00:00:00", "comment": "Execution date"}, + "next_try": {"type": "datetime", "not null": "1", "default": "0001-01-01 00:00:00", "comment": "Next retrial date"}, + "retrial": {"type": "tinyint", "not null": "1", "default": "0", "comment": "Retrial counter"}, "done": {"type": "boolean", "not null": "1", "default": "0", "comment": "Marked 1 when the task was done - will be deleted later"} }, "indexes": { "PRIMARY": ["id"], "pid": ["pid"], "parameter": ["parameter(64)"], - "priority_created": ["priority", "created"], - "done_executed": ["done", "executed"] + "priority_created_next_try": ["priority", "created", "next_try"], + "done_executed_next_try": ["done", "executed", "next_try"] } } } diff --git a/src/Core/Worker.php b/src/Core/Worker.php index bf7e9f3bc8..723cd809da 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -8,6 +8,7 @@ use Friendica\Database\DBA; use Friendica\Model\Process; use Friendica\Util\DateTimeFormat; use Friendica\Util\Network; +use Friendica\BaseObject; require_once 'include/dba.php'; @@ -152,7 +153,8 @@ class Worker */ private static function totalEntries() { - return DBA::count('workerqueue', ["`executed` <= ? AND NOT `done`", NULL_DATE]); + return DBA::count('workerqueue', ["`executed` <= ? AND NOT `done` AND `next_try` < ?", + NULL_DATE, DateTimeFormat::utcNow()]); } /** @@ -162,7 +164,7 @@ class Worker */ private static function highestPriority() { - $condition = ["`executed` <= ? AND NOT `done`", NULL_DATE]; + $condition = ["`executed` <= ? AND NOT `done` AND `next_try` < ?", NULL_DATE, DateTimeFormat::utcNow()]; $workerqueue = DBA::selectFirst('workerqueue', ['priority'], $condition, ['order' => ['priority']]); if (DBA::isResult($workerqueue)) { return $workerqueue["priority"]; @@ -180,7 +182,8 @@ class Worker */ private static function processWithPriorityActive($priority) { - $condition = ["`priority` <= ? AND `executed` > ? AND NOT `done`", $priority, NULL_DATE]; + $condition = ["`priority` <= ? AND `executed` > ? AND NOT `done` AND `next_try` < ?", + $priority, NULL_DATE, DateTimeFormat::utcNow()]; return DBA::exists('workerqueue', $condition); } @@ -240,7 +243,7 @@ class Worker self::execFunction($queue, $include, $argv, true); $stamp = (float)microtime(true); - if (DBA::update('workerqueue', ['done' => true], ['id' => $queue["id"]])) { + if (DBA::update('workerqueue', ['done' => true], ['id' => $queue['id']])) { Config::set('system', 'last_worker_execution', DateTimeFormat::utcNow()); } self::$db_duration = (microtime(true) - $stamp); @@ -805,7 +808,8 @@ class Worker $result = DBA::select( 'workerqueue', ['id'], - ["`executed` <= ? AND `priority` < ? AND NOT `done`", NULL_DATE, $highest_priority], + ["`executed` <= ? AND `priority` < ? AND NOT `done` AND `next_try` < ?", + NULL_DATE, $highest_priority, DateTimeFormat::utcNow()], ['limit' => $limit, 'order' => ['priority', 'created']] ); @@ -821,7 +825,8 @@ class Worker $result = DBA::select( 'workerqueue', ['id'], - ["`executed` <= ? AND `priority` > ? AND NOT `done`", NULL_DATE, $highest_priority], + ["`executed` <= ? AND `priority` > ? AND NOT `done` AND `next_try` < ?", + NULL_DATE, $highest_priority, DateTimeFormat::utcNow()], ['limit' => $limit, 'order' => ['priority', 'created']] ); @@ -840,7 +845,8 @@ class Worker $result = DBA::select( 'workerqueue', ['id'], - ["`executed` <= ? AND NOT `done`", NULL_DATE], + ["`executed` <= ? AND NOT `done` AND `next_try` < ?", + NULL_DATE, DateTimeFormat::utcNow()], ['limit' => $limit, 'order' => ['priority', 'created']] ); @@ -1116,6 +1122,35 @@ class Worker return true; } + /** + * Defers the current worker entry + */ + public static function defer() + { + if (empty(BaseObject::getApp()->queue)) { + return; + } + + $queue = BaseObject::getApp()->queue; + + $retrial = $queue['retrial']; + $id = $queue['id']; + + if ($retrial > 14) { + logger('Id ' . $id . ' had been tried 14 times, it will be deleted now.', LOGGER_DEBUG); + DBA::delete('workerqueue', ['id' => $id]); + } + + // Calculate the delay until the next trial + $delay = (($retrial + 3) ** 4) + (rand(1, 30) * ($retrial + 1)); + $next = DateTimeFormat::utc('now + ' . $delay . ' seconds'); + + logger('Defer execution ' . $retrial . ' of id ' . $id . ' to ' . $next, LOGGER_DEBUG); + + $fields = ['retrial' => $retrial + 1, 'next_try' => $next, 'executed' => NULL_DATE, 'pid' => 0]; + DBA::update('workerqueue', $fields, ['id' => $id]); + } + /** * Log active processes into the "process" table * From c2c2f25d9224dee090d92a883d2b9c72fe813068 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Mon, 15 Oct 2018 10:36:27 +0200 Subject: [PATCH 18/20] added links to alternative ways to install Friendica to the docs --- INSTALL.txt | 7 +++++++ doc/Install.md | 8 ++++++++ doc/de/Install.md | 8 ++++++++ 3 files changed, 23 insertions(+) diff --git a/INSTALL.txt b/INSTALL.txt index 705eb8fed2..fe733eefe7 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -56,6 +56,13 @@ you wish to communicate with the Diaspora network. - For alternative server configurations (such as Nginx server and MariaDB database engine), refer to the wiki at https://github.com/friendica/friendica/wiki +This guide will walk you through the manual installation process of Friendica. +If this is nothing for you, you might be interested in + +* the Friendica Docker image (https://github.com/friendica/docker) or +* how install Friendica with YunoHost] https://github.com/YunoHost-Apps/friendica_ynh). + + 2. Unpack the Friendica files into the root of your web server document area. - If you copy the directory tree to your webserver, make sure diff --git a/doc/Install.md b/doc/Install.md index 427299c3ea..e6d1d40645 100644 --- a/doc/Install.md +++ b/doc/Install.md @@ -40,6 +40,14 @@ Requirements Installation procedure --- +### Alternative Installation Methods + +This guide will walk you through the manual installation process of Friendica. +If this is nothing for you, you might be interested in + +* the [Friendica Docker image](https://github.com/friendica/docker) or +* how [install Friendica with YunoHost](https://github.com/YunoHost-Apps/friendica_ynh). + ### Get Friendica Unpack the Friendica files into the root of your web server document area. diff --git a/doc/de/Install.md b/doc/de/Install.md index 84d9a0d48e..132fbc1904 100644 --- a/doc/de/Install.md +++ b/doc/de/Install.md @@ -40,6 +40,14 @@ Requirements Installation --- +### Alternative Wege um Friendica zu Installieren + +Diese Anleitung wird dir Schritt-für-Schritt zeigen wie du Friendica auf deinem Server installieren kannst. +Falls du an automatischen Möglichkeiten interesse hast, wirf doch einen Blick auf + +* das [Docker image für Friendica](https://github.com/friendica/docker) oder +* die [Installation von Friendica auf YunoHost](https://github.com/YunoHost-Apps/friendica_ynh). + ### Friendica Entpacke die Friendica-Daten in das Quellverzeichnis (root) des Dokumentenbereichs deines Webservers. From 4496fdba2475540458e5878d6525bacf47487218 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Mon, 15 Oct 2018 13:44:09 +0200 Subject: [PATCH 19/20] use the right bracket --- INSTALL.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.txt b/INSTALL.txt index fe733eefe7..ee98b8981d 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -60,7 +60,7 @@ This guide will walk you through the manual installation process of Friendica. If this is nothing for you, you might be interested in * the Friendica Docker image (https://github.com/friendica/docker) or -* how install Friendica with YunoHost] https://github.com/YunoHost-Apps/friendica_ynh). +* how install Friendica with YunoHos (https://github.com/YunoHost-Apps/friendica_ynh). 2. Unpack the Friendica files into the root of your web server document area. From 092125edb6812116d4a2f82d5a58afdd396a599b Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Mon, 15 Oct 2018 13:45:21 +0200 Subject: [PATCH 20/20] ypot --- INSTALL.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.txt b/INSTALL.txt index ee98b8981d..2f0613fb7d 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -60,7 +60,7 @@ This guide will walk you through the manual installation process of Friendica. If this is nothing for you, you might be interested in * the Friendica Docker image (https://github.com/friendica/docker) or -* how install Friendica with YunoHos (https://github.com/YunoHost-Apps/friendica_ynh). +* how install Friendica with YunoHost (https://github.com/YunoHost-Apps/friendica_ynh). 2. Unpack the Friendica files into the root of your web server document area.