diff --git a/include/dbstructure.php b/include/dbstructure.php index 1b414c70fb..4b2cdb251c 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -672,6 +672,8 @@ function db_definition() { "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" => ""), + "notify" => array("type" => "text", "not null" => "1"), + "alias" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "generation" => array("type" => "tinyint(3)", "not null" => "1", "default" => "0"), "server_url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), ), diff --git a/include/socgraph.php b/include/socgraph.php index a9cbedd667..0082cb43b2 100644 --- a/include/socgraph.php +++ b/include/socgraph.php @@ -227,6 +227,8 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca $server_url = $x[0]["server_url"]; $nick = $x[0]["nick"]; $addr = $x[0]["addr"]; + $alias = $x[0]["alias"]; + $notify = $x[0]["notify"]; } else { $created = "0000-00-00 00:00:00"; $server_url = ""; @@ -234,6 +236,8 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca $urlparts = parse_url($profile_url); $nick = end(explode("/", $urlparts["path"])); $addr = ""; + $alias = ""; + $notify = ""; } if ((($network == "") OR ($name == "") OR ($addr == "") OR ($profile_photo == "") OR ($server_url == "") OR $alternate) @@ -246,6 +250,8 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca $name = $data["name"]; $nick = $data["nick"]; $addr = $data["addr"]; + $alias = $data["alias"]; + $notify = $data["notify"]; $profile_url = $data["url"]; $profile_photo = $data["photo"]; $server_url = $data["baseurl"]; @@ -301,12 +307,19 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca if (($addr == "") AND ($x[0]['addr'] != "")) $addr = $x[0]['addr']; + if (($alias == "") AND ($x[0]['alias'] != "")) + $alias = $x[0]['alias']; + + if (($notify == "") AND ($x[0]['notify'] != "")) + $notify = $x[0]['notify']; + if (($generation == 0) AND ($x[0]['generation'] > 0)) $generation = $x[0]['generation']; if($x[0]['name'] != $name || $x[0]['photo'] != $profile_photo || $x[0]['updated'] < $updated) { q("UPDATE `gcontact` SET `name` = '%s', `addr` = '%s', `network` = '%s', `photo` = '%s', `connect` = '%s', `url` = '%s', `server_url` = '%s', - `updated` = '%s', `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s', `generation` = %d + `updated` = '%s', `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s', `generation` = %d, + `alias` = '$s', `notify` = '%s' WHERE (`generation` >= %d OR `generation` = 0) AND `nurl` = '%s'", dbesc($name), dbesc($addr), @@ -320,6 +333,8 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca dbesc($about), dbesc($keywords), dbesc($gender), + dbesc($alias), + dbesc($notify), intval($generation), intval($generation), dbesc(normalise_link($profile_url)) @@ -331,8 +346,8 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca dbesc(normalise_link($profile_url)) ); if(!$x) { - q("INSERT INTO `gcontact` (`name`, `nick`, `addr`, `network`, `url`, `nurl`, `photo`, `connect`, `server_url`, `created`, `updated`, `location`, `about`, `keywords`, `gender`, `generation`) - VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)", + q("INSERT INTO `gcontact` (`name`, `nick`, `addr`, `network`, `url`, `nurl`, `photo`, `connect`, `server_url`, `created`, `updated`, `location`, `about`, `keywords`, `gender`, `alias`, `notify`, `generation`) + VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)", dbesc($name), dbesc($nick), dbesc($addr), @@ -348,6 +363,8 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca dbesc($about), dbesc($keywords), dbesc($gender), + dbesc($alias), + dbesc($notify), intval($generation) ); $x = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", @@ -1536,7 +1553,7 @@ function update_gcontact($contact) { if (!$gcontact_id) return false; - $r = q("SELECT `name`, `nick`, `photo`, `location`, `about`, `addr`, `generation`, `birthday`, `gender`, `keywords`, `hide`, `nsfw`, `network` + $r = q("SELECT `name`, `nick`, `photo`, `location`, `about`, `addr`, `generation`, `birthday`, `gender`, `keywords`, `hide`, `nsfw`, `network`, `alias`, `notify` FROM `gcontact` WHERE `id` = %d LIMIT 1", intval($gcontact_id)); @@ -1579,22 +1596,30 @@ function update_gcontact($contact) { if ($contact["network"] =="") $contact["network"] = $r[0]["network"]; + if ($contact["alias"] =="") + $contact["alias"] = $r[0]["alias"]; + + if ($contact["notify"] =="") + $contact["notify"] = $r[0]["notify"]; + 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["network"] != $r[0]["network"]) OR + ($contact["alias"] != $r[0]["alias"]) OR ($contact["notify"] != $r[0]["notify"]) 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', `network` = '%s', `birthday` = '%s', `gender` = '%s', `keywords` = %d, `hide` = %d, `nsfw` = %d, + `alias` = '%s', `notify` = '%s', `location` = '%s', `about` = '%s', `generation` = %d, `updated` = '%s' WHERE `nurl` = '%s' AND (`generation` = 0 OR `generation` >= %d)", dbesc($contact["photo"]), dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["addr"]), dbesc($contact["network"]), dbesc($contact["birthday"]), dbesc($contact["gender"]), dbesc($contact["keywords"]), - intval($contact["hide"]), intval($contact["nsfw"]), + intval($contact["hide"]), intval($contact["nsfw"]), dbesc($contact["alias"]), dbesc($contact["notify"]), dbesc($contact["location"]), dbesc($contact["about"]), intval($contact["generation"]), dbesc(datetime_convert()), dbesc(normalise_link($contact["url"])), intval($contact["generation"])); } diff --git a/mod/display.php b/mod/display.php index c173c5a912..6ff599e2c7 100644 --- a/mod/display.php +++ b/mod/display.php @@ -180,6 +180,7 @@ function display_fetchauthor($a, $item) { } // Fetching profile data from global contacts + // @todo: should override everything else (but not Feeds) $r = q("SELECT `photo`, `nick`, `addr`, `location`, `about`, `gender` FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($profiledata["url"]))); if (count($r)) { if ($profiledata["photo"] == "") diff --git a/mod/item.php b/mod/item.php index 2d2a5710fe..56c5ccad95 100644 --- a/mod/item.php +++ b/mod/item.php @@ -137,15 +137,25 @@ function item_post(&$a) { AND (normalise_link($parent_contact["url"]) != normalise_link($thrparent[0]["author-link"]))) { $parent_contact = null; - // @todo: Use gcontact - require_once("include/Scrape.php"); - $probed_contact = probe_url($thrparent[0]["author-link"]); - if ($probed_contact["network"] != NETWORK_FEED) { - $parent_contact = $probed_contact; - $parent_contact["nurl"] = normalise_link($probed_contact["url"]); - $parent_contact["thumb"] = $probed_contact["photo"]; - $parent_contact["micro"] = $probed_contact["photo"]; - $parent_contact["addr"] = $probed_contact["addr"]; + $r = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", + dbesc(normalise_link($thrparent[0]["author-link"]))); + if (count($r)) { + $parent_contact = $r[0]; + $parent_contact["thumb"] = $parent_contact["photo"]; + $parent_contact["micro"] = $parent_contact["photo"]; + unset($parent_contact["id"]); + } + + if (!isset($parent_contact["nick"])) { + require_once("include/Scrape.php"); + $probed_contact = probe_url($thrparent[0]["author-link"]); + if ($probed_contact["network"] != NETWORK_FEED) { + $parent_contact = $probed_contact; + $parent_contact["nurl"] = normalise_link($probed_contact["url"]); + $parent_contact["thumb"] = $probed_contact["photo"]; + $parent_contact["micro"] = $probed_contact["photo"]; + $parent_contact["addr"] = $probed_contact["addr"]; + } } logger('no contact found: '.print_r($thrparent, true), LOGGER_DEBUG); } else @@ -1062,6 +1072,8 @@ function item_content(&$a) { * @return boolean true if replaced, false if not replaced */ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $network = "") { + require_once("include/Scrape.php"); + require_once("include/socgraph.php"); $replaced = false; $r = null; @@ -1096,10 +1108,112 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $netwo $stat = false; //get the person's name $name = substr($tag,1); + + // Try to detect the contact in various ways + if ((strpos($name,'@')) || (strpos($name,'http://'))) { + // Is it in format @user@domain.tld or @http://domain.tld/...? + + // First check the contact table for the address + $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network`, `notify` FROM `contact` WHERE `addr` = '%s' AND `uid` = %d LIMIT 1", + dbesc($name), + intval($profile_uid) + ); + + // Then check in the contact table for the url + if (!$r) + $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `notify`, `network` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1", + dbesc(normalise_link($name)), + intval($profile_uid) + ); + + // Then check in the global contacts for the address + if (!$r) + $r = q("SELECT `url`, `name`, `nick`, `network`, `alias`, `notify` FROM `gcontact` WHERE `addr` = '%s' LIMIT 1", dbesc($name)); + + // Then check in the global contacts for the url + if (!$r) + $r = q("SELECT `url`, `name`, `nick`, `network`, `alias`, `notify` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", dbesc(normalise_link($name))); + + // If the data isn't complete then refetch the data + if ($r AND ($r[0]["network"] == NETWORK_OSTATUS) AND (($r[0]["notify"] == "") OR ($r[0]["alias"] == ""))) + $r = false; + + if (!$r) { + $probed = probe_url($name); + if (isset($probed["url"])) { + update_gcontact($probed); + $r = q("SELECT `url`, `name`, `nick`, `network`, `alias`, `notify` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", + dbesc(normalise_link($probed["url"]))); + } + } + } elseif (!$r) { + $newname = str_replace('_',' ',$name); + $r = false; + if (strrpos($name,'+')) { + // Is it in format @nick+number? + $tagcid = intval(substr($name,strrpos($name,'+') + 1)); + + $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", + intval($tagcid), + intval($profile_uid) + ); + } + + //select someone by attag or nick and the name passed in the current network + if(!$r AND ($network != "")) + $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `network` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1", + dbesc($name), + dbesc($name), + dbesc($network), + intval($profile_uid) + ); + + //select someone from this user's contacts by name in the current network + if (!$r AND ($network != "")) + $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `name` = '%s' AND `network` = '%s' AND `uid` = %d LIMIT 1", + dbesc($newname), + dbesc($network), + intval($profile_uid) + ); + + //select someone by attag or nick and the name passed in + if(!$r) + $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1", + dbesc($name), + dbesc($name), + intval($profile_uid) + ); + + + //select someone from this user's contacts by name + if(!$r) + $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1", + dbesc($newname), + intval($profile_uid) + ); + } + + if ($r) { + if(strlen($inform) AND (isset($r[0]["notify"]) OR isset($r[0]["id"]))) + $inform .= ','; + + if (isset($r[0]["id"])) + $inform .= 'cid:' . $r[0]["id"]; + elseif (isset($r[0]["notify"])) + $inform .= $r[0]["notify"]; + + $profile = $r[0]["url"]; + $alias = $r[0]["alias"]; + $newname = $r[0]["nick"]; + if (($newname == "") OR (($r[0]["network"] != NETWORK_OSTATUS) AND ($r[0]["network"] != NETWORK_TWITTER) + AND ($r[0]["network"] != NETWORK_STATUSNET) AND ($r[0]["network"] != NETWORK_APPNET))) + $newname = $r[0]["name"]; + } + +/* //is it a link or a full dfrn address? if((strpos($name,'@')) || (strpos($name,'http://'))) { $newname = $name; - //get the profile links $links = @lrdd($name); if(count($links)) { @@ -1176,6 +1290,8 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $netwo ); } } +*/ + /* } elseif(strstr($name,'_') || strstr($name,' ')) { //no id //get the real name $newname = str_replace('_',' ',$name); @@ -1192,6 +1308,8 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $netwo intval($profile_uid) ); }*/ + +/* //$r is set, if someone could be selected if(count($r)) { $profile = $r[0]['url']; @@ -1211,29 +1329,10 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $netwo $inform .= 'cid:' . $r[0]['id']; } } - - if(!isset($profile)) { - $r = q("SELECT `url` FROM `gcontact` WHERE `addr` = '%s' LIMIT 1", - dbesc($name)); - if ($r) - $profile = $r[0]["url"]; - } - +*/ //if there is an url for this persons profile if(isset($profile)) { - $r = q("SELECT `nick`, `name`, `network` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", - dbesc(normalise_link($profile))); - if ($r) { - $newname = $r[0]["name"]; - - //set newname to nick - if(($r[0]['network'] === NETWORK_OSTATUS) OR ($r[0]['network'] === NETWORK_TWITTER) - OR ($r[0]['network'] === NETWORK_STATUSNET) OR ($r[0]['network'] === NETWORK_APPNET)) { - $newname = $r[0]['nick']; - } - } - $replaced = true; //create profile link $profile = str_replace(',','%2c',$profile);