]> git.mxchange.org Git - friendica.git/commitdiff
Merge remote-tracking branch 'upstream/develop' into receive_participation
authorMichael <heluecht@pirati.ca>
Sat, 13 Jan 2018 08:29:44 +0000 (08:29 +0000)
committerMichael <heluecht@pirati.ca>
Sat, 13 Jan 2018 08:29:44 +0000 (08:29 +0000)
boot.php
database.sql
doc/database.md
doc/database/db_particiation.md [new file with mode: 0644]
src/Database/DBStructure.php
src/Protocol/Diaspora.php
src/Worker/Notifier.php

index b10ba7a63f178b5d4726678c71fbd215d0eaf3f3..51594b21723b45309ad5863943e4df83fa2d2ae3 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -43,7 +43,7 @@ define('FRIENDICA_PLATFORM',     'Friendica');
 define('FRIENDICA_CODENAME',     'Asparagus');
 define('FRIENDICA_VERSION',      '3.6-dev');
 define('DFRN_PROTOCOL_VERSION',  '2.23');
-define('DB_UPDATE_VERSION',      1240);
+define('DB_UPDATE_VERSION',      1241);
 define('NEW_UPDATE_ROUTINE_VERSION', 1170);
 
 /**
index 48c2e7ecee354d1a6f561e99314cbb585cf20efe..79e81f1d2294a013d75252207c58bc8bd43b1561 100644 (file)
@@ -1,6 +1,6 @@
 -- ------------------------------------------
 -- Friendica 3.6-dev (Asparagus)
--- DB_UPDATE_VERSION 1239
+-- DB_UPDATE_VERSION 1241
 -- ------------------------------------------
 
 
@@ -650,9 +650,10 @@ CREATE TABLE IF NOT EXISTS `notify-threads` (
 --
 CREATE TABLE IF NOT EXISTS `oembed` (
        `url` varbinary(255) NOT NULL,
+       `maxwidth` int(11) NOT NULL,
        `content` mediumtext,
        `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
-        PRIMARY KEY(`url`),
+        PRIMARY KEY(`url`,`maxwidth`),
         INDEX `created` (`created`)
 ) DEFAULT COLLATE utf8mb4_general_ci;
 
@@ -669,6 +670,16 @@ CREATE TABLE IF NOT EXISTS `parsed_url` (
         INDEX `created` (`created`)
 ) DEFAULT COLLATE utf8mb4_general_ci;
 
+--
+-- TABLE participation
+--
+CREATE TABLE IF NOT EXISTS `participation` (
+       `iid` int(10) unsigned NOT NULL,
+       `server` varchar(60) NOT NULL,
+       `cid` int(10) unsigned NOT NULL,
+        PRIMARY KEY(`iid`,`server`)
+) DEFAULT COLLATE utf8mb4_general_ci;
+
 --
 -- TABLE pconfig
 --
index 00a40fb247f762563c357d0a98a4df909836803d..e778a0a7219872726e833e6fe09fae08ce4871ba 100644 (file)
@@ -35,6 +35,7 @@ Database Tables
 | [notify-threads](help/database/db_notify-threads)    |                                                  |
 | [oembed](help/database/db_oembed)                    | cache for OEmbed queries                         |
 | [parsed_url](help/database/db_parsed_url)            | cache for "parse_url" queries                    |
+| [participation](help/database/db_participation)      | Storage for participation messages from Diaspora |
 | [pconfig](help/database/db_pconfig)                  | personal (per user) configuration storage        |
 | [photo](help/database/db_photo)                      | photo storage                                    |
 | [poll](help/database/db_poll)                        | data for polls                                   |
diff --git a/doc/database/db_particiation.md b/doc/database/db_particiation.md
new file mode 100644 (file)
index 0000000..27f0632
--- /dev/null
@@ -0,0 +1,10 @@
+Table participation
+===================
+
+| Field       | Description      | Type             | Null | Key | Default             | Extra |
+|-------------|------------------|------------------|------|-----|---------------------|-------|
+| iid         | item id          | int(10) unsigned | NO   | PRI |                     |       |
+| server      | Name of server   | varchar(60)      | NO   | PRI |                     |       |
+| cid         | contact id       | int(10) unsigned | NO   |     |                     |       |
+
+Return to [database documentation](help/database)
index 11bf40aec4acf9fcf0fbf8d84f1c35f9bba91560..2d9b4fc13ba70acf3e371541fa52a831d66ffb32 100644 (file)
@@ -1299,6 +1299,16 @@ class DBStructure {
                                                "created" => array("created"),
                                                )
                                );
+               $database["participation"] = array(
+                               "fields" => array(
+                                               "iid" => array("type" => "int(10) unsigned", "not null" => "1", "primary" => "1", "relation" => array("item" => "id")),
+                                               "server" => array("type" => "varchar(60)", "not null" => "1", "primary" => "1"),
+                                               "cid" => array("type" => "int(10) unsigned", "not null" => "1", "relation" => array("contact" => "id")),
+                                               ),
+                               "indexes" => array(
+                                               "PRIMARY" => array("iid", "server")
+                                               )
+                               );
                $database["pconfig"] = array(
                                "fields" => array(
                                                "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
index 23220d04cd0ed2981a3c796f3878f494aac6e9e9..4d89143452e0e0e3a07736cf66909178762af7ca 100644 (file)
@@ -99,6 +99,53 @@ class Diaspora
                return $relay;
        }
 
+       /**
+        * @brief Return a list of participating contacts for a thread
+        *
+        * This is used for the participation feature.
+        * One of the parameters is a contact array.
+        * This is done to avoid duplicates.
+        *
+        * @param integer $thread   The id of the thread
+        * @param array   $contacts The previously fetched contacts
+        *
+        * @return array of relay servers
+        */
+       public static function participantsForThread($thread, $contacts)
+       {
+               $r = dba::p("SELECT `contact`.`batch`, `contact`.`id`, `contact`.`name`, `contact`.`network`,
+                               `fcontact`.`batch` AS `fbatch`, `fcontact`.`network` AS `fnetwork` FROM `participation`
+                               INNER JOIN `contact` ON `contact`.`id` = `participation`.`cid`
+                               LEFT JOIN `fcontact` ON `fcontact`.`url` = `contact`.`url`
+                               WHERE `participation`.`iid` = ?", $thread);
+
+               while ($contact = dba::fetch($r)) {
+                       if (!empty($contact['fnetwork'])) {
+                               $contact['network'] = $contact['fnetwork'];
+                       }
+                       unset($contact['fnetwork']);
+
+                       if (empty($contact['batch']) && !empty($contact['fbatch'])) {
+                               $contact['batch'] = $contact['fbatch'];
+                       }
+                       unset($contact['fbatch']);
+
+                       $exists = false;
+                       foreach ($contacts as $entry) {
+                               if ($entry['batch'] == $contact['batch']) {
+                                       $exists = true;
+                               }
+                       }
+
+                       if (!$exists) {
+                               $contacts[] = $contact;
+                       }
+               }
+               dba::close($r);
+
+               return $contacts;
+       }
+
        /**
         * @brief repairs a signature that was double encoded
         *
@@ -542,7 +589,7 @@ class Diaspora
                        case "message":
                                return self::receiveMessage($importer, $fields);
 
-                       case "participation": // Not implemented
+                       case "participation":
                                return self::receiveParticipation($importer, $fields);
 
                        case "photo": // Not implemented
@@ -2128,7 +2175,32 @@ class Diaspora
         */
        private static function receiveParticipation($importer, $data)
        {
-               // I'm not sure if we can fully support this message type
+               $author = strtolower(notags(unxmlify($data->author)));
+               $parent_guid = notags(unxmlify($data->parent_guid));
+
+               $contact_id = Contact::getIdForURL($author);
+               if (!$contact_id) {
+                       logger('Author not found: '.$author);
+                       return false;
+               }
+
+               $item = dba::selectFirst('item', ['id'], ['guid' => $parent_guid, 'origin' => true, 'private' => false]);
+               if (!DBM::is_result($item)) {
+                       logger('Item not found: '.$parent_guid);
+                       return false;
+               }
+
+               $author_parts = explode('@', $author);
+               if (isset($author_parts[1])) {
+                       $server = $author_parts[1];
+               } else {
+                       // Should never happen
+                       $server = $author;
+               }
+
+               logger('Received participation for ID: '.$item['id'].' - Contact: '.$contact_id.' - Server: '.$server);
+               dba::insert('participation', ['item' => $item['id'], 'contact' => $contact_id, 'server' => $server]);
+
                return true;
        }
 
index 710bcfa13b55f6ad89d9eb87e7f341d5715569b5..307178bfbd830c80cb741fe562558bcef792f6e8 100644 (file)
@@ -522,6 +522,11 @@ class Notifier {
                                        intval($owner['uid']),
                                        intval(CONTACT_IS_SHARING)
                                );
+
+                               // Fetch the participation list
+                               // The function will ensure that there are no duplicates
+                               $r1 = Diaspora::participantsForThread($item_id, $r1);
+
                        }
 
                        $r2 = q("SELECT `id`, `name`,`network` FROM `contact`
@@ -531,7 +536,8 @@ class Notifier {
                                intval(CONTACT_IS_SHARING)
                        );
 
-                       $r = array_merge($r2,$r1,$r0);
+
+                       $r = array_merge($r2, $r1, $r0);
 
                        if (DBM::is_result($r)) {
                                logger('pubdeliver '.$target_item["guid"].': '.print_r($r,true), LOGGER_DEBUG);