RSS for forums now checks the new posts against the file modification date,
[moodle.git] / mod / forum / rsslib.php
index fd4bc4b..d17fd85 100644 (file)
             if ($forums = get_records("forum")) {
                 foreach ($forums as $forum) {
                     if (!empty($forum->rsstype) && !empty($forum->rssarticles) && $status) {
+
+                        $filename = rss_file_name('forum', $forum);  // RSS file
+
+                        //First let's make sure there is work to do by checking existing files
+                        if (file_exists($filename)) {
+                            if ($lastmodified = filemtime($filename)) {
+                                if (!forum_rss_newstuff($forum, $lastmodified)) {
+                                    continue;
+                                }
+                            }
+                        }
+
+                        //Ignore hidden forums
+                        if (!instance_is_visible('forum',$forum)) {
+                            if (file_exists($filename)) {
+                                @unlink($filename);
+                            }
+                            continue;
+                        }
+
+                        mtrace("Updating RSS feed for $forum->name, ID: $forum->id");
+
                         //Some debug...
                         if ($CFG->debug > 7) {
                             echo "ID: $forum->id->";
         return $status;
     }
 
+    function forum_rss_newstuff($forum, $time) {
+    // If there is new stuff in the forum since $time then this returns
+    // true.  Otherwise it returns false.
+        if ($forum->rsstype == 1) {  
+            $items = forum_rss_feed_discussions($forum, $time);
+        } else {             
+            $items = forum_rss_feed_posts($forum, $time);
+        }
+        return (!empty($items));
+    }
+
     //This function return the XML rss contents about the forum record passed as parameter
     //It returns false if something is wrong
     function forum_rss_feed($forum) {
 
     //This function returns "items" record array to be used to build the rss feed
     //for a Type=discussions forum
-    function forum_rss_feed_discussions($forum) {
+    function forum_rss_feed_discussions($forum, $newsince=0) {
 
         global $CFG;
 
         $items = array();
 
+        if ($newsince) {
+            $newsince = " AND p.created > '$newsince'";
+        } else {
+            $newsince = "";
+        }
+
         if ($recs = get_records_sql ("SELECT d.id discussionid, 
                                              d.name discussionname, 
                                              u.id userid, 
                                       WHERE d.forum = '$forum->id' AND
                                             p.discussion = d.id AND
                                             p.parent = 0 AND
-                                            u.id = p.userid
+                                            u.id = p.userid $newsince
                                       ORDER BY p.created desc")) {
+
+            //Are we just looking for new ones?  If so, then return now.
+            if ($newsince) {
+                return true;
+            }
+
             //Iterate over each discussion to get forum->rssarticles records
             $articlesleft = $forum->rssarticles;
             $item = NULL;
     
     //This function returns "items" record array to be used to build the rss feed
     //for a Type=posts forum
-    function forum_rss_feed_posts($forum) {
+    function forum_rss_feed_posts($forum, $newsince=0) {
 
         global $CFG;
 
         $items = array();
 
+        if ($newsince) {
+            $newsince = " AND p.created > '$newsince'";
+        } else {
+            $newsince = "";
+        }
+
         if ($recs = get_records_sql ("SELECT p.id postid,
                                              d.id discussionid,
                                              u.id userid,
                                            {$CFG->prefix}user u
                                       WHERE d.forum = '$forum->id' AND
                                             p.discussion = d.id AND
-                                            u.id = p.userid
+                                            u.id = p.userid $newsince
                                       ORDER BY p.created desc")) {
+
+            //Are we just looking for new ones?  If so, then return now.
+            if ($newsince) {
+                return true;
+            }
+
             //Iterate over each discussion to get forum->rssarticles records
             $articlesleft = $forum->rssarticles;
             $item = NULL;