RSS for forums now checks the new posts against the file modification date,
[moodle.git] / mod / forum / rsslib.php
index 3553aac..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, 
                                              u.firstname userfirstname,
                                              u.lastname userlastname,
                                              p.message postmessage,
-                                             p.created postcreated
+                                             p.created postcreated,
+                                             p.format postformat
                                       FROM {$CFG->prefix}forum_discussions d,
                                            {$CFG->prefix}forum_posts p,
                                            {$CFG->prefix}user u
                                       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;
                 $item->author = fullname($user);
                 $item->pubdate = $rec->postcreated;
                 $item->link = $CFG->wwwroot."/mod/forum/discuss.php?d=".$rec->discussionid;
-                $item->description = $rec->postmessage;
+                $item->description = format_text($rec->postmessage,$rec->postformat,NULL,$forum->course);
                 $items[] = $item;
                 $articlesleft--;
                 if ($articlesleft < 1) {
     
     //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,
-                                             d.name discussionname,
                                              u.id userid,
                                              u.firstname userfirstname,
                                              u.lastname userlastname,
+                                             p.subject postsubject,
                                              p.message postmessage,
-                                             p.created postcreated
+                                             p.created postcreated,
+                                             p.format postformat
                                       FROM {$CFG->prefix}forum_discussions d,
                                            {$CFG->prefix}forum_posts p,
                                            {$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;
             foreach ($recs as $rec) {
                 unset($item);
                 unset($user);
-                $item->title = $rec->discussionname;
+                $item->title = $rec->postsubject;
                 $user->firstname = $rec->userfirstname;
                 $user->lastname = $rec->userlastname;
                 $item->author = fullname($user);
                 $item->pubdate = $rec->postcreated;
                 $item->link = $CFG->wwwroot."/mod/forum/discuss.php?d=".$rec->discussionid."&parent=".$rec->postid;
-                $item->description = $rec->postmessage;
+                $item->description = format_text($rec->postmessage,$rec->postformat,NULL,$forum->course);
                 $items[] = $item;
                 $articlesleft--;
                 if ($articlesleft < 1) {