]> git.mxchange.org Git - friendica.git/blobdiff - src/Worker/OnePoll.php
Merge pull request #4095 from MrPetovan/task/fix-phpstan-errors
[friendica.git] / src / Worker / OnePoll.php
index 64c533f8201768bb4b3ecf3a5c84cd07f4b5b56b..fc819751bc8521a1057601f6579b2686c4d4a01f 100644 (file)
@@ -7,11 +7,12 @@ namespace Friendica\Worker;
 use Friendica\Core\Config;
 use Friendica\Core\PConfig;
 use Friendica\Database\DBM;
-use Friendica\Object\Contact;
+use Friendica\Model\Contact;
 use Friendica\Protocol\Email;
 use Friendica\Protocol\PortableContact;
 use dba;
 
+require_once 'include/dba.php';
 require_once 'include/follow.php';
 
 Class OnePoll
@@ -42,30 +43,12 @@ Class OnePoll
 
                $d = datetime_convert();
 
-               // Only poll from those with suitable relationships,
-               // and which have a polling address and ignore Diaspora since
-               // we are unable to match those posts with a Diaspora GUID and prevent duplicates.
-
-               $contacts = q("SELECT `contact`.* FROM `contact`
-                       WHERE (`rel` = %d OR `rel` = %d) AND `poll` != ''
-                       AND NOT `network` IN ('%s', '%s')
-                       AND `contact`.`id` = %d
-                       AND `self` = 0 AND `contact`.`blocked` = 0 AND `contact`.`readonly` = 0
-                       AND `contact`.`archive` = 0 LIMIT 1",
-                       intval(CONTACT_IS_SHARING),
-                       intval(CONTACT_IS_FRIEND),
-                       dbesc(NETWORK_FACEBOOK),
-                       dbesc(NETWORK_PUMPIO),
-                       intval($contact_id)
-               );
-
-               if (!count($contacts)) {
+               $contact = dba::select('contact', [], ['id' => $contact_id], ['limit' => 1]);
+               if (!DBM::is_result($contact)) {
                        logger('Contact not found or cannot be used.');
                        return;
                }
 
-               $contact = $contacts[0];
-
                $importer_uid = $contact['uid'];
 
                // load current friends if possible.
@@ -81,28 +64,25 @@ Class OnePoll
                        }
                }
 
