X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2FContact.php;h=d0f4023447f1448962d7f1ffd0bbabfcff3e97ab;hb=b010a7db0d0073fc1bf0825e73a295d0bbeb9ada;hp=28cb6371e36f507026c997fa30964cd90d162183;hpb=2ca79534714417b278b3645fad7a99d365c6e42e;p=friendica.git diff --git a/include/Contact.php b/include/Contact.php index 28cb6371e3..d0f4023447 100644 --- a/include/Contact.php +++ b/include/Contact.php @@ -22,6 +22,7 @@ function user_remove($uid) { $r[0]['nickname'] ); + /// @todo Should be done in a background job since this likely will run into a time out // don't delete yet, will be done later when contacts have deleted my stuff // q("DELETE FROM `contact` WHERE `uid` = %d", intval($uid)); q("DELETE FROM `gcign` WHERE `uid` = %d", intval($uid)); @@ -74,25 +75,10 @@ function contact_remove($id) { return; } - q("DELETE FROM `contact` WHERE `id` = %d", - intval($id) - ); - q("DELETE FROM `item` WHERE `contact-id` = %d ", - intval($id) - ); - q("DELETE FROM `photo` WHERE `contact-id` = %d ", - intval($id) - ); - q("DELETE FROM `mail` WHERE `contact-id` = %d ", - intval($id) - ); - q("DELETE FROM `event` WHERE `cid` = %d ", - intval($id) - ); - q("DELETE FROM `queue` WHERE `cid` = %d ", - intval($id) - ); + q("DELETE FROM `contact` WHERE `id` = %d", intval($id)); + // Delete the rest in the background + proc_run(PRIORITY_LOW, 'include/remove_contact.php', $id); } @@ -145,7 +131,6 @@ function terminate_friendship($user,$self,$contact) { // This provides for the possibility that their database is temporarily messed // up or some other transient event and that there's a possibility we could recover from it. -if(! function_exists('mark_for_death')) { function mark_for_death($contact) { if($contact['archive']) @@ -156,14 +141,24 @@ function mark_for_death($contact) { dbesc(datetime_convert()), intval($contact['id']) ); - } - else { + + if ($contact['url'] != '') { + q("UPDATE `contact` SET `term-date` = '%s' + WHERE `nurl` = '%s' AND `term-date` <= '1000-00-00'", + dbesc(datetime_convert()), + dbesc(normalise_link($contact['url'])) + ); + } + } else { /// @todo /// We really should send a notification to the owner after 2-3 weeks /// so they won't be surprised when the contact vanishes and can take /// remedial action if this was a serious mistake or glitch + /// @todo + /// Check for contact vitality via probing + $expiry = $contact['term-date'] . ' + 32 days '; if(datetime_convert() > datetime_convert('UTC','UTC',$expiry)) { @@ -171,31 +166,51 @@ function mark_for_death($contact) { // archive them rather than delete // though if the owner tries to unarchive them we'll start the whole process over again - q("update contact set `archive` = 1 where id = %d", + q("UPDATE `contact` SET `archive` = 1 WHERE `id` = %d", intval($contact['id']) ); - q("UPDATE `item` SET `private` = 2 WHERE `contact-id` = %d AND `uid` = %d", intval($contact['id']), intval($contact['uid'])); - - //contact_remove($contact['id']); + if ($contact['url'] != '') { + q("UPDATE `contact` SET `archive` = 1 WHERE `nurl` = '%s'", + dbesc(normalise_link($contact['url'])) + ); + } } } -}} +} -if(! function_exists('unmark_for_death')) { function unmark_for_death($contact) { + + $r = q("SELECT `term-date` FROM `contact` WHERE `id` = %d AND `term-date` > '%s'", + intval($contact['id']), + dbesc('1000-00-00 00:00:00') + ); + + // We don't need to update, we never marked this contact as dead + if (!dbm::is_result($r)) { + return; + } + // It's a miracle. Our dead contact has inexplicably come back to life. q("UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d", dbesc('0000-00-00 00:00:00'), intval($contact['id']) ); -}} + + if ($contact['url'] != '') { + q("UPDATE `contact` SET `term-date` = '%s' WHERE `nurl` = '%s'", + dbesc('0000-00-00 00:00:00'), + dbesc(normalise_link($contact['url'])) + ); + } +} /** * @brief Get contact data for a given profile link * * The function looks at several places (contact table and gcontact table) for the contact + * It caches its result for the same script execution to prevent duplicate calls * * @param string $url The profile link * @param int $uid User id @@ -204,8 +219,15 @@ function unmark_for_death($contact) { * @return array Contact data */ function get_contact_details_by_url($url, $uid = -1, $default = array()) { - if ($uid == -1) + static $cache = array(); + + if ($uid == -1) { $uid = local_user(); + } + + if (isset($cache[$url][$uid])) { + return $cache[$url][$uid]; + } // Fetch contact data from the contact table for the given user $r = q("SELECT `id`, `id` AS `cid`, 0 AS `gid`, 0 AS `zid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`, `xmpp`, @@ -229,10 +251,13 @@ function get_contact_details_by_url($url, $uid = -1, $default = array()) { if ($r) { // If there is more than one entry we filter out the connector networks - if (count($r) > 1) - foreach ($r AS $id => $result) - if ($result["network"] == NETWORK_STATUSNET) + if (count($r) > 1) { + foreach ($r AS $id => $result) { + if ($result["network"] == NETWORK_STATUSNET) { unset($r[$id]); + } + } + } $profile = array_shift($r); @@ -251,31 +276,40 @@ function get_contact_details_by_url($url, $uid = -1, $default = array()) { $profile["bd"] = $current_year."-".$month."-".$day; $current = $current_year."-".$current_month."-".$current_day; - if ($profile["bd"] < $current) + if ($profile["bd"] < $current) { $profile["bd"] = (++$current_year)."-".$month."-".$day; - } else + } + } else { $profile["bd"] = "0000-00-00"; - } else + } + } else { $profile = $default; + } - if (($profile["photo"] == "") AND isset($default["photo"])) + if (($profile["photo"] == "") AND isset($default["photo"])) { $profile["photo"] = $default["photo"]; + } - if (($profile["name"] == "") AND isset($default["name"])) + if (($profile["name"] == "") AND isset($default["name"])) { $profile["name"] = $default["name"]; + } - if (($profile["network"] == "") AND isset($default["network"])) + if (($profile["network"] == "") AND isset($default["network"])) { $profile["network"] = $default["network"]; + } - if (($profile["thumb"] == "") AND isset($profile["photo"])) + if (($profile["thumb"] == "") AND isset($profile["photo"])) { $profile["thumb"] = $profile["photo"]; + } - if (($profile["micro"] == "") AND isset($profile["thumb"])) + if (($profile["micro"] == "") AND isset($profile["thumb"])) { $profile["micro"] = $profile["thumb"]; + } if ((($profile["addr"] == "") OR ($profile["name"] == "")) AND ($profile["gid"] != 0) AND - in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) + in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) { proc_run(PRIORITY_LOW, "include/update_gcontact.php", $profile["gid"]); + } // Show contact details of Diaspora contacts only if connected if (($profile["cid"] == 0) AND ($profile["network"] == NETWORK_DIASPORA)) { @@ -285,7 +319,9 @@ function get_contact_details_by_url($url, $uid = -1, $default = array()) { $profile["birthday"] = "0000-00-00"; } - return($profile); + $cache[$url][$uid] = $profile; + + return $profile; } if (! function_exists('contact_photo_menu')) { @@ -428,9 +464,20 @@ function contacts_not_grouped($uid,$start = 0,$count = 0) { return $r; } -function get_contact($url, $uid = 0) { +/** + * @brief Fetch the contact id for a given url and user + * + * @param string $url Contact URL + * @param integer $uid The user id for the contact + * @param boolean $no_update Don't update the contact + * + * @return integer Contact ID + */ +function get_contact($url, $uid = 0, $no_update = false) { require_once("include/Scrape.php"); + logger("Get contact data for url ".$url." and user ".$uid." - ".App::callstack(), LOGGER_DEBUG);; + $data = array(); $contactid = 0; @@ -460,8 +507,9 @@ function get_contact($url, $uid = 0) { $update_photo = ($contact[0]['avatar-date'] < datetime_convert('','','now -7 days')); //$update_photo = ($contact[0]['avatar-date'] < datetime_convert('','','now -12 hours')); - if (!$update_photo) + if (!$update_photo OR $no_update) { return($contactid); + } } elseif ($uid != 0) return 0; @@ -487,9 +535,9 @@ function get_contact($url, $uid = 0) { if ($contactid == 0) { q("INSERT INTO `contact` (`uid`, `created`, `url`, `nurl`, `addr`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`, - `batch`, `request`, `confirm`, `poco`, + `batch`, `request`, `confirm`, `poco`, `name-date`, `uri-date`, `writable`, `blocked`, `readonly`, `pending`) - VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', 1, 0, 0, 0)", + VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', 1, 0, 0, 0)", intval($uid), dbesc(datetime_convert()), dbesc($data["url"]), @@ -508,7 +556,9 @@ function get_contact($url, $uid = 0) { dbesc($data["batch"]), dbesc($data["request"]), dbesc($data["confirm"]), - dbesc($data["poco"]) + dbesc($data["poco"]), + dbesc(datetime_convert()), + dbesc(datetime_convert()) ); $contact = q("SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d ORDER BY `id` LIMIT 2", @@ -539,16 +589,27 @@ function get_contact($url, $uid = 0) { update_contact_avatar($data["photo"],$uid,$contactid); - q("UPDATE `contact` SET `addr` = '%s', `alias` = '%s', `name` = '%s', `nick` = '%s', - `name-date` = '%s', `uri-date` = '%s' WHERE `id` = %d", - dbesc($data["addr"]), - dbesc($data["alias"]), - dbesc($data["name"]), - dbesc($data["nick"]), - dbesc(datetime_convert()), - dbesc(datetime_convert()), - intval($contactid) - ); + $r = q("SELECT `addr`, `alias`, `name`, `nick` FROM `contact` WHERE `id` = %d", intval($contactid)); + + // This condition should always be true + if (!dbm::is_result($r)) + return $contactid; + + // Only update if there had something been changed + if (($data["addr"] != $r[0]["addr"]) OR + ($data["alias"] != $r[0]["alias"]) OR + ($data["name"] != $r[0]["name"]) OR + ($data["nick"] != $r[0]["nick"])) + q("UPDATE `contact` SET `addr` = '%s', `alias` = '%s', `name` = '%s', `nick` = '%s', + `name-date` = '%s', `uri-date` = '%s' WHERE `id` = %d", + dbesc($data["addr"]), + dbesc($data["alias"]), + dbesc($data["name"]), + dbesc($data["nick"]), + dbesc(datetime_convert()), + dbesc(datetime_convert()), + intval($contactid) + ); return $contactid; }