Beispiel #1
0
$userid = optional_param('userid', 0, PARAM_INT);
$assign = optional_param('assign', 0, PARAM_INT);
# urls
$admin_url = "{$CFG->wwwroot}/blocks/helpmenow/admin/manage_queues.php";
$url = '/blocks/helpmenow/admin/assign_helper.php';
$this_url = new moodle_url($url);
$this_url->param('queueid', $queueid);
# sitecontext and cap check
$sitecontext = context_system::instance();
if (!has_capability(HELPMENOW_CAP_MANAGE, $sitecontext)) {
    redirect();
}
$PAGE->set_context($sitecontext);
$PAGE->set_url($url);
$PAGE->set_pagelayout('standard');
$queue = new helpmenow_queue($queueid);
$queue->load_helpers();
$cap = HELPMENOW_CAP_QUEUE_ANSWER;
# todo: check returned values for success
if ($userid) {
    # assigning/unassigning users
    if ($assign) {
        # assigning
        if (has_capability($cap, $sitecontext, $userid)) {
            $queue->add_helper($userid);
        } else {
            # todo: error: doesn't have cap to be a helper
        }
    } else {
        # unassigning
        $queue->remove_helper($userid);
Beispiel #2
0
}
$PAGE->set_context($sitecontext);
$PAGE->set_url('/blocks/helpmenow/admin/manage_queues.php');
$PAGE->set_pagelayout('standard');
# title, navbar, and a nice box
$title = get_string('admin', 'block_helpmenow');
$nav = array(array('name' => $title));
foreach ($nav as $node) {
    $PAGE->navbar->add($node['name'], isset($node['link']) ? $node['link'] : null);
}
$PAGE->set_title($title);
$PAGE->set_heading($title);
echo $OUTPUT->header();
echo $OUTPUT->box_start('generalbox centerpara');
echo $OUTPUT->heading(get_string('global_admin', 'block_helpmenow'));
$queues = helpmenow_queue::get_queues();
# start setting up the table
# todo: figure out a good way to include plugin specific column(s)
$table = new html_table();
$table->head = array(get_string('name'), get_string('description'), get_string('weight', 'block_helpmenow'), get_string('helpers', 'block_helpmenow'), get_string('delete'));
$table->align = array('left', 'left', 'center', 'center', 'center');
$table->attributes['class'] = 'generaltable';
$table->tablealign = 'center';
if (!empty($queues)) {
    foreach ($queues as $q) {
        $assign->param('queueid', $q->id);
        $assign_url = $assign->out();
        $edit->param('queueid', $q->id);
        $edit_url = $edit->out();
        $delete->param('queueid', $q->id);
        $delete_url = $delete->out();
Beispiel #3
0
/**
 * chat block
 *
 * @param object $request request from client
 * @param object $response response
 */
function helpmenow_serverfunc_block($request, &$response)
{
    global $USER, $CFG, $OUTPUT, $DB;
    #echo "entered serverfunc_block: " . microtime() . "\n";     # DEBUGGING
    $DB->set_field('block_helpmenow_user', 'lastaccess', time(), array('userid' => $USER->id));
    # update our user lastaccess
    helpmenow_log($USER->id, 'block refresh', '');
    $response->last_refresh = get_string('updated', 'block_helpmenow') . ': ' . userdate(time(), '%r');
    # datetime for debugging
    $response->pending = 0;
    $response->alert = false;
    #echo "bumped lastaccess/logged: " . microtime() . "\n";     # DEBUGGING
    /**
     * queues
     */
    $response->queues_html = '';
    $connect = new moodle_url("{$CFG->wwwroot}/blocks/helpmenow/connect.php");
    $queues = helpmenow_queue::get_queues();
    foreach ($queues as $q) {
        $response->queues_html .= '<div>';
        switch ($q->get_privilege()) {
            case HELPMENOW_QUEUE_HELPEE:
            case HELPMENOW_QUEUE_HELPER:
                $sql = "\n                SELECT s.*, m.message, m.id AS messageid\n                FROM {block_helpmenow_session} s\n                JOIN {block_helpmenow_session2user} s2u ON s2u.sessionid = s.id AND s2u.userid = s.createdby\n                JOIN {block_helpmenow_message} m ON m.id = (\n                    SELECT MAX(id) FROM {block_helpmenow_message} m2 WHERE m2.sessionid = s.id AND m2.userid <> s.createdby\n                )\n                WHERE s.iscurrent = 1\n                AND s.createdby = {$USER->id}\n                AND s.queueid = {$q->id}\n                AND (s2u.last_refresh + 20) < " . time() . "\n                AND s2u.last_refresh < m.time\n                ";
                if ($session = $DB->get_record_sql($sql) or $q->is_open()) {
                    $connect->remove_params('sessionid');
                    $connect->param('queueid', $q->id);
                    $message = $style = '';
                    if ($session) {
                        $response->pending++;
                        $style = ' style="background-color:yellow"';
                        $message = '<div style="margin-left: 1em;">' . $session->message . '</div>' . $message;
                        if (helpmenow_notify_once($session->messageid)) {
                            $response->alert = true;
                        }
                    }
                    $response->queues_html .= "<div{$style}>" . create_popup($q->name, $connect->out(), "queue{$q->id}") . "{$message}</div>";
                } else {
                    $response->queues_html .= "<div>{$q->name}</div>";
                }
                if ($q->get_privilege() == HELPMENOW_QUEUE_HELPEE) {
                    break;
                }
                $instyle = $outstyle = '';
                if ($q->helpers[$USER->id]->isloggedin) {
                    $outstyle = 'style="display: none;"';
                } else {
                    $instyle = 'style="display: none;"';
                }
                $login_url = new moodle_url("{$CFG->wwwroot}/blocks/helpmenow/login.php");
                $login_url->param('queueid', $q->id);
                $login_url->param('login', 0);
                $logout = create_popup(get_string('logout', 'block_helpmenow'), $login_url->out(), "login");
                $login_url->param('login', 1);
                $login = create_popup(get_string('login', 'block_helpmenow'), $login_url->out(), "login");
                $logout_status = get_string('logout_status', 'block_helpmenow');
                $response->queues_html .= <<<EOF
    <div style="text-align: center; font-size:small; margin-top:.5em; margin-bottom:.5em;">
        <div id="helpmenow_logged_in_div_{$q->id}" {$instyle}>{$logout}</div>
        <div id="helpmenow_logged_out_div_{$q->id}" {$outstyle}>{$logout_status} | {$login}</div>
    </div>
EOF;
                # sessions
                $sql = "\n                SELECT u.*, s.id AS sessionid, m.message, m.time, m.id AS messageid\n                FROM {block_helpmenow_session} s\n                JOIN {user} u ON u.id = s.createdby\n                JOIN {block_helpmenow_message} m ON m.id = (\n                    SELECT MAX(id) FROM {block_helpmenow_message} m2 WHERE m2.sessionid = s.id AND m2.userid = s.createdby\n                )\n                WHERE s.queueid = {$q->id}\n                AND s.iscurrent = 1\n                ";
                if (!($sessions = $DB->get_records_sql($sql))) {
                    break;
                }
                $response->queues_html .= '<div style="margin-left: 1em;">';
                foreach ($sessions as &$s) {
                    $s->pending = true;
                    $sql = "\n                    SELECT *\n                    FROM {block_helpmenow_session2user} s2u\n                    JOIN {user} u ON u.id = s2u.userid\n                    WHERE s2u.sessionid = {$s->sessionid}\n                    AND s2u.userid <> {$s->id}\n                    ";
                    $s->helpers = $DB->get_records_sql($sql);
                    foreach ($s->helpers as $h) {
                        if ($s->pending) {
                            if ($h->last_refresh + 20 > time()) {
                                $s->pending = false;
                            }
                            if ($h->last_refresh > $s->time) {
                                $s->pending = false;
                            }
                        }
                        if (!isset($s->helper_names)) {
                            $s->helper_names = fullname($h);
                        } else {
                            $s->helper_names .= ', ' . fullname($h);
                        }
                    }
                }
                unset($s);
                # sort by unseen messages, lastname, firstname
                usort($sessions, function ($a, $b) {
                    if (!($a->pending xor $b->pending)) {
                        return strcmp(strtolower("{$a->lastname} {$a->firstname}"), strtolower("{$b->lastname} {$b->firstname}"));
                    }
                    return $a->pending ? -1 : 1;
                });
                foreach ($sessions as $s) {
                    $connect->remove_params('queueid');
                    $connect->param('sessionid', $s->sessionid);
                    $message = $style = '';
                    if ($s->pending) {
                        $response->pending++;
                        $style = ' style="background-color:yellow"';
                        $message .= '"' . $s->message . '"<br />';
                        if ($q->helpers[$USER->id]->isloggedin) {
                            if (helpmenow_notify_once($s->messageid)) {
                                $response->alert = true;
                            }
                        }
                    }
                    if (isset($s->helper_names)) {
                        $message .= '<small>' . $s->helper_names . '</small><br />';
                    }
                    $message = '<div style="margin-left: 1em;">' . $message . '</div>';
                    $response->queues_html .= "<div{$style}>" . create_popup(fullname($s), $connect->out(), $s->sessionid) . "{$message}</div>";
                }
                $response->queues_html .= '</div>';
                break;
        }
        $desc_message = '<div style="margin-left: 1em; font-size: smaller;">' . $q->description . '</div>';
        $response->queues_html .= '</div>' . $desc_message . '<hr />';
    }
    #echo "processed queues: " . microtime() . "\n";     # DEBUGGING
    # show the correct login state for instructors
    $isloggedin = $DB->get_field('block_helpmenow_user', 'isloggedin', array('userid' => $USER->id));
    if (!is_null($isloggedin)) {
        $response->isloggedin = $isloggedin ? true : false;
    }
    # build contact list
    $response->users_html = '';
    $sql = "\n        SELECT u.*, hu.isloggedin, hu.motd, hu.lastaccess AS hmn_lastaccess\n        FROM {block_helpmenow_contact} c\n        JOIN {user} u ON u.id = c.contact_userid\n        JOIN {block_helpmenow_user} hu ON c.contact_userid = hu.userid\n        WHERE c.userid = {$USER->id}\n    ";
    $contacts = $DB->get_records_sql($sql);
    if (!$contacts) {
        return;
    }
    #echo "selected contacts: " . microtime() . "\n";     # DEBUGGING
    $cutoff = helpmenow_cutoff();
    foreach ($contacts as $u) {
        $u->online = false;
        if ($u->hmn_lastaccess > $cutoff and (is_null($u->isloggedin) or $u->isloggedin != 0)) {
            $u->online = true;
            $sql = "\n                SELECT s.id, m.message, m.time, m.id AS messageid, s2u2.last_refresh\n                FROM mdl_block_helpmenow_session2user s2u\n                JOIN mdl_block_helpmenow_session s ON s.iscurrent = 1 AND s.queueid IS NULL AND s.id = s2u.sessionid\n                JOIN mdl_block_helpmenow_session2user s2u2 ON s2u2.sessionid = s.id AND s2u2.userid = {$USER->id}\n                JOIN mdl_block_helpmenow_message m ON m.userid = s2u.userid AND m.sessionid = s2u.sessionid\n                WHERE s2u.userid = {$u->id}\n                ORDER BY m.id DESC\n            ";
            if (!($message = $DB->get_record_sql($sql))) {
                continue;
            }
            print_object($message);
            if ($message->time < $message->last_refresh + HELPMENOW_BLOCK_ALERT_DELAY) {
                continue;
            }
            $u->message = $message->message;
            $u->messageid = $message->messageid;
        }
    }
    #echo "selected contact messages: " . microtime() . "\n";     # DEBUGGING
    # sort by unseen messages, online, lastname, firstname
    usort($contacts, function ($a, $b) {
        if (isset($a->message) xor isset($b->message)) {
            return isset($a->message) ? -1 : 1;
        }
        if ($a->online xor $b->online) {
            return $a->online ? -1 : 1;
        }
        return strcmp(strtolower("{$a->lastname} {$a->firstname}"), strtolower("{$b->lastname} {$b->firstname}"));
    });
    #echo "sorted contacts: " . microtime() . "\n";     # DEBUGGING
    $connect->remove_params('queueid');
    $connect->remove_params('sessionid');
    foreach ($contacts as $u) {
        $connect->param('userid', $u->id);
        $message = '';
        $style = 'margin-left: 1em;';
        if (!isset($u->isloggedin)) {
            # if isloggedin is null, the user is always logged in when they are online
            if ($u->online) {
                if ($isloggedin) {
                    $name = create_popup(fullname($u), $connect->out(), $u->id);
                } else {
                    $name = fullname($u);
                }
            } else {
                continue;
            }
        } else {
            # if isloggedin is set, then 0 = loggedout, any other number is the timestamp of when they logged in
            if ($u->online) {
                $name = create_popup(fullname($u), $connect->out(), $u->id);
                $motd = $u->motd;
            } else {
                $name = fullname($u);
                $motd = get_string('offline', 'block_helpmenow');
            }
            $message .= '<div style="font-size: smaller;">' . $motd . '</div>';
        }
        if (isset($u->message)) {
            $response->pending++;
            $style .= 'background-color:yellow;';
            $message .= '<div>' . $u->message . '</div>';
            if (helpmenow_notify_once($u->messageid)) {
                $response->alert = true;
            }
        }
        $message = '<div style="margin-left: 1em;">' . $message . '</div>';
        $response->users_html .= "<div style=\"{$style}\">" . $name . $message . "</div>";
    }
    #echo "printed contacts: " . microtime() . "\n";     # DEBUGGING
}