-               /// @TODO Check why we don't poll the Diaspora feed at the moment (some guid problem in the items?)
-               /// @TODO Check whether this is possible with Redmatrix
-               if ($contact["network"] == NETWORK_DIASPORA) {
-                       if (PortableContact::updateNeeded($contact["created"], $contact["last-item"], $contact["failure_update"], $contact["success_update"])) {
-                               $last_updated = PortableContact::lastUpdated($contact["url"]);
-                               $updated = datetime_convert();
-                               if ($last_updated) {
-                                       logger('Diaspora contact '.$contact['id'].' had last update on '.$last_updated, LOGGER_DEBUG);
-
-                                       // The last public item can be older than the last item we got
-                                       if ($last_updated < $contact['last-item']) {
-                                               $last_updated = $contact['last-item'];
-                                       }
+               // Diaspora users, archived users and followers are only checked if they still exist.
+               if ($contact['archive'] || ($contact["network"] == NETWORK_DIASPORA) || ($contact["rel"] == CONTACT_IS_FOLLOWER)) {
+                       $last_updated = PortableContact::lastUpdated($contact["url"]);
+                       $updated = datetime_convert();
+                       if ($last_updated) {
+                               logger('Contact '.$contact['id'].' had last update on '.$last_updated, LOGGER_DEBUG);
 
-                                       $fields = array('last-item' => $last_updated, 'last-update' => $updated, 'success_update' => $updated);
-                                       dba::update('contact', $fields, array('id' => $contact['id']));
-                                       Contact::unmarkForArchival($contact);
-                               } else {
-                                       dba::update('contact', array('last-update' => $updated, 'failure_update' => $updated), array('id' => $contact['id']));
-                                       Contact::markForArchival($contact);
-                                       logger('Diaspora contact '.$contact['id'].' is marked for archival', LOGGER_DEBUG);
+                               // The last public item can be older than the last item we got
+                               if ($last_updated < $contact['last-item']) {
+                                       $last_updated = $contact['last-item'];
                                }
+
+                               $fields = array('last-item' => $last_updated, 'last-update' => $updated, 'success_update' => $updated);
+                               self::updateContact($contact, $fields);
+                               Contact::unmarkForArchival($contact);
+                       } else {
+                               self::updateContact($contact, array('last-update' => $updated, 'failure_update' => $updated));
+                               Contact::markForArchival($contact);
+                               logger('Contact '.$contact['id'].' is marked for archival', LOGGER_DEBUG);
                        }
                        return;
                }
@@ -112,8 +92,8 @@ Class OnePoll
                $t = $contact['last-update'];
 
                if ($contact['subhub']) {
-                       $poll_interval = Config::get('system', 'pushpoll_frequency');
-                       $contact['priority'] = (($poll_interval !== false) ? intval($poll_interval) : 3);
+                       $poll_interval = Config::get('system', 'pushpoll_frequency', 3);
+                       $contact['priority'] = intval($poll_interval);
                        $hub_update = false;
 
                        if (datetime_convert('UTC', 'UTC', 'now') > datetime_convert('UTC', 'UTC', $t . " + 1 day")) {
@@ -225,7 +205,7 @@ Class OnePoll
 
                                // set the last-update so we don't keep polling
                                $fields = array('last-update' => datetime_convert(), 'failure_update' => datetime_convert());
-                               dba::update('contact', $fields, array('id' => $contact['id']));
+                               self::updateContact($contact, $fields);
                                return;
                        }
 
@@ -235,7 +215,7 @@ Class OnePoll
                                Contact::markForArchival($contact);
 
                                $fields = array('last-update' => datetime_convert(), 'failure_update' => datetime_convert());
-                               dba::update('contact', $fields, array('id' => $contact['id']));
+                               self::updateContact($contact, $fields);
                                return;
                        }
 
@@ -248,7 +228,7 @@ Class OnePoll
                                // we may not be friends anymore. Will keep trying for one month.
                                // set the last-update so we don't keep polling
                                $fields = array('last-update' => datetime_convert(), 'failure_update' => datetime_convert());
-                               dba::update('contact', $fields, array('id' => $contact['id']));
+                               self::updateContact($contact, $fields);
 
                                Contact::markForArchival($contact);
                        } elseif ($contact['term-date'] > NULL_DATE) {
@@ -334,6 +314,7 @@ Class OnePoll
 
                        $cookiejar = tempnam(get_temppath(), 'cookiejar-onepoll-');
                        $ret = z_fetch_url($contact['poll'], false, $redirects, array('cookiejar' => $cookiejar));
+                       unlink($cookiejar);
 
                        if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
                                // set the last-update so we don't keep polling
@@ -344,7 +325,6 @@ Class OnePoll
 
                        $xml = $ret['body'];
 
-                       unlink($cookiejar);
                } elseif ($contact['network'] === NETWORK_MAIL) {
 
                        logger("Mail: Fetching for ".$contact['addr'], LOGGER_DEBUG);
@@ -596,7 +576,7 @@ Class OnePoll
                                logger('post_handshake: response from ' . $url . ' did not contain XML.');
 
                                $fields = array('last-update' => datetime_convert(), 'failure_update' => datetime_convert());
-                               dba::update('contact', $fields, array('id' => $contact['id']));
+                               self::updateContact($contact, $fields);
                                Contact::markForArchival($contact);
                                return;
                        }
@@ -641,14 +621,17 @@ Class OnePoll
 
                        $updated = datetime_convert();
 
-                       dba::update('contact', array('last-update' => $updated, 'success_update' => $updated), array('id' => $contact['id']));
+                       self::updateContact($contact, array('last-update' => $updated, 'success_update' => $updated));
                        dba::update('gcontact', array('last_contact' => $updated), array('nurl' => $contact['nurl']));
+                       Contact::unmarkForArchival($contact);
                } elseif (in_array($contact["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, NETWORK_FEED))) {
                        $updated = datetime_convert();
 
-                       dba::update('contact', array('last-update' => $updated, 'failure_update' => $updated), array('id' => $contact['id']));
+                       self::updateContact($contact, array('last-update' => $updated, 'failure_update' => $updated));
                        dba::update('gcontact', array('last_failure' => $updated), array('nurl' => $contact['nurl']));
+                       Contact::markForArchival($contact);
                } else {
+                       $updated = datetime_convert();
                        dba::update('contact', array('last-update' => $updated), array('id' => $contact['id']));
                }
 
@@ -662,4 +645,15 @@ Class OnePoll
 
                return $subject;
        }
+
+       /**
+        * @brief Updates a personal contact entry and the public contact entry
+        *
+        * @param array $contact The personal contact entry
+        * @param array $fields The fields that are updated
+        */
+       private static function updateContact($contact, $fields) {
+               dba::update('contact', $fields, array('id' => $contact['id']));
+               dba::update('contact', $fields, array('uid' => 0, 'nurl' => $contact['nurl']));
+       }
 }