From 2f400627c75a338a28b595e452e8ef63ba21d4a2 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sun, 25 Jan 2015 13:19:37 +0100 Subject: [PATCH] Support for keywords and gender in (global) contacts. --- include/dbstructure.php | 4 ++++ include/diaspora.php | 22 +++++++++++++++++++- include/items.php | 2 +- include/socgraph.php | 46 +++++++++++++++++++++++++++++++---------- mod/poco.php | 31 ++++++++++++++++++++++++--- mod/profiles.php | 23 ++++++++++++++++++--- 6 files changed, 109 insertions(+), 19 deletions(-) diff --git a/include/dbstructure.php b/include/dbstructure.php index bd4ecb789d..adb826c8b4 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -415,6 +415,8 @@ function db_definition() { "nick" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "location" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "about" => array("type" => "text", "not null" => "1"), + "keywords" => array("type" => "text", "not null" => "1"), + "gender" => array("type" => "varchar(32)", "not null" => "1", "default" => ""), "attag" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "photo" => array("type" => "text", "not null" => "1"), "thumb" => array("type" => "text", "not null" => "1"), @@ -621,6 +623,8 @@ function db_definition() { "updated" => array("type" => "datetime", "default" => "0000-00-00 00:00:00"), "location" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "about" => array("type" => "text", "not null" => "1"), + "keywords" => array("type" => "text", "not null" => "1"), + "gender" => array("type" => "varchar(32)", "not null" => "1", "default" => ""), "network" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), ), "indexes" => array( diff --git a/include/diaspora.php b/include/diaspora.php index 0cc97713ee..affd59d489 100755 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -2252,7 +2252,19 @@ function diaspora_profile($importer,$xml,$msg) { $birthday = unxmlify($xml->birthday); $location = diaspora2bb(unxmlify($xml->location)); $about = diaspora2bb(unxmlify($xml->bio)); + $gender = unxmlify($xml->gender); + $tags = unxmlify($xml->tag_string); + $tags = explode("#", $tags); + + $keywords = array(); + foreach ($tags as $tag) { + $tag = trim(strtolower($tag)); + if ($tag != "") + $keywords[] = $tag; + } + + $keywords = implode(", ", $keywords); $handle_parts = explode("@", $diaspora_handle); if($name === '') { @@ -2288,7 +2300,7 @@ function diaspora_profile($importer,$xml,$msg) { // TODO: update name on item['author-name'] if the name changed. See consume_feed() // Not doing this currently because D* protocol is scheduled for revision soon. - $r = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' , `bd` = '%s', `location` = '%s', `about` = '%s' WHERE `id` = %d AND `uid` = %d", + $r = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' , `bd` = '%s', `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s' WHERE `id` = %d AND `uid` = %d", dbesc($name), dbesc(datetime_convert()), dbesc($images[0]), @@ -2298,10 +2310,18 @@ function diaspora_profile($importer,$xml,$msg) { dbesc($birthday), dbesc($location), dbesc($about), + dbesc($keywords), + dbesc($gender), intval($contact['id']), intval($importer['uid']) ); + if (unxmlify($xml->searchable) == "true") { + require_once('include/socgraph.php'); + poco_check($contact['url'], $name, NETWORK_DIASPORA, $images[0], $about, $location, $gender, $keywords, "", + datetime_convert(), $contact['id'], $importer['uid']); + } + $profileurl = ""; $author = q("SELECT * FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", dbesc(normalise_link($contact['url']))); diff --git a/include/items.php b/include/items.php index 9927223514..344b06ec8b 100644 --- a/include/items.php +++ b/include/items.php @@ -1380,7 +1380,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa // Contacts from the statusnet connector are also added since you could add them in OStatus as well. if (!$arr['private'] AND in_array($arr["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, NETWORK_STATUSNET, ""))) { - poco_check($arr["author-link"], $arr["author-name"], $arr["network"], $arr["author-avatar"], "", "", "", $arr["received"], $arr["contact-id"], $arr["uid"]); + poco_check($arr["author-link"], $arr["author-name"], $arr["network"], $arr["author-avatar"], "", "", "", "", "", $arr["received"], $arr["contact-id"], $arr["uid"]); // Maybe its a body with a shared item? Then extract a global contact from it. poco_contact_from_body($arr["body"], $arr["received"], $arr["contact-id"], $arr["uid"]); diff --git a/include/socgraph.php b/include/socgraph.php index e50474fd38..f37fdca98d 100644 --- a/include/socgraph.php +++ b/include/socgraph.php @@ -39,7 +39,7 @@ function poco_load($cid,$uid = 0,$zcid = 0,$url = null) { if(! $url) return; - $url = $url . (($uid) ? '/@me/@all?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation' : '?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation') ; + $url = $url . (($uid) ? '/@me/@all?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender' : '?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender') ; logger('poco_load: ' . $url, LOGGER_DEBUG); @@ -71,6 +71,8 @@ function poco_load($cid,$uid = 0,$zcid = 0,$url = null) { $updated = '0000-00-00 00:00:00'; $location = ''; $about = ''; + $keywords = ''; + $gender = ''; $name = $entry->displayName; @@ -107,13 +109,24 @@ function poco_load($cid,$uid = 0,$zcid = 0,$url = null) { if(isset($entry->aboutMe)) $about = $entry->aboutMe; - poco_check($profile_url, $name, $network, $profile_photo, $about, $location, $connect_url, $updated, $cid, $uid, $zcid); + if(isset($entry->gender)) + $gender = $entry->gender; - if (($location != "") OR ($about != "")) - q("UPDATE `contact` SET `location` = '%s', `about` = '%s' WHERE `nurl` = '%s' AND NOT `self`", + if(isset($entry->tags)) + $keywords = implode(", ", $entry->tags); + + poco_check($profile_url, $name, $network, $profile_photo, $about, $location, $gender, $keywords, $connect_url, $updated, $cid, $uid, $zcid); + + // Update the Friendica contacts. Diaspora is doing it via a message. (See include/diaspora.php) + if (($location != "") OR ($about != "") OR ($keywords != "") OR ($gender != "")) + q("UPDATE `contact` SET `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s' + WHERE `nurl` = '%s' AND NOT `self` AND `network` = '%s'", dbesc($location), dbesc($about), - dbesc(normalise_link($profile_url))); + dbesc($keywords), + dbesc($gender), + dbesc(normalise_link($profile_url)), + dbesc(NETWORK_DFRN)); } logger("poco_load: loaded $total entries",LOGGER_DEBUG); @@ -126,7 +139,7 @@ function poco_load($cid,$uid = 0,$zcid = 0,$url = null) { } -function poco_check($profile_url, $name, $network, $profile_photo, $about, $location, $connect_url, $updated, $cid = 0, $uid = 0, $zcid = 0) { +function poco_check($profile_url, $name, $network, $profile_photo, $about, $location, $gender, $keywords, $connect_url, $updated, $cid = 0, $uid = 0, $zcid = 0) { $gcid = ""; if ($profile_url == "") @@ -162,8 +175,15 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca if (($about == "") AND ($x[0]['about'] != "")) $about = $x[0]['about']; + if (($gender == "") AND ($x[0]['gender'] != "")) + $gender = $x[0]['gender']; + + if (($keywords == "") AND ($x[0]['keywords'] != "")) + $keywords = $x[0]['keywords']; + if($x[0]['name'] != $name || $x[0]['photo'] != $profile_photo || $x[0]['updated'] < $updated) { - q("update gcontact set `name` = '%s', `network` = '%s', `photo` = '%s', `connect` = '%s', `url` = '%s', `updated` = '%s', `location` = '%s', `about` = '%s' + q("update gcontact set `name` = '%s', `network` = '%s', `photo` = '%s', `connect` = '%s', `url` = '%s', + `updated` = '%s', `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s' where `nurl` = '%s'", dbesc($name), dbesc($network), @@ -173,12 +193,14 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca dbesc($updated), dbesc($location), dbesc($about), + dbesc($keywords), + dbesc($gender), dbesc(normalise_link($profile_url)) ); } } else { - q("insert into `gcontact` (`name`,`network`, `url`,`nurl`,`photo`,`connect`, `updated`, `location`, `about`) - values ('%s', '%s', '%s', '%s', '%s','%s', '%s')", + q("insert into `gcontact` (`name`,`network`, `url`,`nurl`,`photo`,`connect`, `updated`, `location`, `about`, `keywords`, `gender`) + values ('%s', '%s', '%s', '%s', '%s','%s', '%s', '%s', '%s', '%s', '%s')", dbesc($name), dbesc($network), dbesc($profile_url), @@ -187,7 +209,9 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca dbesc($connect_url), dbesc($updated), dbesc($location), - dbesc($about) + dbesc($about), + dbesc($keywords), + dbesc($gender) ); $x = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", dbesc(normalise_link($profile_url)) @@ -254,7 +278,7 @@ function sub_poco_from_share($share, $created, $cid, $uid) { return; logger("prepare poco_check for profile ".$profile, LOGGER_DEBUG); - poco_check($profile, "", "", "", "", "", "", $created, $cid, $uid); + poco_check($profile, "", "", "", "", "", "", "", "", $created, $cid, $uid); } function count_common_friends($uid,$cid) { diff --git a/mod/poco.php b/mod/poco.php index e7302a9621..aa570ec342 100644 --- a/mod/poco.php +++ b/mod/poco.php @@ -83,8 +83,9 @@ function poco_init(&$a) { if($system_mode) { - $r = q("SELECT `contact`.*, `profile`.`about` AS `pabout`, `profile`.`locality` AS `plocation` FROM `contact` INNER JOIN `profile` ON `profile`.`uid` = `contact`.`uid` - WHERE `self` = 1 AND `network` IN ('%s', '%s', '%s', '%s', '') + $r = q("SELECT `contact`.*, `profile`.`about` AS `pabout`, `profile`.`locality` AS `plocation`, `profile`.`pub_keywords`, `profile`.`gender` AS `pgender` + FROM `contact` INNER JOIN `profile` ON `profile`.`uid` = `contact`.`uid` + WHERE `self` = 1 AND `network` IN ('%s', '%s', '%s', '%s', '') AND `profile`.`is-default` AND `contact`.`uid` IN (SELECT `uid` FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1) LIMIT %d, %d", dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), @@ -129,7 +130,9 @@ function poco_init(&$a) { 'photos' => false, 'aboutMe' => false, 'currentLocation' => false, - 'network' => false + 'network' => false, + 'gender' => false, + 'tags' => false ); if((! x($_GET,'fields')) || ($_GET['fields'] === '@all')) @@ -150,6 +153,12 @@ function poco_init(&$a) { if (($rr['location'] == "") AND isset($rr['plocation'])) $rr['location'] = $rr['plocation']; + if (($rr['gender'] == "") AND isset($rr['pgender'])) + $rr['gender'] = $rr['pgender']; + + if (($rr['keywords'] == "") AND isset($rr['pub_keywords'])) + $rr['keywords'] = $rr['pub_keywords']; + $entry = array(); if($fields_ret['id']) $entry['id'] = $rr['id']; @@ -159,6 +168,8 @@ function poco_init(&$a) { $entry['aboutMe'] = bbcode($rr['about'], false, false); if($fields_ret['currentLocation']) $entry['currentLocation'] = $rr['location']; + if($fields_ret['gender']) + $entry['gender'] = $rr['gender']; if($fields_ret['urls']) { $entry['urls'] = array(array('value' => $rr['url'], 'type' => 'profile')); if($rr['addr'] && ($rr['network'] !== NETWORK_MAIL)) @@ -189,6 +200,20 @@ function poco_init(&$a) { if (($entry['network'] == "") AND ($rr['self'])) $entry['network'] = NETWORK_DFRN; } + if($fields_ret['tags']) { + $tags = str_replace(","," ",$rr['keywords']); + $tags = explode(" ", $tags); + + $cleaned = array(); + foreach ($tags as $tag) { + $tag = trim(strtolower($tag)); + if ($tag != "") + $cleaned[] = $tag; + } + + $entry['tags'] = array($cleaned); + } + $ret['entry'][] = $entry; } } diff --git a/mod/profiles.php b/mod/profiles.php index e08b621c02..a0f10fb95d 100644 --- a/mod/profiles.php +++ b/mod/profiles.php @@ -142,6 +142,22 @@ function profiles_init(&$a) { } +function profile_clean_keywords($keywords) { + $keywords = str_replace(","," ",$keywords); + $keywords = explode(" ", $keywords); + + $cleaned = array(); + foreach ($keywords as $keyword) { + $keyword = trim(strtolower($keyword)); + if ($keyword != "") + $cleaned[] = $keyword; + } + + $keywords = implode(", ", $cleaned); + + return $keywords; +} + function profiles_post(&$a) { if(! local_user()) { @@ -212,8 +228,8 @@ function profiles_post(&$a) { $region = notags(trim($_POST['region'])); $postal_code = notags(trim($_POST['postal_code'])); $country_name = notags(trim($_POST['country_name'])); - $pub_keywords = notags(trim($_POST['pub_keywords'])); - $prv_keywords = notags(trim($_POST['prv_keywords'])); + $pub_keywords = profile_clean_keywords(notags(trim($_POST['pub_keywords']))); + $prv_keywords = profile_clean_keywords(notags(trim($_POST['prv_keywords']))); $marital = notags(trim($_POST['marital'])); $howlong = notags(trim($_POST['howlong'])); @@ -469,9 +485,10 @@ function profiles_post(&$a) { if($is_default) { - $r = q("UPDATE `contact` SET `about` = '%s', `location` = '%s' WHERE `self` = 1 AND `uid` = %d", + $r = q("UPDATE `contact` SET `about` = '%s', `location` = '%s', `keywords` = '%s' WHERE `self` = 1 AND `uid` = %d", dbesc($about), dbesc($locality), + dbesc($pub_keywords), intval(local_user()) );