]> git.mxchange.org Git - friendica.git/blobdiff - include/diaspora.php
Merge branch '1702-detect-server' of github.com:annando/friendica into 1702-detect...
[friendica.git] / include / diaspora.php
index 1e31bae8e5d155ccb69e0800d0c5a5983a851160..eca22092d81352987a2a8a0e6981c8c7aa3fb206 100644 (file)
@@ -8,6 +8,8 @@
  * This will change in the future.
  */
 
+use \Friendica\Core\Config;
+
 require_once("include/items.php");
 require_once("include/bb2diaspora.php");
 require_once("include/Scrape.php");
@@ -45,13 +47,13 @@ class Diaspora {
 
                foreach($servers AS $server) {
                        $server = trim($server);
+                       $addr = "relay@".str_replace("http://", "", normalise_link($server));
                        $batch = $server."/receive/public";
 
-                       $relais = q("SELECT `batch`, `id`, `name`,`network` FROM `contact` WHERE `uid` = 0 AND `batch` = '%s' LIMIT 1", dbesc($batch));
+                       $relais = q("SELECT `batch`, `id`, `name`,`network` FROM `contact` WHERE `uid` = 0 AND `batch` = '%s' AND `addr` = '%s' AND `nurl` = '%s' LIMIT 1",
+                                       dbesc($batch), dbesc($addr), dbesc(normalise_link($server)));
 
                        if (!$relais) {
-                               $addr = "relay@".str_replace("http://", "", normalise_link($server));
-
                                $r = q("INSERT INTO `contact` (`uid`, `created`, `name`, `nick`, `addr`, `url`, `nurl`, `batch`, `network`, `rel`, `blocked`, `pending`, `writable`, `name-date`, `uri-date`, `avatar-date`)
                                        VALUES (0, '%s', '%s', 'relay', '%s', '%s', '%s', '%s', '%s', %d, 0, 0, 1, '%s', '%s', '%s')",
                                        datetime_convert(),
@@ -309,10 +311,6 @@ class Diaspora {
                        return false;
                }
 
-               // Use a dummy importer to import the data for the public copy
-               $importer = array("uid" => 0, "page-flags" => PAGE_FREELOVE);
-               $message_id = self::dispatch($importer,$msg);
-
                // Now distribute it to the followers
                $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN
                        (SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s')
@@ -320,13 +318,23 @@ class Diaspora {
                        dbesc(NETWORK_DIASPORA),
                        dbesc($msg["author"])
                );
-               if ($r) {
+
+               if (dbm::is_result($r)) {
                        foreach ($r as $rr) {
                                logger("delivering to: ".$rr["username"]);
                                self::dispatch($rr,$msg);
                        }
-               } else
-                       logger("No subscribers for ".$msg["author"]." ".print_r($msg, true));
+               } else {
+                       $social_relay = (bool)Config::get('system', 'relay_subscribe', false);
+
+                       // Use a dummy importer to import the data for the public copy
+                       if ($social_relay) {
+                               $importer = array("uid" => 0, "page-flags" => PAGE_FREELOVE);
+                               $message_id = self::dispatch($importer,$msg);
+                       } else {
+                               logger("Unwanted message from ".$msg["author"]." send by ".$_SERVER["REMOTE_ADDR"]." with ".$_SERVER["HTTP_USER_AGENT"].": ".print_r($msg, true), LOGGER_DEBUG);
+                       }
+               }
 
                return $message_id;
        }
@@ -736,13 +744,28 @@ class Diaspora {
         * @return The contact id
         */
        private static function contact_by_handle($uid, $handle) {
+
+               // First do a direct search on the contact table
                $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `addr` = '%s' LIMIT 1",
                        intval($uid),
                        dbesc($handle)
                );
 
-               if ($r)
+               if (dbm::is_result($r)) {
                        return $r[0];
+               } else {
+                       // We haven't found it?
+                       // We use another function for it that will possibly create a contact entry
+                       $cid = get_contact($handle, $uid);
+
+                       if ($cid > 0) {
+                               $r = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", intval($cid));
+
+                               if (dbm::is_result($r)) {
+                                       return $r[0];
+                               }
+                       }
+               }
 
                $handle_parts = explode("@", $handle);
                $nurl_sql = "%%://".$handle_parts[1]."%%/profile/".$handle_parts[0];
@@ -751,9 +774,11 @@ class Diaspora {
                        intval($uid),
                        dbesc($nurl_sql)
                );
-               if($r)
+               if (dbm::is_result($r)) {
                        return $r[0];
+               }
 
+               logger("Haven't found contact for user ".$uid." and handle ".$handle, LOGGER_DEBUG);
                return false;
        }
 
@@ -833,7 +858,7 @@ class Diaspora {
                        dbesc($guid)
                );
 
-               if ($r) {
+               if (dbm::is_result($r)) {
                        logger("message ".$guid." already exists for user ".$uid);
                        return $r[0]["id"];
                }
@@ -1173,10 +1198,11 @@ class Diaspora {
        private static function get_guid_from_uri($uri, $uid) {
 
                $r = q("SELECT `guid` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", dbesc($uri), intval($uid));
-               if (dbm::is_result($r))
+               if (dbm::is_result($r)) {
                        return $r[0]["guid"];
-               else
+               } else {
                        return false;
+               }
        }
 
        /**
@@ -2282,8 +2308,9 @@ class Diaspora {
                        dbesc($target_guid),
                        intval($importer["uid"])
                );
-               if (!$r)
+               if (!$r) {
                        return false;
+               }
 
                // Check if the sender is the thread owner
                $p = q("SELECT `id`, `author-link`, `origin` FROM `item` WHERE `id` = %d",
@@ -2306,7 +2333,7 @@ class Diaspora {
                logger("Deleted target ".$target_guid." (".$r[0]["id"].") from user ".$importer["uid"]." parent: ".$p[0]["id"], LOGGER_DEBUG);
 
                // Now check if the retraction needs to be relayed by us
-               if($p[0]["origin"]) {
+               if ($p[0]["origin"]) {
                        // notify others
                        proc_run(PRIORITY_HIGH, "include/notifier.php", "drop", $r[0]["id"]);
                }
@@ -2477,15 +2504,17 @@ class Diaspora {
         * @return string the handle in the format user@domain.tld
         */
        private static function my_handle($contact) {
-               if ($contact["addr"] != "")
+               if ($contact["addr"] != "") {
                        return $contact["addr"];
+               }
 
                // Normally we should have a filled "addr" field - but in the past this wasn't the case
                // So - just in case - we build the the address here.
-               if ($contact["nickname"] != "")
+               if ($contact["nickname"] != "") {
                        $nick = $contact["nickname"];
-               else
+               } else {
                        $nick = $contact["nick"];
+               }
 
                return $nick."@".substr(App::get_baseurl(), strpos(App::get_baseurl(),"://") + 3);
        }
@@ -2949,7 +2978,7 @@ class Diaspora {
         */
        private static function build_event($event_id) {
 
-               $r = q("SELECT `uid`, `start`, `finish`, `summary`, `desc`, `location`, `adjust` FROM `event` WHERE `id` = %d", intval($event_id));
+               $r = q("SELECT `guid`, `uid`, `start`, `finish`, `nofinish`, `summary`, `desc`, `location`, `adjust` FROM `event` WHERE `id` = %d", intval($event_id));
                if (!dbm::is_result($r)) {
                        return array();
                }
@@ -2965,22 +2994,37 @@ class Diaspora {
 
                $user = $r[0];
 
-               if ($event['adjust']) {
+               $r = q("SELECT `addr`, `nick` FROM `contact` WHERE `uid` = %d AND `self`", intval($event['uid']));
+               if (!dbm::is_result($r)) {
+                       return array();
+               }
+
+               $owner = $r[0];
+
+               $eventdata['author'] = self::my_handle($owner);
+
+               if ($event['guid']) {
+                       $eventdata['guid'] = $event['guid'];
+               }
+
+               $mask = 'Y-m-d\TH:i:s\Z';
+
+               /// @todo - establish "all day" events in Friendica
+               $eventdata["all_day"] = "false";
+
+               if (!$event['adjust']) {
                        $eventdata['timezone'] = $user['timezone'];
 
                        if ($eventdata['timezone'] == "") {
                                $eventdata['timezone'] = 'UTC';
                        }
-                       $mask = 'Y-m-d\TH:i:s\Z';
-               } else {
-                       $mask = 'Y-m-d\TH:i:s';
                }
 
                if ($event['start']) {
-                       $eventdata['start'] = datetime_convert("UTC", "UTC", $event['start'], $mask);
+                       $eventdata['start'] = datetime_convert($eventdata['timezone'], "UTC", $event['start'], $mask);
                }
-               if ($event['finish']) {
-                       $eventdata['end'] = datetime_convert("UTC", "UTC", $event['finish'], $mask);
+               if ($event['finish'] AND !$event['nofinish']) {
+                       $eventdata['end'] = datetime_convert($eventdata['timezone'], "UTC", $event['finish'], $mask);
                }
                if ($event['summary']) {
                        $eventdata['summary'] = html_entity_decode(bb2diaspora($event['summary']));
@@ -3083,6 +3127,9 @@ class Diaspora {
                                $event = self::build_event($item['event-id']);
                                if (count($event)) {
                                        $message['event'] = $event;
+
+                                       /// @todo Once Diaspora supports it, we will remove the body
+                                       // $message['raw_message'] = '';
                                }
                        }
 
@@ -3131,7 +3178,11 @@ class Diaspora {
                $parent = $p[0];
 
                $target_type = ($parent["uri"] === $parent["parent-uri"] ? "Post" : "Comment");
-               $positive = "true";
+               if ($item['verb'] === ACTIVITY_LIKE) {
+                       $positive = "true";
+               } elseif ($item['verb'] === ACTIVITY_DISLIKE) {
+                       $positive = "false";
+               }
 
                return(array("positive" => $positive,
                                "guid" => $item["guid"],
@@ -3141,6 +3192,45 @@ class Diaspora {
                                "diaspora_handle" => self::my_handle($owner)));
        }
 
+       /**
+        * @brief Creates an "EventParticipation" object
+        *
+        * @param array $item The item that will be exported
+        * @param array $owner the array of the item owner
+        *
+        * @return array The data for an "EventParticipation"
+        */
+       private static function construct_attend($item, $owner) {
+
+               $p = q("SELECT `guid`, `uri`, `parent-uri` FROM `item` WHERE `uri` = '%s' LIMIT 1",
+                       dbesc($item["thr-parent"]));
+               if (!dbm::is_result($p))
+                       return false;
+
+               $parent = $p[0];
+
+               switch ($item['verb']) {
+                       case ACTIVITY_ATTEND:
+                               $attend_answer = 'accepted';
+                               break;
+                       case ACTIVITY_ATTENDNO:
+                               $attend_answer = 'declined';
+                               break;
+                       case ACTIVITY_ATTENDMAYBE:
+                               $attend_answer = 'tentative';
+                               break;
+                       default:
+                               logger('Unknown verb '.$item['verb'].' in item '.$item['guid']);
+                               return false;
+               }
+
+               return(array("author" => self::my_handle($owner),
+                               "guid" => $item["guid"],
+                               "parent_guid" => $parent["guid"],
+                               "status" => $attend_answer,
+                               "author_signature" => ""));
+       }
+
        /**
         * @brief Creates the object for a comment
         *
@@ -3151,6 +3241,13 @@ class Diaspora {
         */
        private static function construct_comment($item, $owner) {
 
+               $cachekey = "diaspora:construct_comment:".$item['guid'];
+
+               $result = Cache::get($cachekey);
+               if (!is_null($result)) {
+                       return $result;
+               }
+
                $p = q("SELECT `guid` FROM `item` WHERE `parent` = %d AND `id` = %d LIMIT 1",
                        intval($item["parent"]),
                        intval($item["parent"])
@@ -3175,6 +3272,9 @@ class Diaspora {
                if ($item['thr-parent'] != $item['parent-uri']) {
                        $comment['thread_parent_guid'] = self::get_guid_from_uri($item['thr-parent'], $item['uid']);
                }
+
+               Cache::set($cachekey, $comment, CACHE_QUARTER_HOUR);
+
                return($comment);
        }
 
@@ -3190,7 +3290,10 @@ class Diaspora {
         */
        public static function send_followup($item,$owner,$contact,$public_batch = false) {
 
-               if($item['verb'] === ACTIVITY_LIKE) {
+               if (in_array($item['verb'], array(ACTIVITY_ATTEND, ACTIVITY_ATTENDNO, ACTIVITY_ATTENDMAYBE))) {
+                       $message = self::construct_attend($item, $owner);
+                       $type = "event_participation";
+               } elseif (in_array($item["verb"], array(ACTIVITY_LIKE, ACTIVITY_DISLIKE))) {
                        $message = self::construct_like($item, $owner);
                        $type = "like";
                } else {