Example #1
0
/**
 * Function to be run periodically according to the moodle cron
 * Finds all posts that have yet to be mailed out, and mails them
 * out to all subscribers
 *
 * @global object
 * @global object
 * @global object
 * @uses CONTEXT_MODULE
 * @uses CONTEXT_COURSE
 * @uses SITEID
 * @uses FORMAT_PLAIN
 * @return void
 */
function anonforum_cron()
{
    global $CFG, $USER, $DB;
    $site = get_site();
    // All users that are subscribed to any post that needs sending,
    // please increase $CFG->extramemorylimit on large sites that
    // send notifications to a large number of users.
    $users = array();
    $userscount = 0;
    // Cached user counter - count($users) in PHP is horribly slow!!!
    // status arrays
    $mailcount = array();
    $errorcount = array();
    // caches
    $discussions = array();
    $anonforums = array();
    $courses = array();
    $coursemodules = array();
    $subscribedusers = array();
    // Posts older than 2 days will not be mailed.  This is to avoid the problem where
    // cron has not been running for a long time, and then suddenly people are flooded
    // with mail from the past few weeks or months
    $timenow = time();
    $endtime = $timenow - $CFG->maxeditingtime;
    $starttime = $endtime - 48 * 3600;
    // Two days earlier
    // Get the list of anonforum subscriptions for per-user per-anonymous forum maildigest settings.
    $digestsset = $DB->get_recordset('anonforum_digests', null, '', 'id, userid, anonforum, maildigest');
    $digests = array();
    foreach ($digestsset as $thisrow) {
        if (!isset($digests[$thisrow->anonforum])) {
            $digests[$thisrow->anonforum] = array();
        }
        $digests[$thisrow->anonforum][$thisrow->userid] = $thisrow->maildigest;
    }
    $digestsset->close();
    if ($posts = anonforum_get_unmailed_posts($starttime, $endtime, $timenow)) {
        // Mark them all now as being mailed.  It's unlikely but possible there
        // might be an error later so that a post is NOT actually mailed out,
        // but since mail isn't crucial, we can accept this risk.  Doing it now
        // prevents the risk of duplicated mails, which is a worse problem.
        if (!anonforum_mark_old_posts_as_mailed($endtime)) {
            mtrace('Errors occurred while trying to mark some posts as being mailed.');
            return false;
            // Don't continue trying to mail them, in case we are in a cron loop
        }
        // checking post validity, and adding users to loop through later
        foreach ($posts as $pid => $post) {
            $discussionid = $post->discussion;
            if (!isset($discussions[$discussionid])) {
                if ($discussion = $DB->get_record('anonforum_discussions', array('id' => $post->discussion))) {
                    $discussions[$discussionid] = $discussion;
                } else {
                    mtrace('Could not find discussion ' . $discussionid);
                    unset($posts[$pid]);
                    continue;
                }
            }
            $anonforumid = $discussions[$discussionid]->anonforum;
            if (!isset($anonforums[$anonforumid])) {
                if ($anonforum = $DB->get_record('anonforum', array('id' => $anonforumid))) {
                    $anonforums[$anonforumid] = $anonforum;
                } else {
                    mtrace('Could not find anonforum ' . $anonforumid);
                    unset($posts[$pid]);
                    continue;
                }
            }
            $courseid = $anonforums[$anonforumid]->course;
            if (!isset($courses[$courseid])) {
                if ($course = $DB->get_record('course', array('id' => $courseid))) {
                    $courses[$courseid] = $course;
                } else {
                    mtrace('Could not find course ' . $courseid);
                    unset($posts[$pid]);
                    continue;
                }
            }
            if (!isset($coursemodules[$anonforumid])) {
                if ($cm = get_coursemodule_from_instance('anonforum', $anonforumid, $courseid)) {
                    $coursemodules[$anonforumid] = $cm;
                } else {
                    mtrace('Could not find course module for anonforum ' . $anonforumid);
                    unset($posts[$pid]);
                    continue;
                }
            }
            // caching subscribed users of each anonymous forum
            if (!isset($subscribedusers[$anonforumid])) {
                $modcontext = context_module::instance($coursemodules[$anonforumid]->id);
                if ($subusers = anonforum_subscribed_users($courses[$courseid], $anonforums[$anonforumid], 0, $modcontext, "u.*")) {
                    foreach ($subusers as $postuser) {
                        // this user is subscribed to this anonymous forum
                        $subscribedusers[$anonforumid][$postuser->id] = $postuser->id;
                        $userscount++;
                        if ($userscount > ANONFORUM_CRON_USER_CACHE) {
                            // Store minimal user info.
                            $minuser = new stdClass();
                            $minuser->id = $postuser->id;
                            $users[$postuser->id] = $minuser;
                        } else {
                            // Cache full user record.
                            anonforum_cron_minimise_user_record($postuser);
                            $users[$postuser->id] = $postuser;
                        }
                    }
                    // Release memory.
                    unset($subusers);
                    unset($postuser);
                }
            }
            $mailcount[$pid] = 0;
            $errorcount[$pid] = 0;
        }
    }
    if ($users && $posts) {
        $urlinfo = parse_url($CFG->wwwroot);
        $hostname = $urlinfo['host'];
        foreach ($users as $userto) {
            @set_time_limit(120);
            // terminate if processing of any account takes longer than 2 minutes
            mtrace('Processing user ' . $userto->id);
            // Init user caches - we keep the cache for one cycle only,
            // otherwise it could consume too much memory.
            if (isset($userto->username)) {
                $userto = clone $userto;
            } else {
                $userto = $DB->get_record('user', array('id' => $userto->id));
                anonforum_cron_minimise_user_record($userto);
            }
            $userto->viewfullnames = array();
            $userto->canpost = array();
            $userto->markposts = array();
            // set this so that the capabilities are cached, and environment matches receiving user
            cron_setup_user($userto);
            // reset the caches
            foreach ($coursemodules as $anonforumid => $unused) {
                $coursemodules[$anonforumid]->cache = new stdClass();
                $coursemodules[$anonforumid]->cache->caps = array();
                unset($coursemodules[$anonforumid]->uservisible);
            }
            foreach ($posts as $pid => $post) {
                // Set up the environment for the post, discussion, anonymous forum, course
                $discussion = $discussions[$post->discussion];
                $anonforum = $anonforums[$discussion->anonforum];
                $course = $courses[$anonforum->course];
                $cm =& $coursemodules[$anonforum->id];
                // Do some checks  to see if we can bail out now
                // Only active enrolled users are in the list of subscribers
                if (!isset($subscribedusers[$anonforum->id][$userto->id])) {
                    continue;
                    // user does not subscribe to this anonymous forum
                }
                // Don't send email if the anonymous forum is Q&A and the user has not posted
                // Initial topics are still mailed
                if ($anonforum->type == 'qanda' && !anonforum_get_user_posted_time($discussion->id, $userto->id) && $pid != $discussion->firstpost) {
                    mtrace('Did not email ' . $userto->id . ' because user has not posted in discussion');
                    continue;
                }
                // Get info about the sending user
                if (array_key_exists($post->userid, $users)) {
                    // we might know him/her already
                    $userfrom = $users[$post->userid];
                    if (!isset($userfrom->idnumber)) {
                        // Minimalised user info, fetch full record.
                        $userfrom = $DB->get_record('user', array('id' => $userfrom->id));
                        anonforum_cron_minimise_user_record($userfrom);
                    }
                } else {
                    if ($userfrom = $DB->get_record('user', array('id' => $post->userid))) {
                        anonforum_cron_minimise_user_record($userfrom);
                        // Fetch only once if possible, we can add it to user list, it will be skipped anyway.
                        if ($userscount <= ANONFORUM_CRON_USER_CACHE) {
                            $userscount++;
                            $users[$userfrom->id] = $userfrom;
                        }
                    } else {
                        mtrace('Could not find user ' . $post->userid);
                        continue;
                    }
                }
                //if we want to check that userto and userfrom are not the same person this is probably the spot to do it
                // setup global $COURSE properly - needed for roles and languages
                cron_setup_user($userto, $course);
                // Fill caches
                if (!isset($userto->viewfullnames[$anonforum->id])) {
                    $modcontext = context_module::instance($cm->id);
                    $userto->viewfullnames[$anonforum->id] = has_capability('moodle/site:viewfullnames', $modcontext);
                }
                if (!isset($userto->canpost[$discussion->id])) {
                    $modcontext = context_module::instance($cm->id);
                    $userto->canpost[$discussion->id] = anonforum_user_can_post($anonforum, $discussion, $userto, $cm, $course, $modcontext);
                }
                if (!isset($userfrom->groups[$anonforum->id])) {
                    if (!isset($userfrom->groups)) {
                        $userfrom->groups = array();
                        if (isset($users[$userfrom->id])) {
                            $users[$userfrom->id]->groups = array();
                        }
                    }
                    $userfrom->groups[$anonforum->id] = groups_get_all_groups($course->id, $userfrom->id, $cm->groupingid);
                    if (isset($users[$userfrom->id])) {
                        $users[$userfrom->id]->groups[$anonforum->id] = $userfrom->groups[$anonforum->id];
                    }
                }
                // Make sure groups allow this user to see this email
                if ($discussion->groupid > 0 and $groupmode = groups_get_activity_groupmode($cm, $course)) {
                    // Groups are being used
                    if (!groups_group_exists($discussion->groupid)) {
                        // Can't find group
                        continue;
                        // Be safe and don't send it to anyone
                    }
                    if (!groups_is_member($discussion->groupid) and !has_capability('moodle/site:accessallgroups', $modcontext)) {
                        // do not send posts from other groups when in SEPARATEGROUPS or VISIBLEGROUPS
                        continue;
                    }
                }
                // Make sure we're allowed to see it...
                if (!anonforum_user_can_see_post($anonforum, $discussion, $post, NULL, $cm)) {
                    mtrace('user ' . $userto->id . ' can not see ' . $post->id);
                    continue;
                }
                // OK so we need to send the email.
                // Does the user want this post in a digest?  If so postpone it for now.
                $maildigest = anonforum_get_user_maildigest_bulk($digests, $userto, $anonforum->id);
                if ($maildigest > 0) {
                    // This user wants the mails to be in digest form
                    $queue = new stdClass();
                    $queue->userid = $userto->id;
                    $queue->discussionid = $discussion->id;
                    $queue->postid = $post->id;
                    $queue->timemodified = $post->created;
                    $DB->insert_record('anonforum_queue', $queue);
                    continue;
                }
                // Prepare to actually send the post now, and build up the content
                $cleanforumname = str_replace('"', "'", strip_tags(format_string($anonforum->name)));
                $userfrom->customheaders = array('Precedence: Bulk', 'List-Id: "' . $cleanforumname . '" <moodleanonforum' . $anonforum->id . '@' . $hostname . '>', 'List-Help: ' . $CFG->wwwroot . '/mod/anonforum/view.php?f=' . $anonforum->id, 'Message-ID: ' . anonforum_get_email_message_id($post->id, $userto->id, $hostname), 'X-Course-Id: ' . $course->id, 'X-Course-Name: ' . format_string($course->fullname, true));
                if ($post->parent) {
                    // This post is a reply, so add headers for threading (see MDL-22551)
                    $userfrom->customheaders[] = 'In-Reply-To: ' . anonforum_get_email_message_id($post->parent, $userto->id, $hostname);
                    $userfrom->customheaders[] = 'References: ' . anonforum_get_email_message_id($post->parent, $userto->id, $hostname);
                }
                $shortname = format_string($course->shortname, true, array('context' => context_course::instance($course->id)));
                $postsubject = html_to_text("{$shortname}: " . format_string($post->subject, true));
                $posttext = anonforum_make_mail_text($course, $cm, $anonforum, $discussion, $post, $userfrom, $userto);
                $posthtml = anonforum_make_mail_html($course, $cm, $anonforum, $discussion, $post, $userfrom, $userto);
                // Send the post now!
                mtrace('Sending ', '');
                $eventdata = new stdClass();
                $eventdata->component = 'mod_anonforum';
                $eventdata->name = 'posts';
                $eventdata->userfrom = $userfrom;
                $eventdata->userto = $userto;
                $eventdata->subject = $postsubject;
                $eventdata->fullmessage = $posttext;
                $eventdata->fullmessageformat = FORMAT_PLAIN;
                $eventdata->fullmessagehtml = $posthtml;
                $eventdata->notification = 1;
                // If anonymous forum_replytouser is not set then send mail using the noreplyaddress.
                // If the post is anonymous then use the no reply address
                if (empty($CFG->anonforum_replytouser)) {
                    // Clone userfrom as it is referenced by $users.
                    $cloneduserfrom = clone $userfrom;
                    $cloneduserfrom->email = $CFG->noreplyaddress;
                    $eventdata->userfrom = $cloneduserfrom;
                }
                if (!empty($post->anonymouspost)) {
                    // Clone userfrom as it is referenced by $users.
                    $cloneduserfrom = clone $userfrom;
                    $cloneduserfrom->email = $CFG->noreplyaddress;
                    $cloneduserfrom->firstname = get_string('anonymoususer', 'anonforum');
                    $cloneduserfrom->lastname = '';
                    $eventdata->userfrom = $cloneduserfrom;
                }
                $smallmessagestrings = new stdClass();
                $smallmessagestrings->user = empty($post->anonymouspost) ? fullname($userfrom) : get_string('anonymoususer', 'anonforum');
                $smallmessagestrings->anonforumname = "{$shortname}: " . format_string($anonforum->name, true) . ": " . $discussion->name;
                $smallmessagestrings->message = $post->message;
                //make sure strings are in message recipients language
                $eventdata->smallmessage = get_string_manager()->get_string('smallmessage', 'anonforum', $smallmessagestrings, $userto->lang);
                $eventdata->contexturl = "{$CFG->wwwroot}/mod/anonforum/discuss.php?d={$discussion->id}#p{$post->id}";
                $eventdata->contexturlname = $discussion->name;
                $mailresult = message_send($eventdata);
                if (!$mailresult) {
                    mtrace("Error: mod/anonforum/lib.php anonforum_cron(): Could not send out mail for id {$post->id} to user {$userto->id}" . " ({$userto->email}) .. not trying again.");
                    $errorcount[$post->id]++;
                } else {
                    $mailcount[$post->id]++;
                    // Mark post as read if anonymous forum_usermarksread is set off
                    if (!$CFG->anonforum_usermarksread) {
                        $userto->markposts[$post->id] = $post->id;
                    }
                }
                mtrace('post ' . $post->id . ': ' . $post->subject);
            }
            // mark processed posts as read
            anonforum_tp_mark_posts_read($userto, $userto->markposts);
            unset($userto);
        }
    }
    if ($posts) {
        foreach ($posts as $post) {
            mtrace($mailcount[$post->id] . " users were sent post {$post->id}, '{$post->subject}'");
            if ($errorcount[$post->id]) {
                $DB->set_field('anonforum_posts', 'mailed', ANONFORUM_MAILED_ERROR, array('id' => $post->id));
            }
        }
    }
    // release some memory
    unset($subscribedusers);
    unset($mailcount);
    unset($errorcount);
    cron_setup_user();
    $sitetimezone = $CFG->timezone;
    // Now see if there are any digest mails waiting to be sent, and if we should send them
    mtrace('Starting digest processing...');
    @set_time_limit(300);
    // terminate if not able to fetch all digests in 5 minutes
    if (!isset($CFG->digestmailtimelast)) {
        // To catch the first time
        set_config('digestmailtimelast', 0);
    }
    $timenow = time();
    $digesttime = usergetmidnight($timenow, $sitetimezone) + $CFG->digestmailtime * 3600;
    // Delete any really old ones (normally there shouldn't be any)
    $weekago = $timenow - 7 * 24 * 3600;
    $DB->delete_records_select('anonforum_queue', "timemodified < ?", array($weekago));
    mtrace('Cleaned old digest records');
    if ($CFG->digestmailtimelast < $digesttime and $timenow > $digesttime) {
        mtrace('Sending anonforum digests: ' . userdate($timenow, '', $sitetimezone));
        $digestposts_rs = $DB->get_recordset_select('anonforum_queue', "timemodified < ?", array($digesttime));
        if ($digestposts_rs->valid()) {
            // We have work to do
            $usermailcount = 0;
            //caches - reuse the those filled before too
            $discussionposts = array();
            $userdiscussions = array();
            foreach ($digestposts_rs as $digestpost) {
                if (!isset($posts[$digestpost->postid])) {
                    if ($post = $DB->get_record('anonforum_posts', array('id' => $digestpost->postid))) {
                        $posts[$digestpost->postid] = $post;
                    } else {
                        continue;
                    }
                }
                $discussionid = $digestpost->discussionid;
                if (!isset($discussions[$discussionid])) {
                    if ($discussion = $DB->get_record('anonforum_discussions', array('id' => $discussionid))) {
                        $discussions[$discussionid] = $discussion;
                    } else {
                        continue;
                    }
                }
                $anonforumid = $discussions[$discussionid]->anonforum;
                if (!isset($anonforums[$anonforumid])) {
                    if ($anonforum = $DB->get_record('anonforum', array('id' => $anonforumid))) {
                        $anonforums[$anonforumid] = $anonforum;
                    } else {
                        continue;
                    }
                }
                $courseid = $anonforums[$anonforumid]->course;
                if (!isset($courses[$courseid])) {
                    if ($course = $DB->get_record('course', array('id' => $courseid))) {
                        $courses[$courseid] = $course;
                    } else {
                        continue;
                    }
                }
                if (!isset($coursemodules[$anonforumid])) {
                    if ($cm = get_coursemodule_from_instance('anonforum', $anonforumid, $courseid)) {
                        $coursemodules[$anonforumid] = $cm;
                    } else {
                        continue;
                    }
                }
                $userdiscussions[$digestpost->userid][$digestpost->discussionid] = $digestpost->discussionid;
                $discussionposts[$digestpost->discussionid][$digestpost->postid] = $digestpost->postid;
            }
            $digestposts_rs->close();
            /// Finished iteration, let's close the resultset
            // Data collected, start sending out emails to each user
            foreach ($userdiscussions as $userid => $thesediscussions) {
                @set_time_limit(120);
                // terminate if processing of any account takes longer than 2 minutes
                cron_setup_user();
                mtrace(get_string('processingdigest', 'anonforum', $userid), '... ');
                // First of all delete all the queue entries for this user
                $DB->delete_records_select('anonforum_queue', "userid = ? AND timemodified < ?", array($userid, $digesttime));
                // Init user caches - we keep the cache for one cycle only,
                // otherwise it would unnecessarily consume memory.
                if (array_key_exists($userid, $users) and isset($users[$userid]->username)) {
                    $userto = clone $users[$userid];
                } else {
                    $userto = $DB->get_record('user', array('id' => $userid));
                    anonforum_cron_minimise_user_record($userto);
                }
                $userto->viewfullnames = array();
                $userto->canpost = array();
                $userto->markposts = array();
                // Override the language and timezone of the "current" user, so that
                // mail is customised for the receiver.
                cron_setup_user($userto);
                $postsubject = get_string('digestmailsubject', 'anonforum', format_string($site->shortname, true));
                $headerdata = new stdClass();
                $headerdata->sitename = format_string($site->fullname, true);
                $headerdata->userprefs = $CFG->wwwroot . '/user/edit.php?id=' . $userid . '&amp;course=' . $site->id;
                $posttext = get_string('digestmailheader', 'anonforum', $headerdata) . "\n\n";
                $headerdata->userprefs = '<a target="_blank" href="' . $headerdata->userprefs . '">' . get_string('digestmailprefs', 'anonforum') . '</a>';
                $posthtml = "<head>";
                /*                foreach ($CFG->stylesheets as $stylesheet) {
                                    //TODO: MDL-21120
                                    $posthtml .= '<link rel="stylesheet" type="text/css" href="'.$stylesheet.'" />'."\n";
                                }*/
                $posthtml .= "</head>\n<body id=\"email\">\n";
                $posthtml .= '<p>' . get_string('digestmailheader', 'anonforum', $headerdata) . '</p><br /><hr size="1" noshade="noshade" />';
                foreach ($thesediscussions as $discussionid) {
                    @set_time_limit(120);
                    // to be reset for each post
                    $discussion = $discussions[$discussionid];
                    $anonforum = $anonforums[$discussion->anonforum];
                    $course = $courses[$anonforum->course];
                    $cm = $coursemodules[$anonforum->id];
                    //override language
                    cron_setup_user($userto, $course);
                    // Fill caches
                    if (!isset($userto->viewfullnames[$anonforum->id])) {
                        $modcontext = context_module::instance($cm->id);
                        $userto->viewfullnames[$anonforum->id] = has_capability('moodle/site:viewfullnames', $modcontext);
                    }
                    if (!isset($userto->canpost[$discussion->id])) {
                        $modcontext = context_module::instance($cm->id);
                        $userto->canpost[$discussion->id] = anonforum_user_can_post($anonforum, $discussion, $userto, $cm, $course, $modcontext);
                    }
                    $stranonforums = get_string('anonforums', 'anonforum');
                    $canunsubscribe = !anonforum_is_forcesubscribed($anonforum);
                    $canreply = $userto->canpost[$discussion->id];
                    $shortname = format_string($course->shortname, true, array('context' => context_course::instance($course->id)));
                    $posttext .= "\n \n";
                    $posttext .= '=====================================================================';
                    $posttext .= "\n \n";
                    $posttext .= "{$shortname} -> {$stranonforums} -> " . format_string($anonforum->name, true);
                    if ($discussion->name != $anonforum->name) {
                        $posttext .= " -> " . format_string($discussion->name, true);
                    }
                    $posttext .= "\n";
                    $posttext .= $CFG->wwwroot . '/mod/anonforum/discuss.php?d=' . $discussion->id;
                    $posttext .= "\n";
                    $posthtml .= "<p><font face=\"sans-serif\">" . "<a target=\"_blank\" href=\"{$CFG->wwwroot}/course/view.php?id={$course->id}\">{$shortname}</a> -> " . "<a target=\"_blank\" href=\"{$CFG->wwwroot}/mod/anonforum/index.php?id={$course->id}\">{$stranonforums}</a> -> " . "<a target=\"_blank\" href=\"{$CFG->wwwroot}/mod/anonforum/view.php?f={$anonforum->id}\">" . format_string($anonforum->name, true) . "</a>";
                    if ($discussion->name == $anonforum->name) {
                        $posthtml .= "</font></p>";
                    } else {
                        $posthtml .= " -> <a target=\"_blank\" href=\"{$CFG->wwwroot}/mod/anonforum/discuss.php?d={$discussion->id}\">" . format_string($discussion->name, true) . "</a></font></p>";
                    }
                    $posthtml .= '<p>';
                    $postsarray = $discussionposts[$discussionid];
                    sort($postsarray);
                    foreach ($postsarray as $postid) {
                        $post = $posts[$postid];
                        if (array_key_exists($post->userid, $users)) {
                            // we might know him/her already
                            $userfrom = $users[$post->userid];
                            if (!isset($userfrom->idnumber)) {
                                $userfrom = $DB->get_record('user', array('id' => $userfrom->id));
                                anonforum_cron_minimise_user_record($userfrom);
                            }
                        } else {
                            if ($userfrom = $DB->get_record('user', array('id' => $post->userid))) {
                                anonforum_cron_minimise_user_record($userfrom);
                                if ($userscount <= ANONFORUM_CRON_USER_CACHE) {
                                    $userscount++;
                                    $users[$userfrom->id] = $userfrom;
                                }
                            } else {
                                mtrace('Could not find user ' . $post->userid);
                                continue;
                            }
                        }
                        if (!isset($userfrom->groups[$anonforum->id])) {
                            if (!isset($userfrom->groups)) {
                                $userfrom->groups = array();
                                if (isset($users[$userfrom->id])) {
                                    $users[$userfrom->id]->groups = array();
                                }
                            }
                            $userfrom->groups[$anonforum->id] = groups_get_all_groups($course->id, $userfrom->id, $cm->groupingid);
                            if (isset($users[$userfrom->id])) {
                                $users[$userfrom->id]->groups[$anonforum->id] = $userfrom->groups[$anonforum->id];
                            }
                        }
                        $userfrom->customheaders = array("Precedence: Bulk");
                        $maildigest = anonforum_get_user_maildigest_bulk($digests, $userto, $anonforum->id);
                        if ($maildigest == 2) {
                            // Subjects and link only
                            $posttext .= "\n";
                            $posttext .= $CFG->wwwroot . '/mod/anonforum/discuss.php?d=' . $discussion->id;
                            $by = new stdClass();
                            $by->date = userdate($post->modified);
                            if (empty($post->anonymouspost)) {
                                $by->name = "<a target=\"_blank\" href=\"{$CFG->wwwroot}/user/view.php?id={$userfrom->id}&amp;course={$course->id}\">fullname({$userfrom});</a>";
                            } else {
                                $by->name = get_string('anonymoususer', 'anonforum');
                            }
                            $posttext .= "\n" . format_string($post->subject, true) . ' ' . get_string("bynameondate", "anonforum", $by);
                            $posttext .= "\n---------------------------------------------------------------------";
                            $posthtml .= '<div><a target="_blank" href="' . $CFG->wwwroot . '/mod/anonforum/discuss.php?d=' . $discussion->id . '#p' . $post->id . '">' . format_string($post->subject, true) . '</a> ' . get_string("bynameondate", "anonforum", $by) . '</div>';
                        } else {
                            // The full treatment
                            $posttext .= anonforum_make_mail_text($course, $cm, $anonforum, $discussion, $post, $userfrom, $userto, true);
                            $posthtml .= anonforum_make_mail_post($course, $cm, $anonforum, $discussion, $post, $userfrom, $userto, false, $canreply, true, false);
                            // Create an array of postid's for this user to mark as read.
                            if (!$CFG->anonforum_usermarksread) {
                                $userto->markposts[$post->id] = $post->id;
                            }
                        }
                    }
                    $footerlinks = array();
                    if ($canunsubscribe) {
                        $footerlinks[] = "<a href=\"{$CFG->wwwroot}/mod/anonforum/subscribe.php?id={$anonforum->id}\">" . get_string("unsubscribe", "anonforum") . "</a>";
                    } else {
                        $footerlinks[] = get_string("everyoneissubscribed", "anonforum");
                    }
                    $footerlinks[] = "<a href='{$CFG->wwwroot}/mod/anonforum/index.php?id={$anonforum->course}'>" . get_string("digestmailpost", "anonforum") . '</a>';
                    $posthtml .= "\n<div class='mdl-right'><font size=\"1\">" . implode('&nbsp;', $footerlinks) . '</font></div>';
                    $posthtml .= '<hr size="1" noshade="noshade" /></p>';
                }
                $posthtml .= '</body>';
                if (empty($userto->mailformat) || $userto->mailformat != 1) {
                    // This user DOESN'T want to receive HTML
                    $posthtml = '';
                }
                $attachment = $attachname = '';
                // Directly email anonymous forum digests rather than sending them via messaging, use the
                // site shortname as 'from name', the noreply address will be used by email_to_user.
                $mailresult = email_to_user($userto, $site->shortname, $postsubject, $posttext, $posthtml, $attachment, $attachname);
                if (!$mailresult) {
                    mtrace("ERROR!");
                    echo "Error: mod/anonforum/cron.php: Could not send out digest mail to user {$userto->id} ({$userto->email})... not trying again.\n";
                } else {
                    mtrace("success.");
                    $usermailcount++;
                    // Mark post as read if anonymous forum_usermarksread is set off
                    anonforum_tp_mark_posts_read($userto, $userto->markposts);
                }
            }
        }
        /// We have finishied all digest emails, update $CFG->digestmailtimelast
        set_config('digestmailtimelast', $timenow);
    }
    cron_setup_user();
    if (!empty($usermailcount)) {
        mtrace(get_string('digestsentusers', 'anonforum', $usermailcount));
    }
    if (!empty($CFG->anonforum_lastreadclean)) {
        $timenow = time();
        if ($CFG->anonforum_lastreadclean + 24 * 3600 < $timenow) {
            set_config('anonforum_lastreadclean', $timenow);
            mtrace('Removing old anonforum read tracking info...');
            anonforum_tp_clean_read_records();
        }
    } else {
        set_config('anonforum_lastreadclean', time());
    }
    return true;
}
}
$strsubscribers = get_string("subscribers", "anonforum");
$PAGE->navbar->add($strsubscribers);
$PAGE->set_title($strsubscribers);
$PAGE->set_heading($COURSE->fullname);
if (has_capability('mod/anonforum:managesubscriptions', $context)) {
    $PAGE->set_button(anonforum_update_subscriptions_button($course->id, $id));
    if ($edit != -1) {
        $USER->subscriptionsediting = $edit;
    }
} else {
    unset($USER->subscriptionsediting);
}
echo $OUTPUT->header();
echo $OUTPUT->heading(get_string('anonforum', 'anonforum') . ' ' . $strsubscribers);
// If the anonymous forum is anonymous we should never show the subscribers as such information could identify users.
if (!empty($anonforum->anonymous)) {
    echo $anonforumoutput->subscribed_anonymous();
} else {
    if (empty($USER->subscriptionsediting)) {
        echo $anonforumoutput->subscriber_overview(anonforum_subscribed_users($course, $anonforum, $currentgroup, $context), $anonforum, $course);
    } else {
        if (anonforum_is_forcesubscribed($anonforum)) {
            $subscriberselector->set_force_subscribed(true);
            echo $anonforumoutput->subscribed_users($subscriberselector);
        } else {
            echo $anonforumoutput->subscriber_selection_form($existingselector, $subscriberselector);
        }
    }
}
echo $OUTPUT->footer();