]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Contact.php
Merge pull request #9609 from annando/contact-reshare
[friendica.git] / src / Model / Contact.php
index 74a9619c2fdeca224e3665b0c91b138b2686bc65..38c87cf452439c7d5b2d600304a85bf7a8f438aa 100644 (file)
@@ -31,6 +31,7 @@ use Friendica\Core\Renderer;
 use Friendica\Core\Session;
 use Friendica\Core\System;
 use Friendica\Core\Worker;
+use Friendica\Database\Database;
 use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Model\Notify\Type;
@@ -138,7 +139,12 @@ class Contact
         * @}
         */
 
-       /**
+        const MIRROR_DEACTIVATED = 0;
+        const MIRROR_FORWARDED = 1;
+        const MIRROR_OWN_POST = 2;
+        const MIRROR_NATIVE_RESHARE = 3;
+
+        /**
         * @param array $fields    Array of selected fields, empty for all
         * @param array $condition Array of fields for condition
         * @param array $params    Array of several parameters
@@ -168,15 +174,23 @@ class Contact
         * Insert a row into the contact table
         * Important: You can't use DBA::lastInsertId() after this call since it will be set to 0.
         *
-        * @param array        $fields              field array
-        * @param bool         $on_duplicate_update Do an update on a duplicate entry
+        * @param array $fields         field array
+        * @param int   $duplicate_mode Do an update on a duplicate entry
         *
         * @return boolean was the insert successful?
         * @throws \Exception
         */
