diff --git a/database.sql b/database.sql index 1277585c9d..90604457bc 100644 --- a/database.sql +++ b/database.sql @@ -333,6 +333,8 @@ CREATE TABLE IF NOT EXISTS `gcontact` ( `keywords` text NOT NULL, `gender` varchar(32) NOT NULL DEFAULT '', `community` tinyint(1) NOT NULL DEFAULT 0, + `hide` tinyint(1) NOT NULL DEFAULT 0, + `nsfw` tinyint(1) NOT NULL DEFAULT 0, `network` varchar(255) NOT NULL DEFAULT '', `addr` varchar(255) NOT NULL DEFAULT '', `generation` tinyint(3) NOT NULL DEFAULT 0, @@ -536,6 +538,7 @@ CREATE TABLE IF NOT EXISTS `item` ( INDEX `uid_thrparent` (`uid`,`thr-parent`), INDEX `uid_parenturi` (`uid`,`parent-uri`), INDEX `uid_contactid_created` (`uid`,`contact-id`,`created`), + INDEX `uid_gcontactid_created` (`uid`,`gcontact-id`,`created`), INDEX `wall_body` (`wall`,`body`(6)), INDEX `uid_visible_moderated_created` (`uid`,`visible`,`moderated`,`created`), INDEX `uid_uri` (`uid`,`uri`), diff --git a/include/dbstructure.php b/include/dbstructure.php index 42ddc31b7c..1fc388d6c1 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -666,7 +666,10 @@ function db_definition() { "about" => array("type" => "text", "not null" => "1"), "keywords" => array("type" => "text", "not null" => "1"), "gender" => array("type" => "varchar(32)", "not null" => "1", "default" => ""), + "birthday" => array("type" => "varchar(32)", "not null" => "1", "default" => "0000-00-00"), "community" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), + "hide" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), + "nsfw" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "network" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "addr" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "generation" => array("type" => "tinyint(3)", "not null" => "1", "default" => "0"), diff --git a/include/diaspora.php b/include/diaspora.php index fe5c141643..59c1ac5a2a 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -2407,10 +2407,10 @@ function diaspora_profile($importer,$xml,$msg) { if(! $contact) return; - if($contact['blocked']) { - logger('diaspora_post: Ignoring this author.'); - return 202; - } + //if($contact['blocked']) { + // logger('diaspora_post: Ignoring this author.'); + // return 202; + //} $name = unxmlify($xml->first_name) . ((strlen($xml->last_name)) ? ' ' . unxmlify($xml->last_name) : ''); $image_url = unxmlify($xml->image_url); @@ -2418,6 +2418,8 @@ function diaspora_profile($importer,$xml,$msg) { $location = diaspora2bb(unxmlify($xml->location)); $about = diaspora2bb(unxmlify($xml->bio)); $gender = unxmlify($xml->gender); + $searchable = (unxmlify($xml->searchable) == "true"); + $nsfw = (unxmlify($xml->nsfw) == "true"); $tags = unxmlify($xml->tag_string); $tags = explode("#", $tags); @@ -2432,6 +2434,8 @@ function diaspora_profile($importer,$xml,$msg) { $keywords = implode(", ", $keywords); $handle_parts = explode("@", $diaspora_handle); + $nick = $handle_parts[0]; + if($name === '') { $name = $handle_parts[0]; } @@ -2466,10 +2470,12 @@ 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', `keywords` = '%s', `gender` = '%s' WHERE `id` = %d AND `uid` = %d", + $r = q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `addr` = '%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($nick), + dbesc($diaspora_handle), dbesc(datetime_convert()), - dbesc($images[0]), + dbesc($image_url), dbesc($images[1]), dbesc($images[2]), dbesc(datetime_convert()), @@ -2482,34 +2488,17 @@ function diaspora_profile($importer,$xml,$msg) { intval($importer['uid']) ); - if (unxmlify($xml->searchable) == "true") { + if ($searchable) { require_once('include/socgraph.php'); - poco_check($contact['url'], $name, NETWORK_DIASPORA, $images[0], $about, $location, $gender, $keywords, "", + poco_check($contact['url'], $name, NETWORK_DIASPORA, $image_url, $about, $location, $gender, $keywords, "", datetime_convert(), 2, $contact['id'], $importer['uid']); } - // @todo: - /* - update_gcontact($contact["url"], $contact["network"], - $author["author-avatar"], $contact["name"], - $contact["nick"], $contact["location"], - $contact["about"]); - */ - - $profileurl = ""; - $author = q("SELECT * FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", - dbesc(normalise_link($contact['url']))); - - if (count($author) == 0) { - q("INSERT INTO `unique_contacts` (`url`, `name`, `avatar`, `location`, `about`) VALUES ('%s', '%s', '%s', '%s', '%s')", - dbesc(normalise_link($contact['url'])), dbesc($name), dbesc($location), dbesc($about), dbesc($images[0])); - - $author = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1", - dbesc(normalise_link($contact['url']))); - } else if (normalise_link($contact['url']).$name.$location.$about != normalise_link($author[0]["url"]).$author[0]["name"].$author[0]["location"].$author[0]["about"]) { - q("UPDATE unique_contacts SET name = '%s', avatar = '%s', `location` = '%s', `about` = '%s' WHERE url = '%s'", - dbesc($name), dbesc($images[0]), dbesc($location), dbesc($about), dbesc(normalise_link($contact['url']))); - } + update_gcontact(array("url" => $contact['url'], "network" => NETWORK_DIASPORA, "generation" => 2, + "photo" => $image_url, "name" => $name, "location" => $location, + "about" => $about, "birthday" => $birthday, "gender" => $gender, + "addr" => $diaspora_handle, "nick" => $nick, "keywords" => $keywords, + "hide" => !$searchable, "nsfw" => $nsfw)); /* if($r) { if($oldphotos) { diff --git a/include/items.php b/include/items.php index ada3906f88..549027671d 100644 --- a/include/items.php +++ b/include/items.php @@ -1339,7 +1339,8 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa } if ($arr["gcontact-id"] == 0) - $arr["gcontact-id"] = get_gcontact_id($arr['author-link'], $arr['network'], $arr['author-avatar'], $arr['author-name']); + $arr["gcontact-id"] = get_gcontact_id(array("url" => $arr['author-link'], "network" => $arr['network'], + "photo" => $arr['author-avatar'], "name" => $arr['author-name'])); if ($arr['guid'] != "") { // Checking if there is already an item with the same guid diff --git a/include/ostatus.php b/include/ostatus.php index 5426fc5fef..4a999ae2c5 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -169,10 +169,10 @@ function ostatus_fetchauthor($xpath, $context, $importer, &$contact, $onlyfetch) } // @todo: Addr - update_gcontact($contact["url"], $contact["network"], - $author["author-avatar"], $contact["name"], - $contact["nick"], $contact["location"], - $contact["about"]); + update_gcontact(array("url" => $contact["url"], "network" => $contact["network"], + "photo" => $author["author-avatar"], "name" => $contact["name"], + "nick" => $contact["nick"], "location" => $contact["location"], + "about" => $contact["about"], "generation" => 2)); } return($author); diff --git a/include/socgraph.php b/include/socgraph.php index fcce0b4a54..4881ac28e8 100644 --- a/include/socgraph.php +++ b/include/socgraph.php @@ -1488,35 +1488,37 @@ function poco_discover_server($data, $default_generation = 0) { return $success; } -function get_gcontact_id($url, $network, $avatar = "", $name = "", $nick = "", $location = "", $about = "", $addr = "") { +function get_gcontact_id($contact) { $gcontact_id = 0; - if ($network == NETWORK_STATUSNET) - $network = NETWORK_OSTATUS; + if ($contact["network"] == NETWORK_STATUSNET) + $contact["network"] = NETWORK_OSTATUS; - $r = q("SELECT `id`, `name`, `nick`, `network`, `photo`, `location`, `about` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", - dbesc(normalise_link($url))); + $r = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", + dbesc(normalise_link($contact["url"]))); if ($r) $gcontact_id = $r[0]["id"]; else { - q("INSERT INTO `gcontact` (`name`, `nick`, `addr` , `network`, `url`, `nurl`, `photo`, `created`, `updated`, `location`, `about`) - VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')", - dbesc($name), - dbesc($nick), - dbesc($addr), - dbesc($network), - dbesc($url), - dbesc(normalise_link($url)), - dbesc($avatar), + q("INSERT INTO `gcontact` (`name`, `nick`, `addr` , `network`, `url`, `nurl`, `photo`, `created`, `updated`, `location`, `about`, `generation`) + VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)", + dbesc($contact["name"]), + dbesc($contact["nick"]), + dbesc($contact["addr"]), + dbesc($contact["network"]), + dbesc($contact["url"]), + dbesc(normalise_link($contact["url"])), + dbesc($contact["photo"]), dbesc(datetime_convert()), dbesc(datetime_convert()), - dbesc($location), - dbesc($about) + dbesc($contact["location"]), + dbesc($contact["about"]), + intval($contact["generation"]) ); - $r = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", dbesc(normalise_link($url))); + $r = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", + dbesc(normalise_link($contact["url"]))); if ($r) $gcontact_id = $r[0]["id"]; @@ -1525,39 +1527,71 @@ function get_gcontact_id($url, $network, $avatar = "", $name = "", $nick = "", $ return $gcontact_id; } -function update_gcontact($url, $network, $avatar = "", $name = "", $nick = "", $location = "", $about = "", $addr = "") { +function update_gcontact($contact) { - if ($network == NETWORK_STATUSNET) - $network = NETWORK_OSTATUS; - - $gcontact_id = get_gcontact_id($url, $network, $avatar, $name, $nick, $location, $about); + $gcontact_id = get_gcontact_id($contact); if (!$gcontact_id) return false; - if (($avatar != $r[0]["photo"]) AND ($avatar != "")) - q("UPDATE `gcontact` SET `photo` = '%s', `updated` = '%s' WHERE `nurl` = '%s' AND `network` = '%s' AND (`generation` = 0 OR `photo` = '')", - dbesc($avatar), dbesc(datetime_convert()), dbesc(normalise_link($url)), dbesc($network)); + $r = q("SELECT `name`, `nick`, `photo`, `location`, `about`, `addr`, `generation`, `birthday`, `gender`, `keywords`, `hide`, `nsfw` + FROM `gcontact` WHERE `id` = %d LIMIT 1", + intval($gcontact_id)); - if (($name != $r[0]["name"]) AND ($name != "")) - q("UPDATE `gcontact` SET `name` = '%s', `updated` = '%s' WHERE `nurl` = '%s' AND `network` = '%s' AND (`generation` = 0 OR `name` = '')", - dbesc($name), dbesc(datetime_convert()), dbesc(normalise_link($url)), dbesc($network)); + if ($contact["generation"] == 0) + $contact["generation"] = $r[0]["generation"]; - if (($nick != $r[0]["nick"]) AND ($nick != "")) - q("UPDATE `gcontact` SET `nick` = '%s', `updated` = '%s' WHERE `nurl` = '%s' AND `network` = '%s' AND (`generation` = 0 OR `nick` = '')", - dbesc($nick), dbesc(datetime_convert()), dbesc(normalise_link($url)), dbesc($network)); + if ($contact["photo"] == "") + $contact["photo"] = $r[0]["photo"]; - if (($addr != $r[0]["addr"]) AND ($nick != "")) - q("UPDATE `gcontact` SET `addr` = '%s', `updated` = '%s' WHERE `nurl` = '%s' AND `network` = '%s' AND (`generation` = 0 OR `addr` = '')", - dbesc($addr), dbesc(datetime_convert()), dbesc(normalise_link($url)), dbesc($network)); + if ($contact["name"] == "") + $contact["name"] = $r[0]["name"]; - if (($location != $r[0]["location"]) AND ($location != "")) - q("UPDATE `gcontact` SET `location` = '%s', `updated` = '%s' WHERE `nurl` = '%s' AND `network` = '%s' AND (`generation` = 0 OR `location` = '')", - dbesc($location), dbesc(datetime_convert()), dbesc(normalise_link($url)), dbesc($network)); + if ($contact["nick"] == "") + $contact["nick"] = $r[0]["nick"]; - if (($about != $r[0]["about"]) AND ($about != "")) - q("UPDATE `gcontact` SET `about` = '%s', `updated` = '%s' WHERE `nurl` = '%s' AND `network` = '%s' AND (`generation` = 0 OR `about` = '')", - dbesc($about), dbesc(datetime_convert()), dbesc(normalise_link($url)), dbesc($network)); + if ($contact["addr"] == "") + $contact["addr"] = $r[0]["addr"]; + + if ($contact["location"] =="") + $contact["location"] = $r[0]["location"]; + + if ($contact["about"] =="") + $contact["about"] = $r[0]["about"]; + + if ($contact["birthday"] =="") + $contact["birthday"] = $r[0]["birthday"]; + + if ($contact["gender"] =="") + $contact["gender"] = $r[0]["gender"]; + + if ($contact["keywords"] =="") + $contact["keywords"] = $r[0]["keywords"]; + + if (!isset($contact["hide"])) + $contact["hide"] = $r[0]["hide"]; + + if (!isset($contact["nsfw"])) + $contact["nsfw"] = $r[0]["nsfw"]; + + if ($contact["network"] == NETWORK_STATUSNET) + $contact["network"] = NETWORK_OSTATUS; + + if (($contact["photo"] != $r[0]["photo"]) OR ($contact["name"] != $r[0]["name"]) OR ($contact["nick"] != $r[0]["nick"]) OR ($contact["addr"] != $r[0]["addr"]) OR + ($contact["birthday"] != $r[0]["birthday"]) OR ($contact["gender"] != $r[0]["gender"]) OR ($contact["keywords"] != $r[0]["keywords"]) OR + ($contact["hide"] != $r[0]["hide"]) OR ($contact["nsfw"] != $r[0]["nsfw"]) OR + ($contact["location"] != $r[0]["location"]) OR ($contact["about"] != $r[0]["about"]) OR ($contact["generation"] < $r[0]["generation"])) { + + q("UPDATE `gcontact` SET `photo` = '%s', `name` = '%s', `nick` = '%s', `addr` = '%s', + `birthday` = '%s', `gender` = '%s', `keywords` = %d, `hide` = %d, `nsfw` = %d, + `location` = '%s', `about` = '%s', `generation` = %d, `updated` = '%s' + WHERE `nurl` = '%s' AND `network` = '%s' AND (`generation` = 0 OR `generation` >= %d)", + dbesc($contact["photo"]), dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["addr"]), + dbesc($contact["birthday"]), dbesc($contact["gender"]), dbesc($contact["keywords"]), + intval($contact["hide"]), intval($contact["nsfw"]), + dbesc($contact["location"]), dbesc($contact["about"]), intval($contact["generation"]), dbesc(datetime_convert()), + dbesc(normalise_link($contact["url"])), dbesc($contact["network"]), intval($contact["generation"])); + } return $gcontact_id; } diff --git a/mod/dirfind.php b/mod/dirfind.php index 3f9c82576a..0dfe4d67a9 100644 --- a/mod/dirfind.php +++ b/mod/dirfind.php @@ -94,9 +94,15 @@ function dirfind_content(&$a, $prefix = "") { else $ostatus = NETWORK_DFRN; - $count = q("SELECT count(*) AS `total` FROM `gcontact` WHERE `network` IN ('%s', '%s', '%s') AND - (`url` REGEXP '%s' OR `name` REGEXP '%s' OR `location` REGEXP '%s' OR - `about` REGEXP '%s' OR `keywords` REGEXP '%s')".$extra_sql, + $count = q("SELECT count(*) AS `total` FROM `gcontact` + LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl` + AND `contact`.`uid` = %d AND NOT `contact`.`blocked` + AND NOT `contact`.`pending` AND `contact`.`rel` IN ('%s', '%s') + WHERE (`contact`.`id` > 0 OR (NOT `gcontact`.`hide` AND `gcontact`.`network` IN ('%s', '%s', '%s') AND + ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`)))) AND + (`gcontact`.`url` REGEXP '%s' OR `gcontact`.`name` REGEXP '%s' OR `gcontact`.`location` REGEXP '%s' OR + `gcontact`.`about` REGEXP '%s' OR `gcontact`.`keywords` REGEXP '%s') $extra_sql", + intval(local_user()), dbesc(CONTACT_IS_SHARING), dbesc(CONTACT_IS_FRIEND), dbesc(NETWORK_DFRN), dbesc($ostatus), dbesc($diaspora), dbesc(escape_tags($search)), dbesc(escape_tags($search)), dbesc(escape_tags($search)), dbesc(escape_tags($search)), dbesc(escape_tags($search))); @@ -106,8 +112,8 @@ function dirfind_content(&$a, $prefix = "") { LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl` AND `contact`.`uid` = %d AND NOT `contact`.`blocked` AND NOT `contact`.`pending` AND `contact`.`rel` IN ('%s', '%s') - WHERE `gcontact`.`network` IN ('%s', '%s', '%s') AND - ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`)) AND + WHERE (`contact`.`id` > 0 OR (NOT `gcontact`.`hide` AND `gcontact`.`network` IN ('%s', '%s', '%s') AND + ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`)))) AND (`gcontact`.`url` REGEXP '%s' OR `gcontact`.`name` REGEXP '%s' OR `gcontact`.`location` REGEXP '%s' OR `gcontact`.`about` REGEXP '%s' OR `gcontact`.`keywords` REGEXP '%s') $extra_sql GROUP BY `gcontact`.`nurl` diff --git a/mod/item.php b/mod/item.php index 2bf89f67f3..105f82708f 100644 --- a/mod/item.php +++ b/mod/item.php @@ -693,9 +693,8 @@ function item_post(&$a) { $datarray['postopts'] = $postopts; $datarray['origin'] = $origin; $datarray['moderated'] = $allow_moderated; - $datarray['gcontact-id'] = get_gcontact_id($datarray['author-link'], $datarray['network'], - $datarray['author-avatar'], $datarray['author-name']); - + $datarray['gcontact-id'] = get_gcontact_id(array("url" => $datarray['author-link'], "network" => $datarray['network'], + "photo" => $datarray['author-avatar'], "name" => $datarray['author-name'])); /** * These fields are for the convenience of plugins... * 'self' if true indicates the owner is posting on their own wall diff --git a/mod/poco.php b/mod/poco.php index ae03aef2cd..0a1b392169 100644 --- a/mod/poco.php +++ b/mod/poco.php @@ -61,8 +61,7 @@ function poco_init(&$a) { $update_limit = date("Y-m-d H:i:s",strtotime($_GET['updatedSince'])); if ($global) { - //$r = q("SELECT count(*) AS `total` FROM `gcontact` WHERE `updated` >= '%s' AND ((`last_contact` >= `last_failure`) OR (`updated` >= `last_failure`)) AND `network` IN ('%s')", - $r = q("SELECT count(*) AS `total` FROM `gcontact` WHERE `updated` >= '%s' AND `updated` >= `last_failure` AND `network` IN ('%s', '%s', '%s')", + $r = q("SELECT count(*) AS `total` FROM `gcontact` WHERE `updated` >= '%s' AND `updated` >= `last_failure` AND NOT `hide` AND `network` IN ('%s', '%s', '%s')", dbesc($update_limit), dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), @@ -94,8 +93,7 @@ function poco_init(&$a) { if ($global) { logger("Start global query", LOGGER_DEBUG); - //$r = q("SELECT * FROM `gcontact` WHERE `updated` > '%s' AND `network` IN ('%s') AND ((`last_contact` >= `last_failure`) OR (`updated` > `last_failure`)) LIMIT %d, %d", - $r = q("SELECT * FROM `gcontact` WHERE `updated` > '%s' AND `network` IN ('%s', '%s', '%s') AND `updated` > `last_failure` + $r = q("SELECT * FROM `gcontact` WHERE `updated` > '%s' AND NOT `hide` AND `network` IN ('%s', '%s', '%s') AND `updated` > `last_failure` ORDER BY `updated` DESC LIMIT %d, %d", dbesc($update_limit), dbesc(NETWORK_DFRN),