diff --git a/include/Contact.php b/include/Contact.php
index 8a33e3fe91..58748e289a 100644
--- a/include/Contact.php
+++ b/include/Contact.php
@@ -93,20 +93,13 @@ function terminate_friendship($user,$self,$contact) {
if($contact['network'] === NETWORK_OSTATUS) {
- $slap = replace_macros(get_markup_template('follow_slap.tpl'), array(
- '$name' => $user['username'],
- '$profile_page' => $a->get_baseurl() . '/profile/' . $user['nickname'],
- '$photo' => $self['photo'],
- '$thumb' => $self['thumb'],
- '$published' => datetime_convert('UTC','UTC', 'now', ATOM_TIME),
- '$item_id' => 'urn:X-dfrn:' . $a->get_hostname() . ':unfollow:' . get_guid(32),
- '$title' => '',
- '$type' => 'text',
- '$content' => t('stopped following'),
- '$nick' => $user['nickname'],
- '$verb' => 'http://ostatus.org/schema/1.0/unfollow', // ACTIVITY_UNFOLLOW,
- '$ostat_follow' => '' // 'http://ostatus.org/schema/1.0/unfollow' . "\r\n"
- ));
+ require_once('include/ostatus.php');
+
+ // create an unfollow slap
+ $item = array();
+ $item['verb'] = NAMESPACE_OSTATUS."/unfollow";
+ $item['follow'] = $contact["url"];
+ $slap = ostatus::salmon($item, $user);
if((x($contact,'notify')) && (strlen($contact['notify']))) {
require_once('include/salmon.php');
diff --git a/include/follow.php b/include/follow.php
index 1c33edf80e..77f0bbe2f1 100644
--- a/include/follow.php
+++ b/include/follow.php
@@ -2,6 +2,10 @@
require_once("include/Scrape.php");
require_once("include/socgraph.php");
require_once('include/group.php');
+require_once('include/salmon.php');
+require_once('include/ostatus.php');
+require_once("include/Photo.php");
+require_once('include/diaspora.php');
function update_contact($id) {
/*
@@ -263,8 +267,6 @@ function new_contact($uid,$url,$interactive = false) {
if (intval($def_gid))
group_add_member($uid, '', $contact_id, $def_gid);
- require_once("include/Photo.php");
-
// Update the avatar
update_contact_avatar($ret['photo'],$uid,$contact_id);
@@ -272,36 +274,22 @@ function new_contact($uid,$url,$interactive = false) {
proc_run(PRIORITY_HIGH, "include/onepoll.php", $contact_id, "force");
- // create a follow slap
-
- $tpl = get_markup_template('follow_slap.tpl');
- $slap = replace_macros($tpl, array(
- '$name' => $a->user['username'],
- '$profile_page' => $a->get_baseurl() . '/profile/' . $a->user['nickname'],
- '$photo' => $a->contact['photo'],
- '$thumb' => $a->contact['thumb'],
- '$published' => datetime_convert('UTC','UTC', 'now', ATOM_TIME),
- '$item_id' => 'urn:X-dfrn:' . $a->get_hostname() . ':follow:' . get_guid(32),
- '$title' => '',
- '$type' => 'text',
- '$content' => t('following'),
- '$nick' => $a->user['nickname'],
- '$verb' => ACTIVITY_FOLLOW,
- '$ostat_follow' => ''
- ));
-
$r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid`
- WHERE `user`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1",
+ WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1",
intval($uid)
);
- if(count($r)) {
- if(($contact['network'] == NETWORK_OSTATUS) && (strlen($contact['notify']))) {
- require_once('include/salmon.php');
- slapper($r[0],$contact['notify'],$slap);
+ if (dbm::is_result($r)) {
+ if (($contact['network'] == NETWORK_OSTATUS) && (strlen($contact['notify']))) {
+
+ // create a follow slap
+ $item = array();
+ $item['verb'] = ACTIVITY_FOLLOW;
+ $item['follow'] = $contact["url"];
+ $slap = ostatus::salmon($item, $r[0]);
+ slapper($r[0], $contact['notify'], $slap);
}
- if($contact['network'] == NETWORK_DIASPORA) {
- require_once('include/diaspora.php');
+ if ($contact['network'] == NETWORK_DIASPORA) {
$ret = diaspora::send_share($a->user,$contact);
logger('share returns: '.$ret);
}
diff --git a/include/ostatus.php b/include/ostatus.php
index bcd8fd6713..4f84c123d9 100644
--- a/include/ostatus.php
+++ b/include/ostatus.php
@@ -1561,10 +1561,13 @@ class ostatus {
if ($xml)
return $xml;
- if ($item["verb"] == ACTIVITY_LIKE)
+ if ($item["verb"] == ACTIVITY_LIKE) {
return self::like_entry($doc, $item, $owner, $toplevel);
- else
+ } elseif (in_array($item["verb"], array(ACTIVITY_FOLLOW, NAMESPACE_OSTATUS."/unfollow"))) {
+ return self::follow_entry($doc, $item, $owner, $toplevel);
+ } else {
return self::note_entry($doc, $item, $owner, $toplevel);
+ }
}
/**
@@ -1740,6 +1743,97 @@ class ostatus {
return $entry;
}
+ /**
+ * @brief Adds the person object element to the XML document
+ *
+ * @param object $doc XML document
+ * @param array $owner Contact data of the poster
+ * @param array $contact Contact data of the target
+ *
+ * @return object author element
+ */
+ private function add_person_object($doc, $owner, $contact) {
+
+ $object = $doc->createElement("activity:object");
+ xml::add_element($doc, $object, "activity:object-type", ACTIVITY_OBJ_PERSON);
+
+ if ($contact['network'] == NETWORK_PHANTOM) {
+ xml::add_element($doc, $object, "id", $contact['url']);
+ return $object;
+ }
+
+ xml::add_element($doc, $object, "id", $contact["alias"]);
+ xml::add_element($doc, $object, "title", $contact["nick"]);
+
+ $attributes = array("rel" => "alternate", "type" => "text/html", "href" => $contact["url"]);
+ xml::add_element($doc, $object, "link", "", $attributes);
+
+ $attributes = array(
+ "rel" => "avatar",
+ "type" => "image/jpeg", // To-Do?
+ "media:width" => 175,
+ "media:height" => 175,
+ "href" => $contact["photo"]);
+ xml::add_element($doc, $object, "link", "", $attributes);
+
+ xml::add_element($doc, $object, "poco:preferredUsername", $contact["nick"]);
+ xml::add_element($doc, $object, "poco:displayName", $contact["name"]);
+
+ if (trim($contact["location"]) != "") {
+ $element = $doc->createElement("poco:address");
+ xml::add_element($doc, $element, "poco:formatted", $contact["location"]);
+ $object->appendChild($element);
+ }
+
+ return $object;
+ }
+
+ /**
+ * @brief Adds a follow/unfollow entry element
+ *
+ * @param object $doc XML document
+ * @param array $item Data of the follow/unfollow message
+ * @param array $owner Contact data of the poster
+ * @param bool $toplevel Is it for en entry element (false) or a feed entry (true)?
+ *
+ * @return object Entry element
+ */
+ private function follow_entry($doc, $item, $owner, $toplevel) {
+
+ $item["id"] = $item["parent"] = 0;
+ $item['guid'] = get_guid(32);
+ $item["uri"] = $item['parent-uri'] = $item['thr-parent'] = 'urn:X-dfrn:'.get_app()->get_hostname() . ':follow:'.$item['guid'];
+ $item["created"] = $item["edited"] = datetime_convert('UTC','UTC', 'now', ATOM_TIME);
+ $item["app"] = "activity";
+
+ $contact = Probe::uri($item['follow']);
+
+ if ($contact['alias'] == '') {
+ $contact['alias'] = $contact["url"];
+ } else {
+ $item['follow'] = $contact['alias'];
+ }
+
+ if ($item['verb'] == ACTIVITY_FOLLOW) {
+ $message = t('%s> is now following %s>.');
+ } else {
+ $message = t('%s> stopped following %s>.');
+ }
+
+ $item["body"] = sprintf($message, $owner["url"], $owner["nick"], $contact["url"], $contact["nick"]);
+
+ $title = self::entry_header($doc, $entry, $owner, $toplevel);
+
+ self::entry_content($doc, $entry, $item, $owner, "");
+
+ $object = self::add_person_object($doc, $owner, $contact);
+ $entry->appendChild($object);
+
+ self::entry_footer($doc, $entry, $item, $owner);
+
+ return $entry;
+ }
+
/**
* @brief Adds a regular entry element
*
@@ -1881,9 +1975,14 @@ class ostatus {
}
}
- xml::add_element($doc, $entry, "link", "", array("rel" => "ostatus:conversation",
- "href" => App::get_baseurl()."/display/".$owner["nick"]."/".$item["parent"]));
- xml::add_element($doc, $entry, "ostatus:conversation", App::get_baseurl()."/display/".$owner["nick"]."/".$item["parent"]);
+ if (intval($item["parent"]) > 0) {
+ $conversation = App::get_baseurl()."/display/".$owner["nick"]."/".$item["parent"];
+ } else {
+ $conversation = "urn:X-dfrn:".App::get_baseurl().":conversation:".$item["guid"];
+ }
+
+ xml::add_element($doc, $entry, "link", "", array("rel" => "ostatus:conversation", "href" => $conversation));
+ xml::add_element($doc, $entry, "ostatus:conversation", $conversation);
$tags = item_getfeedtags($item);
@@ -1892,6 +1991,10 @@ class ostatus {
if ($t[0] == "@")
$mentioned[$t[1]] = $t[1];
+ if (isset($item['follow'])) {
+ $mentioned[$item['follow']] = $item['follow'];
+ }
+
// Make sure that mentions are accepted (GNU Social has problems with mixing HTTP and HTTPS)
$newmentions = array();
foreach ($mentioned AS $mention) {
diff --git a/view/templates/follow_slap.tpl b/view/templates/follow_slap.tpl
deleted file mode 100644
index b0e1cbafda..0000000000
--- a/view/templates/follow_slap.tpl
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
- {{$name}}
- {{$profile_page}}
-
-
-
-
- {{$item_id}}
- {{$title}}
- {{$published}}
- {{$content}}
-
-
- http://activitystrea.ms/schema/1.0/person
- {{$profile_page}}
-
-
-
- {{$nick}}
- {{$name}}
-
- {{$verb}}
- {{$ostat_follow}}
-