Skip to content

Commit

Permalink
Merge branch 'MDL-56139_master' of git://github.com/markn86/moodle
Browse files Browse the repository at this point in the history
  • Loading branch information
David Monllao committed Nov 16, 2016
2 parents 9067767 + af5765b commit 97279f8
Show file tree
Hide file tree
Showing 22 changed files with 737 additions and 56 deletions.
1 change: 1 addition & 0 deletions lang/en/cache.php
Expand Up @@ -52,6 +52,7 @@
$string['cachedef_groupdata'] = 'Course group information';
$string['cachedef_htmlpurifier'] = 'HTML Purifier - cleaned content';
$string['cachedef_langmenu'] = 'List of available languages';
$string['cachedef_message_time_last_message_between_users'] = 'Time created for most recent message between users';
$string['cachedef_locking'] = 'Locking';
$string['cachedef_message_processors_enabled'] = "Message processors enabled status";
$string['cachedef_navigation_expandcourse'] = 'Navigation expandable courses';
Expand Down
1 change: 1 addition & 0 deletions lib/amd/build/backoff_timer.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

175 changes: 175 additions & 0 deletions lib/amd/src/backoff_timer.js
@@ -0,0 +1,175 @@
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* A timer that will execute a callback with decreasing frequency. Useful for
* doing polling on the server without overwhelming it with requests.
*
* @module core/backoff_timer
* @class backoff_timer
* @package core
* @copyright 2016 Ryan Wyllie <ryan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define(function() {

/**
* Constructor for the back off timer.
*
* @param {function} callback The function to execute after each tick
* @param {function} backoffFunction The function to determine what the next timeout value should be
*/
var BackoffTimer = function(callback, backoffFunction) {
this.callback = callback;
this.backOffFunction = backoffFunction;
};

/**
* @type {function} callback The function to execute after each tick
*/
BackoffTimer.prototype.callback = null;

/**
* @type {function} backoffFunction The function to determine what the next timeout value should be
*/
BackoffTimer.prototype.backOffFunction = null;

/**
* @type {int} time The timeout value to use
*/
BackoffTimer.prototype.time = null;

/**
* @type {numeric} timeout The timeout identifier
*/
BackoffTimer.prototype.timeout = null;

/**
* Generate the next timeout in the back off time sequence
* for the timer.
*
* The back off function is called to calculate the next value.
* It is given the current value and an array of all previous values.
*
* @method generateNextTime
* @return {int} The new timeout value (in milliseconds)
*/
BackoffTimer.prototype.generateNextTime = function() {
var newTime = this.backOffFunction(this.time);
this.time = newTime;

return newTime;
};

/**
* Stop the current timer and clear the previous time values
*
* @method reset
* @return {object} this
*/
BackoffTimer.prototype.reset = function() {
this.time = null;
this.stop();

return this;
};

/**
* Clear the current timeout, if one is set.
*
* @method stop
* @return {object} this
*/
BackoffTimer.prototype.stop = function() {
if (this.timeout) {
window.clearTimeout(this.timeout);
this.timeout = null;
}

return this;
};

/**
* Start the current timer by generating the new timeout value and
* starting the ticks.
*
* This function recurses after each tick with a new timeout value
* generated each time.
*
* The callback function is called after each tick.
*
* @method start
* @return {object} this
*/
BackoffTimer.prototype.start = function() {
// If we haven't already started.
if (!this.timeout) {
var time = this.generateNextTime();
this.timeout = window.setTimeout(function() {
this.callback();
// Clear the existing timer.
this.stop();
// Start the next timer.
this.start();
}.bind(this), time);
}

return this;
};

/**
* Reset the timer and start it again from the initial timeout
* values
*
* @method restart
* @return {object} this
*/
BackoffTimer.prototype.restart = function() {
return this.reset().start();
};

/**
* Returns an incremental function for the timer.
*
* @param {int} minamount The minimum amount of time we wait before checking
* @param {int} incrementamount The amount to increment the timer by
* @param {int} maxamount The max amount to ever increment to
* @param {int} timeoutamount The timeout to use once we reach the max amount
* @return {function}
*/
BackoffTimer.getIncrementalCallback = function(minamount, incrementamount, maxamount, timeoutamount) {

/**
* An incremental function for the timer.
*
* @param {(int|null)} time The current timeout value or null if none set
* @return {int} The new timeout value
*/
return function(time) {
if (!time) {
return minamount;
}

// Don't go over the max amount.
if (time + incrementamount > maxamount) {
return timeoutamount;
}

return time + incrementamount;
};
};

return BackoffTimer;
});
8 changes: 8 additions & 0 deletions lib/db/caches.php
Expand Up @@ -301,4 +301,12 @@
'staticacceleration' => true,
'staticaccelerationsize' => 3
),

// Caches the time of the last message between two users.
'message_time_last_message_between_users' => array(
'mode' => cache_store::MODE_APPLICATION,
'simplekeys' => true, // The id of the sender and recipient is used.
'simplevalues' => true,
'datasource' => '\core_message\time_last_message_between_users',
),
);
9 changes: 9 additions & 0 deletions lib/messagelib.php
Expand Up @@ -234,6 +234,15 @@ function message_send($eventdata) {
}
}

// Only cache messages, not notifications.
if (empty($savemessage->notification)) {
// Cache the timecreated value of the last message between these two users.
$cache = cache::make('core', 'message_time_last_message_between_users');
$key = \core_message\helper::get_last_message_time_created_cache_key($savemessage->useridfrom,
$savemessage->useridto);
$cache->set($key, $savemessage->timecreated);
}

// Store unread message just in case we get a fatal error any time later.
$savemessage->id = $DB->insert_record('message', $savemessage);
$eventdata->savedmessageid = $savemessage->id;
Expand Down
6 changes: 0 additions & 6 deletions lib/navigationlib.php
Expand Up @@ -2334,9 +2334,6 @@ protected function load_for_user($user=null, $forceforcontext=false) {
if ($USER->id != $user->id) {
$messageargs['user2'] = $user->id;
}
if ($course->id != $SITE->id) {
$messageargs['viewing'] = MESSAGE_VIEW_COURSE. $course->id;
}
$url = new moodle_url('/message/index.php', $messageargs);
$usernode->add(get_string('messages', 'message'), $url, self::TYPE_SETTING, null, 'messages');
}
Expand Down Expand Up @@ -4640,9 +4637,6 @@ protected function generate_user_settings($courseid, $userid, $gstitle='usercurr
if ($USER->id != $user->id) {
$messageargs['user2'] = $user->id;
}
if ($course->id != $SITE->id) {
$messageargs['viewing'] = MESSAGE_VIEW_COURSE. $course->id;
}
$url = new moodle_url('/message/index.php', $messageargs);
$dashboard->add(get_string('messages', 'message'), $url, self::TYPE_SETTING, null, 'messages');
}
Expand Down
2 changes: 1 addition & 1 deletion message/amd/build/message_area.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 97279f8

Please sign in to comment.