/**
  * Get the users subscribed to the discussion
  *
  * @param stdClass $forum
  * @param stdClass $discussion
  * @param context_module $context
  * @param int $groupid
  * @param null|string $fields
  * @param array $search
  * @param string $sort
  * @return array
  */
 public function get_subscribed_users($forum, $discussion, context_module $context, $groupid = 0, $fields = null, array $search = array(), $sort = 'u.lastname ASC, u.firstname ASC')
 {
     global $CFG;
     if ($forum->forcesubscribe == HSUFORUM_DISALLOWSUBSCRIBE or $forum->type == 'single' or hsuforum_is_forcesubscribed($forum)) {
         return array();
     }
     if (is_null($fields)) {
         $fields = "u.id,\n                      u.alternatename,\n                      u.username,\n                      u.firstname,\n                      u.firstnamephonetic,\n                      u.lastname,\n                      u.lastnamephonetic,\n                      u.maildisplay,\n                      u.mailformat,\n                      u.maildigest,\n                      u.middlename,\n                      u.imagealt,\n                      u.email,\n                      u.emailstop,\n                      u.city,\n                      u.country,\n                      u.lastaccess,\n                      u.lastlogin,\n                      u.picture,\n                      u.timezone,\n                      u.theme,\n                      u.lang,\n                      u.trackforums,\n                      u.mnethostid";
     }
     list($esql, $params) = get_enrolled_sql($context, '', $groupid, true);
     $params['discussionid'] = $discussion->id;
     $where = '';
     if (!empty($search)) {
         $where .= ' AND ' . $search[0];
         $params = array_merge($params, $search[1]);
     }
     $results = $this->get_db()->get_records_sql("\n            SELECT {$fields}\n              FROM {user} u\n              JOIN ({$esql}) je ON je.id = u.id\n              JOIN {hsuforum_subscriptions_disc} s ON s.userid = u.id\n             WHERE s.discussion = :discussionid{$where}\n          ORDER BY {$sort}\n        ", $params);
     // Guest user should never be subscribed to a forum.
     unset($results[$CFG->siteguest]);
     return $results;
 }
 public function discsubscribers_action()
 {
     global $OUTPUT, $USER, $DB, $COURSE, $PAGE;
     require_once dirname(dirname(__DIR__)) . '/repository/discussion.php';
     require_once dirname(dirname(__DIR__)) . '/lib/userselector/discussion/existing.php';
     require_once dirname(dirname(__DIR__)) . '/lib/userselector/discussion/potential.php';
     $discussionid = required_param('discussionid', PARAM_INT);
     $edit = optional_param('edit', -1, PARAM_BOOL);
     // Turn editing on and off.
     $url = $PAGE->url;
     $url->param('discussionid', $discussionid);
     if ($edit !== 0) {
         $url->param('edit', $edit);
     }
     $PAGE->set_url($url);
     $discussion = $DB->get_record('hsuforum_discussions', array('id' => $discussionid), '*', MUST_EXIST);
     $forum = $PAGE->activityrecord;
     $course = $COURSE;
     $cm = $PAGE->cm;
     $context = $PAGE->context;
     $repo = new \hsuforum_repository_discussion();
     if (hsuforum_is_forcesubscribed($forum)) {
         throw new coding_exception('Cannot manage discussion subscriptions when subscription is forced');
     }
     $currentgroup = groups_get_activity_group($cm);
     $options = array('forum' => $forum, 'discussion' => $discussion, 'currentgroup' => $currentgroup, 'context' => $context);
     $existingselector = new \hsuforum_userselector_discussion_existing('existingsubscribers', $options);
     $subscriberselector = new \hsuforum_userselector_discussion_potential('potentialsubscribers', $options);
     if (data_submitted()) {
         require_sesskey();
         $subscribe = (bool) optional_param('subscribe', false, PARAM_RAW);
         $unsubscribe = (bool) optional_param('unsubscribe', false, PARAM_RAW);
         /** It has to be one or the other, not both or neither */
         if (!($subscribe xor $unsubscribe)) {
             print_error('invalidaction');
         }
         if ($subscribe) {
             $users = $subscriberselector->get_selected_users();
             foreach ($users as $user) {
                 $repo->subscribe($discussion->id, $user->id);
             }
         } else {
             if ($unsubscribe) {
                 $users = $existingselector->get_selected_users();
                 foreach ($users as $user) {
                     $repo->unsubscribe($discussion->id, $user->id);
                 }
             }
         }
         $subscriberselector->invalidate_selected_users();
         $existingselector->invalidate_selected_users();
         redirect($PAGE->url);
     }
     $strsubscribers = get_string('discussionsubscribers', 'hsuforum');
     // This works but it doesn't make a good navbar, would have to change the settings menu.
     // $PAGE->settingsnav->find('discsubscribers', navigation_node::TYPE_SETTING)->make_active();
     $PAGE->navbar->add(shorten_text(format_string($discussion->name)), new moodle_url('/mod/hsuforum/discuss.php', array('d' => $discussion->id)));
     $PAGE->navbar->add($strsubscribers);
     $PAGE->set_title($strsubscribers);
     $PAGE->set_heading($COURSE->fullname);
     if (has_capability('mod/hsuforum:managesubscriptions', $context)) {
         if ($edit != -1) {
             $USER->subscriptionsediting = $edit;
         }
         if (!empty($USER->subscriptionsediting)) {
             $string = get_string('turneditingoff');
             $edit = "off";
         } else {
             $string = get_string('turneditingon');
             $edit = "on";
         }
         $url = $PAGE->url;
         $url->param('edit', $edit);
         $PAGE->set_button($OUTPUT->single_button($url, $string, 'get'));
     } else {
         unset($USER->subscriptionsediting);
     }
     $output = $OUTPUT->heading($strsubscribers);
     if (empty($USER->subscriptionsediting)) {
         $output .= $this->renderer->subscriber_overview($existingselector->get_repo()->get_subscribed_users($forum, $discussion, $context, $currentgroup), $discussion->name, $forum, $course);
     } else {
         $output .= $this->renderer->subscriber_selection_form($existingselector, $subscriberselector);
     }
     return $output;
 }
