]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/distribqueuehandler.php
Merge commit 'refs/merge-requests/41' of https://gitorious.org/social/mainline into...
[quix0rs-gnu-social.git] / lib / distribqueuehandler.php
index f458d238da97c77cdd6006ee821de09ab361c36b..036d970f2af9c3be343ffa36d350265b690895ac 100644 (file)
@@ -17,7 +17,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
+if (!defined('GNUSOCIAL') && !defined('STATUSNET')) { exit(1); }
 
 /**
  * Base class for queue handlers.
@@ -43,14 +43,17 @@ class DistribQueueHandler
      * @return string
      */
 
-    function transport()
+    public function transport()
     {
         return 'distrib';
     }
 
     /**
-     * Here's the meat of your queue handler -- you're handed a Notice
-     * object, which you may do as you will with.
+     * Handle distribution of a notice after we've saved it:
+     * @li add to local recipient inboxes
+     * @li send email notifications to local @-reply targets
+     * @li run final EndNoticeSave plugin events
+     * @li put any remaining post-processing into the queues
      *
      * If this function indicates failure, a warning will be logged
      * and the item is placed back in the queue to be re-run.
@@ -58,27 +61,58 @@ class DistribQueueHandler
      * @param Notice $notice
      * @return boolean true on success, false on failure
      */
-    function handle($notice)
+    public function handle(Notice $notice)
     {
-        // XXX: do we need to change this for remote users?
+        // We have to manually add attentions to non-profile subs and non-mentions
+        $ptAtts = $notice->getAttentionsFromProfileTags();
+        foreach (array_keys($ptAtts) as $profile_id) {
+            $profile = Profile::getKV('id', $profile_id);
+            if ($profile instanceof Profile) {
+                try {
+                    common_debug('Adding Attention for '.$notice->getID().' profile '.$profile->getID());
+                    Attention::saveNew($notice, $profile);
+                } catch (Exception $e) {
+                    $this->logit($notice, $e);
+                }
+            }
+        }
 
-        $notice->saveTags();
+        try {
+            $notice->sendReplyNotifications();
+        } catch (Exception $e) {
+            $this->logit($notice, $e);
+        }
 
-        $groups = $notice->saveGroups();
+        try {
+            Event::handle('EndNoticeDistribute', array($notice));
+        } catch (Exception $e) {
+            $this->logit($notice, $e);
+        }
 
-        $recipients = $notice->saveReplies();
+        try {
+            Event::handle('EndNoticeSave', array($notice));
+        } catch (Exception $e) {
+            $this->logit($notice, $e);
+        }
 
-        $notice->addToInboxes($groups, $recipients);
+        try {
+            // Enqueue for other handlers
+            common_enqueue_notice($notice);
+        } catch (Exception $e) {
+            $this->logit($notice, $e);
+        }
 
-        $notice->saveUrls();
-
-        Event::handle('EndNoticeSave', array($notice));
-
-        // Enqueue for other handlers
+        return true;
+    }
 
-        common_enqueue_notice($notice);
+    protected function logit($notice, $e)
+    {
+        common_log(LOG_ERR, "Distrib queue exception saving notice $notice->id: " .
+            $e->getMessage() . ' ' .
+            str_replace("\n", " ", $e->getTraceAsString()));
 
-        return true;
+        // We'll still return true so we don't get stuck in a loop
+        // trying to run a bad insert over and over...
     }
 }