Unified contact data handling

This commit is contained in:
Michael Vogel 2016-06-05 13:57:11 +02:00
parent 20ab3f13a6
commit 71d3274841
11 changed files with 113 additions and 101 deletions

View file

@ -192,72 +192,58 @@ function unmark_for_death($contact) {
); );
}} }}
function get_contact_details_by_url($url, $uid = -1) { function get_contact_details_by_url($url, $uid = -1, $default = array()) {
if ($uid == -1) if ($uid == -1)
$uid = local_user(); $uid = local_user();
$r = q("SELECT `id` AS `gid`, `url`, `name`, `nick`, `addr`, `photo`, `location`, `about`, `keywords`, `gender`, `community`, `network` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", // community, nurl, alias, nsfw, birthday
// Fetch contact data from the contact table for the user and given network
$r = q("SELECT `id`, `id` AS `cid`, 0 AS `gid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`,
`keywords`, `gender`, `photo`, `thumb`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `bd`, `bd` AS `birthday`, `self`
FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `network` IN ('%s', '')",
dbesc(normalise_link($url)), intval($uid), dbesc($profile["network"]));
// Is the contact present for the user in a different network? (Can happen with OStatus and the "Statusnet" addon)
if (!count($r) AND !isset($profile))
$r = q("SELECT `id`, `id` AS `cid`, 0 AS `gid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`,
`keywords`, `gender`, `photo`, `thumb`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `bd`, `bd` AS `birthday`, `self`
FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d",
dbesc(normalise_link($url)), intval($uid));
// Fetch the data from the contact table with "uid=0" (which is filled automatically)
if (!count($r) AND !isset($profile))
$r = q("SELECT `id`, 0 AS `cid`, 0 AS `gid`, `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`,
`keywords`, `gender`, `photo`, `thumb`, `forum`, `prv`, (`forum` | `prv`) AS `community`, `bd`, `bd` AS `birthday`, 0 AS `self`
FROM `contact` WHERE `nurl` = '%s' AND `uid` = 0",
dbesc(normalise_link($url))); dbesc(normalise_link($url)));
if ($r) { // Fetch the data from the gcontact table
$profile = $r[0]; if (!count($r) AND !isset($profile))
$r = q("SELECT 0 AS `id`, 0 AS `cid`, `id` AS `gid`, 0 AS `uid`, `url`, `nurl`, `alias`, `network`, `name`, `nick`, `addr`, `location`, `about`,
`keywords`, `gender`, `photo`, `photo` AS `thumb`, `community` AS `forum`, 0 AS `prv`, `community`, `birthday` AS `bd`, `birthday`, 0 AS `self`
FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
dbesc(normalise_link($url)));
if ((($profile["addr"] == "") OR ($profile["name"] == "")) AND if ($r)
in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) $profile = $r[0];
else {
$profile = $default;
if (!isset($profile["thumb"]) AND isset($profile["photo"]))
$profile["thumb"] = $profile["photo"];
}
if ((($profile["addr"] == "") OR ($profile["name"] == "")) AND ($profile["gid"] != 0) AND
in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) {
proc_run('php',"include/update_gcontact.php", $profile["gid"]); proc_run('php',"include/update_gcontact.php", $profile["gid"]);
} }
// Fetching further contact data from the contact table // Show contact details of Diaspora contacts only if connected
$r = q("SELECT `id`, `uid`, `url`, `network`, `name`, `nick`, `addr`, `location`, `about`, `keywords`, `gender`, `photo`, `thumb`, `addr`, `forum`, `prv`, `bd`, `self` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `network` IN ('%s', '')",
dbesc(normalise_link($url)), intval($uid), dbesc($profile["network"]));
if (!count($r) AND !isset($profile))
$r = q("SELECT `id`, `uid`, `url`, `network`, `name`, `nick`, `addr`, `location`, `about`, `keywords`, `gender`, `photo`, `thumb`, `addr`, `forum`, `prv`, `bd`, `self` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d",
dbesc(normalise_link($url)), intval($uid));
if (!count($r) AND !isset($profile))
$r = q("SELECT `id`, `uid`, `url`, `network`, `name`, `nick`, `addr`, `location`, `about`, `keywords`, `gender`, `photo`, `thumb`, `addr`, `forum`, `prv`, `bd` FROM `contact` WHERE `nurl` = '%s' AND `uid` = 0",
dbesc(normalise_link($url)));
if ($r) {
if (!isset($profile["url"]) AND $r[0]["url"])
$profile["url"] = $r[0]["url"];
if (!isset($profile["name"]) AND $r[0]["name"])
$profile["name"] = $r[0]["name"];
if (!isset($profile["nick"]) AND $r[0]["nick"])
$profile["nick"] = $r[0]["nick"];
if (!isset($profile["addr"]) AND $r[0]["addr"])
$profile["addr"] = $r[0]["addr"];
if ((!isset($profile["photo"]) OR $r[0]["self"]) AND $r[0]["photo"])
$profile["photo"] = $r[0]["photo"];
if (!isset($profile["location"]) AND $r[0]["location"])
$profile["location"] = $r[0]["location"];
if (!isset($profile["about"]) AND $r[0]["about"])
$profile["about"] = $r[0]["about"];
if (!isset($profile["keywords"]) AND $r[0]["keywords"])
$profile["keywords"] = $r[0]["keywords"];
if (!isset($profile["gender"]) AND $r[0]["gender"])
$profile["gender"] = $r[0]["gender"];
if (isset($r[0]["forum"]) OR isset($r[0]["prv"]))
$profile["community"] = ($r[0]["forum"] OR $r[0]["prv"]);
if (!isset($profile["network"]) AND $r[0]["network"])
$profile["network"] = $r[0]["network"];
if (!isset($profile["addr"]) AND $r[0]["addr"])
$profile["addr"] = $r[0]["addr"];
if (!isset($profile["bd"]) AND $r[0]["bd"])
$profile["bd"] = $r[0]["bd"];
if (isset($r[0]["thumb"]))
$profile["thumb"] = $r[0]["thumb"];
if ($r[0]["uid"] == 0)
$profile["cid"] = 0;
else
$profile["cid"] = $r[0]["id"];
} else
$profile["cid"] = 0;
if (($profile["cid"] == 0) AND ($profile["network"] == NETWORK_DIASPORA)) { if (($profile["cid"] == 0) AND ($profile["network"] == NETWORK_DIASPORA)) {
$profile["location"] = ""; $profile["location"] = "";
$profile["about"] = ""; $profile["about"] = "";
$profile["gender"] = "";
$profile["birthday"] = "0000-00-00";
} }
return($profile); return($profile);

View file

@ -389,6 +389,7 @@ if(!function_exists('conversation')) {
function conversation(&$a, $items, $mode, $update, $preview = false) { function conversation(&$a, $items, $mode, $update, $preview = false) {
require_once('include/bbcode.php'); require_once('include/bbcode.php');
require_once('include/Contact.php');
require_once('mod/proxy.php'); require_once('mod/proxy.php');
$ssl_state = ((local_user()) ? true : false); $ssl_state = ((local_user()) ? true : false);
@ -610,11 +611,19 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
else else
$profile_link = zrl($profile_link); $profile_link = zrl($profile_link);
$normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']); // Don't rely on the author-avatar. It is better to use the data from the contact table
if(($normalised != 'mailbox') && (x($a->contacts[$normalised]))) $author_contact = get_contact_details_by_url($item['author-link'], $profile_owner);
$profile_avatar = $a->contacts[$normalised]['thumb']; if ($author_contact["thumb"])
$profile_avatar = $author_contact["thumb"];
else else
$profile_avatar = $a->remove_baseurl(((strlen($item['author-avatar'])) ? $item['author-avatar'] : $item['thumb'])); $profile_avatar = $item['author-avatar'];
// This was the old method. We leave it here at the moment
//$normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
//if(($normalised != 'mailbox') && (x($a->contacts[$normalised])))
// $profile_avatar = $a->contacts[$normalised]['thumb'];
//else
// $profile_avatar = $a->remove_baseurl(((strlen($item['author-avatar'])) ? $item['author-avatar'] : $item['thumb']));
$locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => ''); $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
call_hooks('render_location',$locate); call_hooks('render_location',$locate);

View file

@ -49,7 +49,7 @@ function allfriends_content(&$a) {
foreach($r as $rr) { foreach($r as $rr) {
//get further details of the contact //get further details of the contact
$contact_details = get_contact_details_by_url($rr['url'], $uid); $contact_details = get_contact_details_by_url($rr['url'], $uid, $rr);
$photo_menu = ''; $photo_menu = '';
@ -68,9 +68,9 @@ function allfriends_content(&$a) {
$entry = array( $entry = array(
'url' => $rr['url'], 'url' => $rr['url'],
'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']), 'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']),
'name' => htmlentities($rr['name']), 'name' => htmlentities($contact_details['name']),
'thumb' => proxy_url($rr['photo'], false, PROXY_SIZE_THUMB), 'thumb' => proxy_url($contact_details['thumb'], false, PROXY_SIZE_THUMB),
'img_hover' => htmlentities($rr['name']), 'img_hover' => htmlentities($contact_details['name']),
'details' => $contact_details['location'], 'details' => $contact_details['location'],
'tags' => $contact_details['keywords'], 'tags' => $contact_details['keywords'],
'about' => $contact_details['about'], 'about' => $contact_details['about'],

View file

@ -109,14 +109,14 @@ function common_content(&$a) {
$rr[id] = $rr[cid]; $rr[id] = $rr[cid];
$photo_menu = ''; $photo_menu = '';
$photo_menu = contact_photo_menu ($rr); $photo_menu = contact_photo_menu($rr);
$entry = array( $entry = array(
'url' => $rr['url'], 'url' => $rr['url'],
'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']), 'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']),
'name' => $rr['name'], 'name' => $contact_details['name'],
'thumb' => proxy_url($rr['photo'], false, PROXY_SIZE_THUMB), 'thumb' => proxy_url($contact_details['thumb'], false, PROXY_SIZE_THUMB),
'img_hover' => htmlentities($rr['name']), 'img_hover' => htmlentities($contact_details['name']),
'details' => $contact_details['location'], 'details' => $contact_details['location'],
'tags' => $contact_details['keywords'], 'tags' => $contact_details['keywords'],
'about' => $contact_details['about'], 'about' => $contact_details['about'],

View file

@ -416,11 +416,18 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
else else
$profile_link = zrl($profile_link); $profile_link = zrl($profile_link);
$normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']); // Don't rely on the author-avatar. It is better to use the data from the contact table
if(($normalised != 'mailbox') && (x($a->contacts[$normalised]))) $author_contact = get_contact_details_by_url($item['author-link'], $profile_owner);
$profile_avatar = $a->contacts[$normalised]['thumb']; if ($author_contact["thumb"])
$profile_avatar = $author_contact["thumb"];
else else
$profile_avatar = $a->remove_baseurl(((strlen($item['author-avatar'])) ? $item['author-avatar'] : $item['thumb'])); $profile_avatar = $item['author-avatar'];
//$normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
//if(($normalised != 'mailbox') && (x($a->contacts[$normalised])))
// $profile_avatar = $a->contacts[$normalised]['thumb'];
//else
// $profile_avatar = $a->remove_baseurl(((strlen($item['author-avatar'])) ? $item['author-avatar'] : $item['thumb']));
$locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => ''); $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
call_hooks('render_location',$locate); call_hooks('render_location',$locate);
@ -787,11 +794,18 @@ function render_content(&$a, $items, $mode, $update, $preview = false) {
else else
$profile_link = zrl($profile_link); $profile_link = zrl($profile_link);
$normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']); // Don't rely on the author-avatar. It is better to use the data from the contact table
if(($normalised != 'mailbox') && (x($a->contacts,$normalised))) $author_contact = get_contact_details_by_url($item['author-link'], $profile_owner);
$profile_avatar = $a->contacts[$normalised]['thumb']; if ($author_contact["thumb"])
$profile_avatar = $author_contact["thumb"];
else else
$profile_avatar = $a->remove_baseurl(((strlen($item['author-avatar']) && $diff_author) ? $item['author-avatar'] : $thumb)); $profile_avatar = $item['author-avatar'];
//$normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
//if(($normalised != 'mailbox') && (x($a->contacts,$normalised)))
// $profile_avatar = $a->contacts[$normalised]['thumb'];
//else
// $profile_avatar = $a->remove_baseurl(((strlen($item['author-avatar']) && $diff_author) ? $item['author-avatar'] : $thumb));
$like = ((x($alike,$item['uri'])) ? format_like($alike[$item['uri']],$alike[$item['uri'] . '-l'],'like',$item['uri']) : ''); $like = ((x($alike,$item['uri'])) ? format_like($alike[$item['uri']],$alike[$item['uri'] . '-l'],'like',$item['uri']) : '');
$dislike = ((x($dlike,$item['uri'])) ? format_like($dlike[$item['uri']],$dlike[$item['uri'] . '-l'],'dislike',$item['uri']) : ''); $dislike = ((x($dlike,$item['uri'])) ? format_like($dlike[$item['uri']],$dlike[$item['uri'] . '-l'],'dislike',$item['uri']) : '');

View file

@ -48,11 +48,6 @@ function hovercard_content() {
if($nurl) { if($nurl) {
// Search for contact data // Search for contact data
$contact = get_contact_details_by_url($nurl); $contact = get_contact_details_by_url($nurl);
// Get_contact_details_by_url() doesn't provide the nurl but we
// need it for the photo_menu, so we copy it to the contact array
if (!isset($contact["nurl"]))
$contact["nurl"] = $nurl;
} }
if(!is_array($contact)) if(!is_array($contact))
@ -69,7 +64,7 @@ function hovercard_content() {
'name' => $contact["name"], 'name' => $contact["name"],
'nick' => $contact["nick"], 'nick' => $contact["nick"],
'addr' => (($contact["addr"] != "") ? $contact["addr"] : $contact["url"]), 'addr' => (($contact["addr"] != "") ? $contact["addr"] : $contact["url"]),
'thumb' => proxy_url($contact["photo"], false, PROXY_SIZE_THUMB), 'thumb' => proxy_url($contact["thumb"], false, PROXY_SIZE_THUMB),
'url' => ($cid ? ("redir/".$cid) : zrl($contact["url"])), 'url' => ($cid ? ("redir/".$cid) : zrl($contact["url"])),
'nurl' => $contact["nurl"], // We additionally store the nurl as identifier 'nurl' => $contact["nurl"], // We additionally store the nurl as identifier
// 'alias' => $contact["alias"], // 'alias' => $contact["alias"],

View file

@ -489,7 +489,7 @@ function message_content(&$a) {
'from_name' => $from_name_e, 'from_name' => $from_name_e,
'from_url' => $from_url, 'from_url' => $from_url,
'sparkle' => $sparkle, 'sparkle' => $sparkle,
'from_photo' => $message['from-photo'], 'from_photo' => proxy_url($message['from-photo'], false, PROXY_SIZE_THUMB),
'subject' => $subject_e, 'subject' => $subject_e,
'body' => $body_e, 'body' => $body_e,
'delete' => t('Delete message'), 'delete' => t('Delete message'),

View file

@ -35,18 +35,18 @@ function nogroup_content(&$a) {
if(count($r)) { if(count($r)) {
foreach($r as $rr) { foreach($r as $rr) {
$contact_details = get_contact_details_by_url($rr['url'], local_user()); $contact_details = get_contact_details_by_url($rr['url'], local_user(), $rr);
$contacts[] = array( $contacts[] = array(
'img_hover' => sprintf( t('Visit %s\'s profile [%s]'),$rr['name'],$rr['url']), 'img_hover' => sprintf(t('Visit %s\'s profile [%s]'), $contact_details['name'], $rr['url']),
'edit_hover' => t('Edit contact'), 'edit_hover' => t('Edit contact'),
'photo_menu' => contact_photo_menu($rr), 'photo_menu' => contact_photo_menu($rr),
'id' => $rr['id'], 'id' => $rr['id'],
'alt_text' => $alt_text, 'alt_text' => $alt_text,
'dir_icon' => $dir_icon, 'dir_icon' => $dir_icon,
'thumb' => $rr['thumb'], 'thumb' => proxy_url($contact_details['thumb'], false, PROXY_SIZE_THUMB),
'name' => $rr['name'], 'name' => $contact_details['name'],
'username' => $rr['name'], 'username' => $contact_details['name'],
'details' => $contact_details['location'], 'details' => $contact_details['location'],
'tags' => $contact_details['keywords'], 'tags' => $contact_details['keywords'],
'about' => $contact_details['about'], 'about' => $contact_details['about'],

View file

@ -81,14 +81,14 @@ function suggest_content(&$a) {
$photo_menu = array(array(t("View Profile"), zrl($rr["url"]))); $photo_menu = array(array(t("View Profile"), zrl($rr["url"])));
$photo_menu[] = array(t("Connect/Follow"), $connlnk); $photo_menu[] = array(t("Connect/Follow"), $connlnk);
$photo_menu[] = array(t('Ignore/Hide'), $ignlnk); $photo_menu[] = array(t('Ignore/Hide'), $ignlnk);
$contact_details = get_contact_details_by_url($rr["url"], local_user()); $contact_details = get_contact_details_by_url($rr["url"], local_user(), $rr);
$entry = array( $entry = array(
'url' => zrl($rr['url']), 'url' => zrl($rr['url']),
'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']), 'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']),
'img_hover' => $rr['url'], 'img_hover' => $rr['url'],
'name' => $rr['name'], 'name' => $contact_details['name'],
'thumb' => proxy_url($rr['photo'], false, PROXY_SIZE_THUMB), 'thumb' => proxy_url($contact_details['thumb'], false, PROXY_SIZE_THUMB),
'details' => $contact_details['location'], 'details' => $contact_details['location'],
'tags' => $contact_details['keywords'], 'tags' => $contact_details['keywords'],
'about' => $contact_details['about'], 'about' => $contact_details['about'],

View file

@ -90,15 +90,15 @@ function viewcontacts_content(&$a) {
else else
$url = zrl($url); $url = zrl($url);
$contact_details = get_contact_details_by_url($rr['url'], $a->profile['uid']); $contact_details = get_contact_details_by_url($rr['url'], $a->profile['uid'], $rr);
$contacts[] = array( $contacts[] = array(
'id' => $rr['id'], 'id' => $rr['id'],
'img_hover' => sprintf( t('Visit %s\'s profile [%s]'), $rr['name'], $rr['url']), 'img_hover' => sprintf( t('Visit %s\'s profile [%s]'), $contact_details['name'], $rr['url']),
'photo_menu' => contact_photo_menu($rr), 'photo_menu' => contact_photo_menu($rr),
'thumb' => proxy_url($rr['thumb'], false, PROXY_SIZE_THUMB), 'thumb' => proxy_url($contact_details['thumb'], false, PROXY_SIZE_THUMB),
'name' => htmlentities(substr($rr['name'],0,20)), 'name' => htmlentities(substr($contact_details['name'],0,20)),
'username' => htmlentities($rr['name']), 'username' => htmlentities($contact_details['name']),
'details' => $contact_details['location'], 'details' => $contact_details['location'],
'tags' => $contact_details['keywords'], 'tags' => $contact_details['keywords'],
'about' => $contact_details['about'], 'about' => $contact_details['about'],

View file

@ -150,11 +150,19 @@ class Item extends BaseObject {
else else
$profile_link = zrl($profile_link); $profile_link = zrl($profile_link);
$normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']); // Don't rely on the author-avatar. It is better to use the data from the contact table
if(($normalised != 'mailbox') && (x($a->contacts,$normalised))) $author_contact = get_contact_details_by_url($item['author-link'], $profile_owner);
$profile_avatar = $a->contacts[$normalised]['thumb']; if ($author_contact["thumb"])
$profile_avatar = $author_contact["thumb"];
else else
$profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $a->remove_baseurl($this->get_data_value('thumb'))); $profile_avatar = $item['author-avatar'];
// This was the old method. We leave it here at the moment
//$normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
//if(($normalised != 'mailbox') && (x($a->contacts,$normalised)))
// $profile_avatar = $a->contacts[$normalised]['thumb'];
//else
// $profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $a->remove_baseurl($this->get_data_value('thumb')));
$locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => ''); $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
call_hooks('render_location',$locate); call_hooks('render_location',$locate);