/**
 * Adds module specific settings to the settings block
 *
 * @param settings_navigation $settings The settings navigation object
 * @param navigation_node $forumnode The node to add module settings to
 */
function hsuforum_extend_settings_navigation(settings_navigation $settingsnav, navigation_node $forumnode)
{
    global $USER, $PAGE, $CFG, $DB;
    $config = get_config('hsuforum');
    $forumobject = $DB->get_record("hsuforum", array("id" => $PAGE->cm->instance));
    if (empty($PAGE->cm->context)) {
        $PAGE->cm->context = context_module::instance($PAGE->cm->instance);
    }
    // for some actions you need to be enrolled, beiing admin is not enough sometimes here
    $enrolled = is_enrolled($PAGE->cm->context, $USER, '', false);
    $activeenrolled = is_enrolled($PAGE->cm->context, $USER, '', true);
    $canmanage = has_capability('mod/hsuforum:managesubscriptions', $PAGE->cm->context);
    $subscriptionmode = hsuforum_get_forcesubscribed($forumobject);
    $cansubscribe = $activeenrolled && $subscriptionmode != HSUFORUM_FORCESUBSCRIBE && ($subscriptionmode != HSUFORUM_DISALLOWSUBSCRIBE || $canmanage);
    $discussionid = optional_param('d', 0, PARAM_INT);
    $viewingdiscussion = ($PAGE->url->compare(new moodle_url('/mod/hsuforum/discuss.php'), URL_MATCH_BASE) and $discussionid);
    if (!is_guest($PAGE->cm->context)) {
        $forumnode->add(get_string('export', 'hsuforum'), new moodle_url('/mod/hsuforum/route.php', array('contextid' => $PAGE->cm->context->id, 'action' => 'export')), navigation_node::TYPE_SETTING, null, null, new pix_icon('i/export', get_string('export', 'hsuforum')));
    }
    $forumnode->add(get_string('viewposters', 'hsuforum'), new moodle_url('/mod/hsuforum/route.php', array('contextid' => $PAGE->cm->context->id, 'action' => 'viewposters')), navigation_node::TYPE_SETTING, null, null, new pix_icon('t/preview', get_string('viewposters', 'hsuforum')));
    if ($canmanage) {
        $mode = $forumnode->add(get_string('subscriptionmode', 'hsuforum'), null, navigation_node::TYPE_CONTAINER);
        $allowchoice = $mode->add(get_string('subscriptionoptional', 'hsuforum'), new moodle_url('/mod/hsuforum/subscribe.php', array('id' => $forumobject->id, 'mode' => HSUFORUM_CHOOSESUBSCRIBE, 'sesskey' => sesskey())), navigation_node::TYPE_SETTING);
        $forceforever = $mode->add(get_string("subscriptionforced", "hsuforum"), new moodle_url('/mod/hsuforum/subscribe.php', array('id' => $forumobject->id, 'mode' => HSUFORUM_FORCESUBSCRIBE, 'sesskey' => sesskey())), navigation_node::TYPE_SETTING);
        $forceinitially = $mode->add(get_string("subscriptionauto", "hsuforum"), new moodle_url('/mod/hsuforum/subscribe.php', array('id' => $forumobject->id, 'mode' => HSUFORUM_INITIALSUBSCRIBE, 'sesskey' => sesskey())), navigation_node::TYPE_SETTING);
        $disallowchoice = $mode->add(get_string('subscriptiondisabled', 'hsuforum'), new moodle_url('/mod/hsuforum/subscribe.php', array('id' => $forumobject->id, 'mode' => HSUFORUM_DISALLOWSUBSCRIBE, 'sesskey' => sesskey())), navigation_node::TYPE_SETTING);
        switch ($subscriptionmode) {
            case HSUFORUM_CHOOSESUBSCRIBE:
                // 0
                $allowchoice->action = null;
                $allowchoice->add_class('activesetting');
                break;
            case HSUFORUM_FORCESUBSCRIBE:
                // 1
                $forceforever->action = null;
                $forceforever->add_class('activesetting');
                break;
            case HSUFORUM_INITIALSUBSCRIBE:
                // 2
                $forceinitially->action = null;
                $forceinitially->add_class('activesetting');
                break;
            case HSUFORUM_DISALLOWSUBSCRIBE:
                // 3
                $disallowchoice->action = null;
                $disallowchoice->add_class('activesetting');
                break;
        }
    } else {
        if ($activeenrolled) {
            switch ($subscriptionmode) {
                case HSUFORUM_CHOOSESUBSCRIBE:
                    // 0
                    $notenode = $forumnode->add(get_string('subscriptionoptional', 'hsuforum'));
                    break;
                case HSUFORUM_FORCESUBSCRIBE:
                    // 1
                    $notenode = $forumnode->add(get_string('subscriptionforced', 'hsuforum'));
                    break;
                case HSUFORUM_INITIALSUBSCRIBE:
                    // 2
                    $notenode = $forumnode->add(get_string('subscriptionauto', 'hsuforum'));
                    break;
                case HSUFORUM_DISALLOWSUBSCRIBE:
                    // 3
                    $notenode = $forumnode->add(get_string('subscriptiondisabled', 'hsuforum'));
                    break;
            }
        }
    }
    if ($cansubscribe) {
        if (hsuforum_is_subscribed($USER->id, $forumobject)) {
            $linktext = get_string('unsubscribe', 'hsuforum');
        } else {
            $linktext = get_string('subscribe', 'hsuforum');
        }
        $url = new moodle_url('/mod/hsuforum/subscribe.php', array('id' => $forumobject->id, 'sesskey' => sesskey()));
        $forumnode->add($linktext, $url, navigation_node::TYPE_SETTING);
    }
    if ($viewingdiscussion) {
        require_once __DIR__ . '/lib/discussion/subscribe.php';
        $subscribe = new hsuforum_lib_discussion_subscribe($forumobject, $PAGE->cm->context);
        if ($subscribe->can_subscribe()) {
            $subscribeurl = new moodle_url('/mod/hsuforum/route.php', array('contextid' => $PAGE->cm->context->id, 'action' => 'subscribedisc', 'discussionid' => $discussionid, 'sesskey' => sesskey(), 'returnurl' => $PAGE->url));
            if ($subscribe->is_subscribed($discussionid)) {
                $linktext = get_string('unsubscribedisc', 'hsuforum');
            } else {
                $linktext = get_string('subscribedisc', 'hsuforum');
            }
            $forumnode->add($linktext, $subscribeurl, navigation_node::TYPE_SETTING);
        }
    }
    if (has_capability('mod/hsuforum:viewsubscribers', $PAGE->cm->context)) {
        $url = new moodle_url('/mod/hsuforum/subscribers.php', array('id' => $forumobject->id));
        $forumnode->add(get_string('showsubscribers', 'hsuforum'), $url, navigation_node::TYPE_SETTING);
        $discsubscribers = ($viewingdiscussion or optional_param('action', '', PARAM_ALPHA) == 'discsubscribers');
        if ($discsubscribers && !hsuforum_is_forcesubscribed($forumobject) && $discussionid) {
            $url = new moodle_url('/mod/hsuforum/route.php', array('contextid' => $PAGE->cm->context->id, 'action' => 'discsubscribers', 'discussionid' => $discussionid));
            $forumnode->add(get_string('showdiscussionsubscribers', 'hsuforum'), $url, navigation_node::TYPE_SETTING, null, 'discsubscribers');
        }
    }
    if (!isloggedin() && $PAGE->course->id == SITEID) {
        $userid = guest_user()->id;
    } else {
        $userid = $USER->id;
    }
    $hascourseaccess = $PAGE->course->id == SITEID || can_access_course($PAGE->course, $userid);
    $enablerssfeeds = !empty($config->enablerssfeeds) && !empty($config->enablerssfeeds);
    if ($enablerssfeeds && $forumobject->rsstype && $forumobject->rssarticles && $hascourseaccess) {
        if (!function_exists('rss_get_url')) {
            require_once "{$CFG->libdir}/rsslib.php";
        }
        if ($forumobject->rsstype == 1) {
            $string = get_string('rsssubscriberssdiscussions', 'hsuforum');
        } else {
            $string = get_string('rsssubscriberssposts', 'hsuforum');
        }
        $url = new moodle_url(rss_get_url($PAGE->cm->context->id, $userid, "mod_hsuforum", $forumobject->id));
        $forumnode->add($string, $url, settings_navigation::TYPE_SETTING, null, null, new pix_icon('i/rss', ''));
    }
}
                    hsuforum_subscribe($user->id, $forum->id);
                }
            }
            hsuforum_forcesubscribe($forum->id, HSUFORUM_INITIALSUBSCRIBE);
            redirect($returnto, get_string("everyoneisnowsubscribed", "hsuforum"), 1);
            break;
        case HSUFORUM_DISALLOWSUBSCRIBE:
            // 3
            hsuforum_forcesubscribe($forum->id, HSUFORUM_DISALLOWSUBSCRIBE);
            redirect($returnto, get_string("noonecansubscribenow", "hsuforum"), 1);
            break;
        default:
            print_error(get_string('invalidforcesubscribe', 'hsuforum'));
    }
}
if (hsuforum_is_forcesubscribed($forum)) {
    redirect($returnto, get_string("everyoneisnowsubscribed", "hsuforum"), 1);
}
$info = new stdClass();
$info->name = fullname($user);
$info->forum = format_string($forum->name);
if (hsuforum_is_subscribed($user->id, $forum->id)) {
    if (is_null($sesskey)) {
        // we came here via link in email
        $PAGE->set_title($course->shortname);
        $PAGE->set_heading($course->fullname);
        echo $OUTPUT->header();
        echo $OUTPUT->confirm(get_string('confirmunsubscribe', 'hsuforum', format_string($forum->name)), new moodle_url($PAGE->url, array('sesskey' => sesskey())), new moodle_url('/mod/hsuforum/view.php', array('f' => $id)));
        echo $OUTPUT->footer();
        exit;
    }
 /**
  * Form definition
  *
  * @return void
  */
 function definition()
 {
     global $OUTPUT, $USER, $DB;
     $config = get_config('hsuforum');
     $mform =& $this->_form;
     $course = $this->_customdata['course'];
     $cm = $this->_customdata['cm'];
     $coursecontext = $this->_customdata['coursecontext'];
     $modcontext = $this->_customdata['modcontext'];
     $forum = $this->_customdata['forum'];
     $post = $this->_customdata['post'];
     $edit = $this->_customdata['edit'];
     $thresholdwarning = $this->_customdata['thresholdwarning'];
     $mform->addElement('html', '<div class="fcontainer">');
     // If there is a warning message and we are not editing a post we need to handle the warning.
     if (!empty($thresholdwarning) && !$edit) {
         // Here we want to display a warning if they can still post but have reached the warning threshold.
         if ($thresholdwarning->canpost) {
             $message = get_string($thresholdwarning->errorcode, $thresholdwarning->module, $thresholdwarning->additional);
             $mform->addElement('html', $OUTPUT->notification($message));
         }
     }
     $mform->addElement('text', 'subject', get_string('subject', 'hsuforum'), 'size="48"');
     $mform->setType('subject', PARAM_TEXT);
     $mform->addRule('subject', get_string('required'), 'required', null, 'client');
     $mform->addRule('subject', get_string('maximumchars', '', 255), 'maxlength', 255, 'client');
     $mform->addElement('editor', 'message', get_string('message', 'hsuforum'), null, self::editor_options($modcontext, empty($post->id) ? null : $post->id));
     $mform->setType('message', PARAM_RAW);
     $mform->addRule('message', get_string('required'), 'required', null, 'client');
     if (isset($forum->id) && hsuforum_is_forcesubscribed($forum)) {
         $mform->addElement('static', 'subscribemessage', get_string('subscription', 'hsuforum'), get_string('everyoneissubscribed', 'hsuforum'));
         $mform->addElement('hidden', 'subscribe');
         $mform->setType('subscribe', PARAM_INT);
         $mform->addHelpButton('subscribemessage', 'subscription', 'hsuforum');
     } else {
         if (isset($forum->forcesubscribe) && $forum->forcesubscribe != HSUFORUM_DISALLOWSUBSCRIBE || has_capability('moodle/course:manageactivities', $coursecontext)) {
             $options = array();
             $options[0] = get_string('subscribestop', 'hsuforum');
             $options[1] = get_string('subscribestart', 'hsuforum');
             $mform->addElement('select', 'subscribe', get_string('subscription', 'hsuforum'), $options);
             $mform->addHelpButton('subscribe', 'subscription', 'hsuforum');
         } else {
             if ($forum->forcesubscribe == HSUFORUM_DISALLOWSUBSCRIBE) {
                 $mform->addElement('static', 'subscribemessage', get_string('subscription', 'hsuforum'), get_string('disallowsubscribe', 'hsuforum'));
                 $mform->addElement('hidden', 'subscribe');
                 $mform->setType('subscribe', PARAM_INT);
                 $mform->addHelpButton('subscribemessage', 'subscription', 'hsuforum');
             }
         }
     }
     if (!empty($forum->maxattachments) && $forum->maxbytes != 1 && has_capability('mod/hsuforum:createattachment', $modcontext)) {
         //  1 = No attachments at all
         $mform->addElement('filemanager', 'attachments', get_string('attachment', 'hsuforum'), null, self::attachment_options($forum));
         $mform->addHelpButton('attachments', 'attachment', 'hsuforum');
     }
     if (empty($post->id) && has_capability('moodle/course:manageactivities', $coursecontext)) {
         // hack alert
         $mform->addElement('checkbox', 'mailnow', get_string('mailnow', 'hsuforum'));
     }
     if (!empty($config->enabletimedposts) && !$post->parent && has_capability('mod/hsuforum:viewhiddentimedposts', $coursecontext)) {
         // hack alert
         $mform->addElement('header', 'displayperiod', get_string('displayperiod', 'hsuforum'));
         $mform->addElement('date_selector', 'timestart', get_string('displaystart', 'hsuforum'), array('optional' => true));
         $mform->addHelpButton('timestart', 'displaystart', 'hsuforum');
         $mform->addElement('date_selector', 'timeend', get_string('displayend', 'hsuforum'), array('optional' => true));
         $mform->addHelpButton('timeend', 'displayend', 'hsuforum');
     } else {
         $mform->addElement('hidden', 'timestart');
         $mform->setType('timestart', PARAM_INT);
         $mform->addElement('hidden', 'timeend');
         $mform->setType('timeend', PARAM_INT);
         $mform->setConstants(array('timestart' => 0, 'timeend' => 0));
     }
     if ($groupmode = groups_get_activity_groupmode($cm, $course)) {
         // hack alert
         $groupdata = groups_get_activity_allowed_groups($cm);
         $groupcount = count($groupdata);
         $groupinfo = array();
         $modulecontext = context_module::instance($cm->id);
         // Check whether the user has access to all groups in this forum from the accessallgroups cap.
         if ($groupmode == VISIBLEGROUPS || has_capability('moodle/site:accessallgroups', $modulecontext)) {
             // Only allow posting to all groups if the user has access to all groups.
             $groupinfo = array('0' => get_string('allparticipants'));
             $groupcount++;
         }
         $contextcheck = has_capability('mod/hsuforum:movediscussions', $modulecontext) && empty($post->parent) && $groupcount > 1;
         if ($contextcheck) {
             foreach ($groupdata as $grouptemp) {
                 $groupinfo[$grouptemp->id] = $grouptemp->name;
             }
             $mform->addElement('select', 'groupinfo', get_string('group'), $groupinfo);
             $mform->setDefault('groupinfo', $post->groupid);
             $mform->setType('groupinfo', PARAM_INT);
         } else {
             if (empty($post->groupid)) {
                 $groupname = get_string('allparticipants');
             } else {
                 $groupname = format_string($groupdata[$post->groupid]->name);
             }
             $mform->addElement('static', 'groupinfo', get_string('group'), $groupname);
         }
     }
     if (!empty($forum->anonymous) and $post->userid == $USER->id and has_capability('mod/hsuforum:revealpost', $modcontext)) {
         $mform->addElement('advcheckbox', 'reveal', get_string('reveal', 'hsuforum'));
         $mform->addHelpButton('reveal', 'reveal', 'hsuforum');
     }
     if (!empty($forum->allowprivatereplies) and !empty($post->parent) and has_capability('mod/hsuforum:allowprivate', $modcontext)) {
         if ($post->userid != $USER->id) {
             $mform->addElement('hidden', 'privatereply', 0);
             $mform->setType('privatereply', PARAM_INT);
         } else {
             $parentauthorid = $DB->get_field('hsuforum_posts', 'userid', array('id' => $post->parent), MUST_EXIST);
             $mform->addElement('advcheckbox', 'privatereply', get_string('privatereply', 'hsuforum'), null, null, array(0, $parentauthorid));
             $mform->addHelpButton('privatereply', 'privatereply', 'hsuforum');
         }
     }
     //-------------------------------------------------------------------------------
     // buttons
     if (isset($post->edit)) {
         // hack alert
         $submit_string = get_string('savechanges');
     } else {
         $submit_string = get_string('posttoforum', 'hsuforum');
     }
     $this->add_action_buttons(false, $submit_string);
     $mform->addElement('hidden', 'course');
     $mform->setType('course', PARAM_INT);
     $mform->addElement('hidden', 'forum');
     $mform->setType('forum', PARAM_INT);
     $mform->addElement('hidden', 'discussion');
     $mform->setType('discussion', PARAM_INT);
     $mform->addElement('hidden', 'parent');
     $mform->setType('parent', PARAM_INT);
     $mform->addElement('hidden', 'userid');
     $mform->setType('userid', PARAM_INT);
     $mform->addElement('hidden', 'groupid');
     $mform->setType('groupid', PARAM_INT);
     $mform->addElement('hidden', 'edit');
     $mform->setType('edit', PARAM_INT);
     $mform->addElement('hidden', 'reply');
     $mform->setType('reply', PARAM_INT);
     $mform->addElement('html', '</div>');
 }