-       public static function insert(array $fields, bool $on_duplicate_update = false)
+       public static function insert(array $fields, int $duplicate_mode = Database::INSERT_DEFAULT)
        {
-               $ret = DBA::insert('contact', $fields, $on_duplicate_update);
+               if (!empty($fields['baseurl']) && empty($fields['gsid'])) {
+                       $fields['gsid'] = GServer::getID($fields['baseurl'], true);
+               }
+
+               if (empty($fields['created'])) {
+                       $fields['created'] = DateTimeFormat::utcNow();
+               }
+
+               $ret = DBA::insert('contact', $fields, $duplicate_mode);
                $contact = DBA::selectFirst('contact', ['nurl', 'uid'], ['id' => DBA::lastInsertId()]);
                if (!DBA::isResult($contact)) {
                        // Shouldn't happen
@@ -754,7 +768,6 @@ class Contact
                        $item['title'] = '';
                        $item['guid'] = '';
                        $item['uri-id'] = 0;
-                       $item['attach'] = '';
                        $slap = OStatus::salmon($item, $user);
 
                        if (!empty($contact['notify'])) {
@@ -1106,7 +1119,7 @@ class Contact
                        $contact = self::selectFirst(['id'], ['nurl' => $urls, 'uid' => $uid]);
                        if (!empty($contact['id'])) {
                                $contact_id = $contact['id'];
-                               Logger::info('Fetched id by url', ['cid' => $contact_id, 'uid' => $uid, 'url' => $url, 'probed_url' => $data['url'], 'alias' => $data['alias'], 'addr' => $data['addr']]);
+                               Logger::info('Fetched id by url', ['cid' => $contact_id, 'uid' => $uid, 'url' => $url, 'data' => $data]);
                        }
                }
 
@@ -1291,8 +1304,8 @@ class Contact
                $contact_field = ((($contact["contact-type"] == self::TYPE_COMMUNITY) || ($contact['network'] == Protocol::MAIL)) ? 'owner-id' : 'author-id');
 
                if ($thread_mode) {
-                       $condition = ["(`$contact_field` = ? OR (`causer-id` = ? AND `post-type` = ?)) AND `gravity` = ? AND " . $sql,
-                               $cid, $cid, Item::PT_ANNOUNCEMENT, GRAVITY_PARENT, local_user()];
+                       $condition = ["((`$contact_field` = ? AND `gravity` = ?) OR (`author-id` = ? AND `gravity` = ? AND `vid` = ?)) AND " . $sql,
+                               $cid, GRAVITY_PARENT, $cid, GRAVITY_ACTIVITY, Verb::getID(Activity::ANNOUNCE), local_user()];
                } else {
                        $condition = ["`$contact_field` = ? AND `gravity` IN (?, ?) AND " . $sql,
                                $cid, GRAVITY_PARENT, GRAVITY_COMMENT, local_user()];
@@ -1328,15 +1341,9 @@ class Contact
                }
 
                if ($thread_mode) {             
-                       $r = Item::selectForUser(local_user(), ['uri', 'gravity', 'parent-uri'], $condition, $params);
+                       $r = Item::selectForUser(local_user(), ['uri', 'gravity', 'parent-uri', 'thr-parent-id', 'author-id'], $condition, $params);
                        $items = [];
                        while ($item = DBA::fetch($r)) {
-                               if ($item['gravity'] != GRAVITY_PARENT) {
-                                       $item['uri'] = $item['parent-uri'];
-                               }
-                               unset($item['parent-uri']);
-                               unset($item['gravity']);
-                               
                                $items[] = $item;
                        }
                        DBA::close($r);
@@ -1741,9 +1748,12 @@ class Contact
                $condition['rel'] = self::SHARING;
                DBA::update('contact', $fields, $condition);
 
-               unset($fields['last-update']);
-               unset($fields['success_update']);
-               unset($fields['failure_update']);
+               // If the contact failed, propagate the update fields to all contacts
+               if (empty($fields['failed'])) {
+                       unset($fields['last-update']);
+                       unset($fields['success_update']);
+                       unset($fields['failure_update']);
+               }
 
                if (empty($fields)) {
                        return;
@@ -1864,9 +1874,7 @@ class Contact
 
                // If Probe::uri fails the network code will be different ("feed" or "unkn")
                if (in_array($ret['network'], [Protocol::FEED, Protocol::PHANTOM]) && ($ret['network'] != $contact['network'])) {
-                       if ($uid == 0) {
-                               self::updateContact($id, $uid, $ret['url'], ['failed' => true, 'last-update' => $updated, 'failure_update' => $updated]);
-                       }
+                       self::updateContact($id, $uid, $ret['url'], ['failed' => true, 'last-update' => $updated, 'failure_update' => $updated]);
                        return false;
                }
 
@@ -1935,6 +1943,7 @@ class Contact
 
                $ret['nurl'] = Strings::normaliseLink($ret['url']);
                $ret['updated'] = $updated;
+               $ret['failed'] = false;
 
                // Only fill the pubkey if it had been empty before. We have to prevent identity theft.
                if (empty($pubkey) && !empty($new_pubkey)) {
@@ -1952,7 +1961,6 @@ class Contact
                if ($uid == 0) {
                        $ret['last-update'] = $updated;
                        $ret['success_update'] = $updated;
-                       $ret['failed'] = false;
                }
 
                unset($ret['photo']);
@@ -2233,7 +2241,6 @@ class Contact
                                $item['title'] = '';
                                $item['guid'] = '';
                                $item['uri-id'] = 0;
-                               $item['attach'] = '';
 
                                $slap = OStatus::salmon($item, $owner);
 
@@ -2418,18 +2425,12 @@ class Contact
                                        in_array($user['page-flags'], [User::PAGE_FLAGS_NORMAL])) {
 
                                        notification([
-                                               'type'         => Type::INTRO,
-                                               'notify_flags' => $user['notify-flags'],
-                                               'language'     => $user['language'],
-                                               'to_name'      => $user['username'],
-                                               'to_email'     => $user['email'],
-                                               'uid'          => $user['uid'],
-                                               'link'         => DI::baseUrl() . '/notifications/intros',
-                                               'source_name'  => ((strlen(stripslashes($contact_record['name']))) ? stripslashes($contact_record['name']) : DI::l10n()->t('[Name Withheld]')),
-                                               'source_link'  => $contact_record['url'],
-                                               'source_photo' => $contact_record['photo'],
-                                               'verb'         => ($sharing ? Activity::FRIEND : Activity::FOLLOW),
-                                               'otype'        => 'intro'
+                                               'type'  => Type::INTRO,
+                                               'otype' => Notify\ObjectType::INTRO,
+                                               'verb'  => ($sharing ? Activity::FRIEND : Activity::FOLLOW),
+                                               'uid'   => $user['uid'],
+                                               'cid'   => $contact_record['id'],
+                                               'link'  => DI::baseUrl() . '/notifications/intros',
                                        ]);
                                }
                        } elseif (DBA::isResult($user) && in_array($user['page-flags'], [User::PAGE_FLAGS_SOAPBOX, User::PAGE_FLAGS_FREELOVE, User::PAGE_FLAGS_COMMUNITY])) {