]> git.mxchange.org Git - friendica.git/commitdiff
Mark contacts as dead or undead while transmitting and receiving messages
authorMichael <heluecht@pirati.ca>
Sat, 19 Nov 2016 20:10:29 +0000 (20:10 +0000)
committerMichael <heluecht@pirati.ca>
Sat, 19 Nov 2016 20:10:29 +0000 (20:10 +0000)
include/Contact.php
include/delivery.php
include/diaspora.php

index 23b5bbe5b82be3d8207c9dbf87f70c240736b5f3..949feb3564e695057a2313eff75fbbaa01b7d602 100644 (file)
@@ -145,7 +145,6 @@ function terminate_friendship($user,$self,$contact) {
 // This provides for the possibility that their database is temporarily messed
 // up or some other transient event and that there's a possibility we could recover from it.
 
-if(! function_exists('mark_for_death')) {
 function mark_for_death($contact) {
 
        if($contact['archive'])
@@ -156,14 +155,24 @@ function mark_for_death($contact) {
                                dbesc(datetime_convert()),
                                intval($contact['id'])
                );
-       }
-       else {
+
+               if ($contact['url'] != '') {
+                       q("UPDATE `contact` SET `term-date` = '%s'
+                               WHERE `nurl` = '%s' AND `term-date` <= '1000-00-00'",
+                                       dbesc(datetime_convert()),
+                                       dbesc(normalise_link($contact['url']))
+                       );
+               }
+       } else {
 
                /// @todo
                /// We really should send a notification to the owner after 2-3 weeks
                /// so they won't be surprised when the contact vanishes and can take
                /// remedial action if this was a serious mistake or glitch
 
+               /// @todo
+               /// Check for contact vitality via probing
+
                $expiry = $contact['term-date'] . ' + 32 days ';
                if(datetime_convert() > datetime_convert('UTC','UTC',$expiry)) {
 
@@ -171,26 +180,45 @@ function mark_for_death($contact) {
                        // archive them rather than delete
                        // though if the owner tries to unarchive them we'll start the whole process over again
 
-                       q("update contact set `archive` = 1 where id = %d",
+                       q("UPDATE `contact` SET `archive` = 1 WHERE `id` = %d",
                                intval($contact['id'])
                        );
-                       q("UPDATE `item` SET `private` = 2 WHERE `contact-id` = %d AND `uid` = %d", intval($contact['id']), intval($contact['uid']));
-
-                       //contact_remove($contact['id']);
 
+                       if ($contact['url'] != '') {
+                               q("UPDATE `contact` SET `archive` = 1 WHERE `nurl` = '%s'",
+                                       dbesc(normalise_link($contact['url']))
+                               );
+                       }
                }
        }
 
-}}
+}
 
-if(! function_exists('unmark_for_death')) {
 function unmark_for_death($contact) {
+
+       $r = q("SELECT `term-date` FROM `contact` WHERE `id` = %d AND `term-date` > '%s'",
+               intval($contact['id']),
+               dbesc('1000-00-00 00:00:00')
+       );
+
+       // We don't need to update, we never marked this contact as dead
+       if (!dbm::is_result($r)) {
+               return;
+       }
+
        // It's a miracle. Our dead contact has inexplicably come back to life.
        q("UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d",
                dbesc('0000-00-00 00:00:00'),
                intval($contact['id'])
        );
-}}
+
+       if ($contact['url'] != '') {
+               q("UPDATE `contact` SET `term-date` = '%s' WHERE `nurl` = '%s'",
+                       dbesc('0000-00-00 00:00:00'),
+                       dbesc(normalise_link($contact['url']))
+               );
+       }
+}
 
 /**
  * @brief Get contact data for a given profile link
index 7c0ba63a6b41b9649cf30e925df64cf089e6ccd8..8fce98774250cdaeeaccda7bd841671cbda1a7ed 100644 (file)
@@ -381,7 +381,14 @@ function delivery_run(&$argv, &$argc){
                                if ($deliver_status == (-1)) {
                                        logger('notifier: delivery failed: queuing message');
                                        add_to_queue($contact['id'],NETWORK_DFRN,$atom);
+
+                                       // The message could not be delivered. We mark the contact as "dead"
+                                       mark_for_death($contact);
+                               } else {
+                                       // We successfully delivered a message, the contact is alive
+                                       unmark_for_death($contact);
                                }
+
                                break;
 
                        case NETWORK_OSTATUS:
index 10f1be93d24823b8849dcc0190adf69348e7a1e0..f2d48486788bf68145cd3dcbb22b07395b4d91f5 100644 (file)
@@ -999,17 +999,21 @@ class diaspora {
         */
        private function author_contact_by_url($contact, $person, $uid) {
 
-               $r = q("SELECT `id`, `network` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1",
+               $r = q("SELECT `id`, `network`, `url` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1",
                        dbesc(normalise_link($person["url"])), intval($uid));
                if ($r) {
                        $cid = $r[0]["id"];
                        $network = $r[0]["network"];
+
+                       // We are receiving content from a user that is about to be terminated
+                       // This means the user is vital, so we remove a possible termination date.
+                       unmark_for_death($contact);
                } else {
                        $cid = $contact["id"];
                        $network = NETWORK_DIASPORA;
                }
 
-               return (array("cid" => $cid, "network" => $network));
+               return array("cid" => $cid, "network" => $network);
        }
 
        /**
@@ -2633,7 +2637,13 @@ class diaspora {
                        } else {
                                // queue message for redelivery
                                add_to_queue($contact["id"], NETWORK_DIASPORA, $slap, $public_batch);
+
+                               // The message could not be delivered. We mark the contact as "dead"
+                               mark_for_death($contact);
                        }
+               } elseif (($return_code >= 200) AND ($return_code <= 299)) {
+                       // We successfully delivered a message, the contact is alive
+                       unmark_for_death($contact);
                }
 
                return(($return_code) ? $return_code : (-1));