549 lines
23 KiB
JavaScript
549 lines
23 KiB
JavaScript
/*
|
|
* Copyright (C) 2016-2020 phantombot.github.io/PhantomBot
|
|
*
|
|
* This program 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.
|
|
*
|
|
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/**
|
|
* timeSystem.js
|
|
*
|
|
* Keep track of users in the channel and log their time in the channel
|
|
* Exports various time formatting functions
|
|
* Use the $ API
|
|
*/
|
|
(function() {
|
|
var levelWithTime = $.getSetIniDbBoolean('timeSettings', 'timeLevel', false),
|
|
timeLevelWarning = $.getSetIniDbBoolean('timeSettings', 'timeLevelWarning', true),
|
|
keepTimeWhenOffline = $.getSetIniDbBoolean('timeSettings', 'keepTimeWhenOffline', true),
|
|
hoursForLevelUp = $.getSetIniDbNumber('timeSettings', 'timePromoteHours', 50),
|
|
regularsGroupId = 6,
|
|
interval,
|
|
inter;
|
|
|
|
/**
|
|
* @function updateTimeSettings
|
|
*/
|
|
function updateTimeSettings() {
|
|
levelWithTime = $.getIniDbBoolean('timeSettings', 'timeLevel');
|
|
keepTimeWhenOffline = $.getIniDbBoolean('timeSettings', 'keepTimeWhenOffline');
|
|
hoursForLevelUp = $.getIniDbNumber('timeSettings', 'timePromoteHours');
|
|
timeLevelWarning = $.getIniDbBoolean('timeSettings', 'timeLevelWarning');
|
|
}
|
|
|
|
/**
|
|
* @function getCurLocalTimeString
|
|
* @export $
|
|
* @param {String} timeformat
|
|
* @returns {String}
|
|
*
|
|
* timeformat = java.text.SimpleDateFormat allowed formats:
|
|
* Letter Date or Time Component Presentation Examples
|
|
* G Era designator Text AD
|
|
* y Year Year 1996; 96
|
|
* M Month in year Month July; Jul; 07
|
|
* w Week in year Number 27
|
|
* W Week in month Number 2
|
|
* D Day in year Number 189
|
|
* d Day in month Number 9
|
|
* F Day of week in month Number 2
|
|
* E Day in week Text Tuesday; Tue
|
|
* a AM/PM marker Text PM
|
|
* H Hour in day (0-23) Number 0
|
|
* k Hour in day (1-24) Number 24
|
|
* K Hour in am/pm (0-11) Number 0
|
|
* h Hour in am/pm (1-12) Number 12
|
|
* m Minute in hour Number 30
|
|
* s Second in minute Number 55
|
|
* S Millisecond Number 978
|
|
* z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
|
|
* Z Time zone RFC 822 time zone -0800
|
|
*
|
|
* Note that fixed strings must be encapsulated with quotes. For example, the below inserts a comma
|
|
* and paranthesis into the returned time string:
|
|
*
|
|
* getCurLocalTimeString("MMMM dd', 'yyyy hh:mm:ss zzz '('Z')'");
|
|
*/
|
|
function getCurLocalTimeString(format) {
|
|
var dateFormat = new java.text.SimpleDateFormat(format);
|
|
dateFormat.setTimeZone(java.util.TimeZone.getTimeZone(($.inidb.exists('settings', 'timezone') ? $.inidb.get('settings', 'timezone') : "GMT")));
|
|
return dateFormat.format(new java.util.Date());
|
|
}
|
|
|
|
/**
|
|
* @function getLocalTimeString
|
|
* @export $
|
|
* @param {String} timeformat
|
|
* @param {Number} utc_seconds
|
|
* @return {String}
|
|
*/
|
|
function getLocalTimeString(format, utc_secs) {
|
|
var dateFormat = new java.text.SimpleDateFormat(format);
|
|
dateFormat.setTimeZone(java.util.TimeZone.getTimeZone(($.inidb.exists('settings', 'timezone') ? $.inidb.get('settings', 'timezone') : "GMT")));
|
|
return dateFormat.format(new java.util.Date(utc_secs));
|
|
}
|
|
|
|
/**
|
|
* @function getCurrentLocalTimeString
|
|
* @export $
|
|
* @param {String} timeformat
|
|
* @param {String} timeZone
|
|
* @return {String}
|
|
*/
|
|
function getCurrentLocalTimeString(format, timeZone) {
|
|
var dateFormat = new java.text.SimpleDateFormat(format);
|
|
dateFormat.setTimeZone(java.util.TimeZone.getTimeZone(timeZone));
|
|
return dateFormat.format(new java.util.Date());
|
|
}
|
|
|
|
/**
|
|
* @function getLocalTime
|
|
* @export $
|
|
* @param {String} timeformat
|
|
* @param {String} timeZone
|
|
* @return {String}
|
|
*/
|
|
function getLocalTime() {
|
|
var dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
|
|
dateFormat.setTimeZone(java.util.TimeZone.getTimeZone(($.inidb.exists('settings', 'timezone') ? $.inidb.get('settings', 'timezone') : "GMT")));
|
|
return dateFormat.format(new java.util.Date());
|
|
}
|
|
|
|
/**
|
|
* @function dateToString
|
|
* @export $
|
|
* @param {Date} date
|
|
* @param {boolean} [timeOnly]
|
|
* @returns {string}
|
|
*/
|
|
function dateToString(date, timeOnly) {
|
|
var year = date.getFullYear(),
|
|
month = date.getMonth() + 1,
|
|
day = date.getDate(),
|
|
hours = date.getHours(),
|
|
minutes = date.getMinutes();
|
|
|
|
if (timeOnly) {
|
|
return hours + ':' + minutes;
|
|
} else {
|
|
return day + '-' + month + '-' + year + ' @ ' + hours + ':' + minutes;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @function getTimeString
|
|
* @export $
|
|
* @param {Number} time
|
|
* @param {boolean} [hoursOnly]
|
|
* @returns {string}
|
|
*/
|
|
function getTimeString(time, hoursOnly) {
|
|
var floor = Math.floor,
|
|
months = (time / 2628000);
|
|
days = ((months % 1) * 30.42),
|
|
hours = ((days % 1) * 24),
|
|
minutes = ((hours % 1) * 60),
|
|
seconds = ((minutes % 1) * 60);
|
|
|
|
if (hoursOnly) {
|
|
return floor(time / 3600) + $.lang.get('common.hours3');
|
|
} else {
|
|
var timeStringParts = [],
|
|
timeString = '';
|
|
|
|
// Append months if greater than one.
|
|
if (months >= 1) {
|
|
timeStringParts.push(floor(months) + ' ' + (months < 2 ? $.lang.get('common.time.month') : $.lang.get('common.time.months')));
|
|
}
|
|
|
|
// Append days if greater than one.
|
|
if (days >= 1) {
|
|
timeStringParts.push(floor(days) + ' ' + (days < 2 ? $.lang.get('common.time.day') : $.lang.get('common.time.days')));
|
|
}
|
|
|
|
// Append hours if greater than one.
|
|
if (hours >= 1) {
|
|
timeStringParts.push(floor(hours) + ' ' + (hours < 2 ? $.lang.get('common.time.hour') : $.lang.get('common.time.hours')));
|
|
}
|
|
|
|
// Append minutes if greater than one.
|
|
if (minutes >= 1) {
|
|
timeStringParts.push(floor(minutes) + ' ' + (minutes < 2 ? $.lang.get('common.time.minute') : $.lang.get('common.time.minutes')));
|
|
}
|
|
|
|
// Append seconds if greater than one.
|
|
if (seconds >= 1) {
|
|
timeStringParts.push(floor(seconds) + ' ' + (seconds < 2 ? $.lang.get('common.time.second') : $.lang.get('common.time.seconds')));
|
|
}
|
|
|
|
// If the array is empty, return 0 seconds.
|
|
if (timeStringParts.length === 0) {
|
|
return ('0 ' + $.lang.get('common.time.seconds'));
|
|
}
|
|
|
|
// Join the array to make a string.
|
|
timeString = timeStringParts.join(', ');
|
|
|
|
// Replace last comma with ", and".
|
|
if (timeString.indexOf(',') !== -1) {
|
|
timeString = (timeString.substr(0, timeString.lastIndexOf(',')) + $.lang.get('common.time.and') + timeString.substr(timeString.lastIndexOf(',') + 2));
|
|
}
|
|
return timeString;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @function getCountString
|
|
* @export $
|
|
* @param {Number} time
|
|
* @param {boolean} [countUp]
|
|
* @returns {string}
|
|
*/
|
|
function getCountString(time, countUp) {
|
|
var floor = Math.floor,
|
|
months = (time / 2628000);
|
|
days = ((months % 1) * 30.42),
|
|
hours = ((days % 1) * 24),
|
|
minutes = ((hours % 1) * 60),
|
|
seconds = ((minutes % 1) * 60);
|
|
|
|
var timeStringParts = [],
|
|
timeString = '';
|
|
|
|
// Append months if greater than one.
|
|
if (months >= 1) {
|
|
timeStringParts.push(floor(months) + ' ' + (months < 2 ? $.lang.get('common.time.month') : $.lang.get('common.time.months')));
|
|
}
|
|
|
|
// Append days if greater than one.
|
|
if (days >= 1) {
|
|
timeStringParts.push(floor(days) + ' ' + (days < 2 ? $.lang.get('common.time.day') : $.lang.get('common.time.days')));
|
|
}
|
|
|
|
// Append hours if greater than one.
|
|
if (hours >= 1) {
|
|
timeStringParts.push(floor(hours) + ' ' + (hours < 2 ? $.lang.get('common.time.hour') : $.lang.get('common.time.hours')));
|
|
}
|
|
|
|
// Append minutes if greater than one.
|
|
if (minutes >= 1) {
|
|
timeStringParts.push(floor(minutes) + ' ' + (minutes < 2 ? $.lang.get('common.time.minute') : $.lang.get('common.time.minutes')));
|
|
}
|
|
|
|
// Append seconds if greater than one.
|
|
if (seconds >= 1) {
|
|
timeStringParts.push(floor(seconds) + ' ' + (seconds < 2 ? $.lang.get('common.time.second') : $.lang.get('common.time.seconds')));
|
|
}
|
|
|
|
// If the array is empty, return 0 seconds.
|
|
if (timeStringParts.length === 0) {
|
|
if (countUp) {
|
|
return ($.lang.get('common.time.nostart'));
|
|
} else {
|
|
return ($.lang.get('common.time.expired'));
|
|
}
|
|
}
|
|
|
|
// Join the array to make a string.
|
|
timeString = timeStringParts.join(', ');
|
|
|
|
// Replace last comma with ", and".
|
|
if (timeString.indexOf(',') !== -1) {
|
|
timeString = (timeString.substr(0, timeString.lastIndexOf(',')) + $.lang.get('common.time.and') + timeString.substr(timeString.lastIndexOf(',') + 2));
|
|
}
|
|
return timeString;
|
|
}
|
|
|
|
/**
|
|
* @function getTimeStringMinutes
|
|
* @export $
|
|
* @param {Number} time
|
|
* @param {boolean} [hoursOnly]
|
|
* @returns {string}
|
|
*/
|
|
function getTimeStringMinutes(time) {
|
|
var floor = Math.floor,
|
|
cHours = time / 3600,
|
|
cMins = cHours % 1 * 60;
|
|
|
|
if (cHours == 0 || cHours < 1) {
|
|
return (floor(~~cMins) + $.lang.get('common.minutes2'));
|
|
} else {
|
|
return (floor(cHours) + $.lang.get('common.hours2') + floor(~~cMins) + $.lang.get('common.minutes2'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @function getUserTime
|
|
* @export $
|
|
* @param {string} username
|
|
* @returns {number}
|
|
*/
|
|
function getUserTime(username) {
|
|
return ($.inidb.exists('time', username.toLowerCase()) ? $.inidb.get('time', username.toLowerCase()) : 0);
|
|
}
|
|
|
|
/**
|
|
* @function getUserTimeString
|
|
* @export $
|
|
* @param {string} username
|
|
* @returns {string}
|
|
*/
|
|
function getUserTimeString(username) {
|
|
var floor = Math.floor,
|
|
time = $.getUserTime(username.toLowerCase()),
|
|
cHours = time / 3600,
|
|
cMins = cHours % 1 * 60;
|
|
|
|
if (floor(cHours) > 0) {
|
|
return ($.lang.get('user.time.string.hours', floor(cHours), floor(~~cMins)));
|
|
} else {
|
|
return ($.lang.get('user.time.string.minutes', floor(~~cMins)));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @event command
|
|
*/
|
|
$.bind('command', function(event) {
|
|
var sender = event.getSender().toLowerCase(),
|
|
username = $.username.resolve(sender),
|
|
command = event.getCommand(),
|
|
args = event.getArgs(),
|
|
action = args[0],
|
|
subject,
|
|
timeArg;
|
|
|
|
/**
|
|
* @commandpath time - Announce amount of time spent in channel
|
|
*/
|
|
if (command.equalsIgnoreCase('time')) {
|
|
if (!action) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get("timesystem.get.self", $.resolveRank(sender), getUserTimeString(sender)));
|
|
} else if (action && $.inidb.exists('time', action.toLowerCase())) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get("timesystem.get.other", $.username.resolve(action), getUserTimeString(action)));
|
|
} else {
|
|
subject = args[1];
|
|
timeArg = parseInt(args[2]);
|
|
|
|
/**
|
|
* @commandpath time add [user] [seconds] - Add seconds to a user's logged time (for correction purposes)
|
|
*/
|
|
if (action.equalsIgnoreCase('add')) {
|
|
|
|
if (!subject || isNaN(timeArg)) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.add.usage'));
|
|
return;
|
|
}
|
|
|
|
subject = $.user.sanitize(subject);
|
|
|
|
if (timeArg < 0) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.add.error.negative'));
|
|
return;
|
|
}
|
|
|
|
if ($.user.isKnown(subject)) {
|
|
$.inidb.incr('time', subject, timeArg);
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.add.success', getTimeString(timeArg), $.username.resolve(subject), getUserTimeString(subject)));
|
|
} else {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('common.user.404', $.username.resolve(subject)));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @commandpath time take [user] [seconds] - Take seconds from a user's logged time
|
|
*/
|
|
if (action.equalsIgnoreCase('take')) {
|
|
if (!subject || isNaN(timeArg)) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.take.usage'));
|
|
return;
|
|
}
|
|
|
|
subject = $.user.sanitize(subject);
|
|
if (!$.user.isKnown(subject)) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('common.user.404', subject));
|
|
}
|
|
|
|
if (timeArg > $.getUserTime(subject)) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.take.error.toomuch', subject));
|
|
return;
|
|
}
|
|
|
|
$.inidb.decr('time', subject, timeArg);
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.take.success', $.getTimeString(timeArg), $.username.resolve(subject), getUserTimeString(subject)))
|
|
}
|
|
|
|
if (action.equalsIgnoreCase('set')) {
|
|
if (!subject || isNaN(timeArg)) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.settime.usage'));
|
|
return;
|
|
}
|
|
|
|
if (timeArg < 0) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.settime.error.negative'));
|
|
return;
|
|
}
|
|
|
|
|
|
subject = $.user.sanitize(subject);
|
|
if ($.user.isKnown(subject)) {
|
|
$.inidb.set('time', subject, timeArg);
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.settime.success', $.username.resolve(subject), $.getUserTimeString(subject)));
|
|
} else {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('common.user.404', subject));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @commandpath time promotehours [hours] - Set the amount of hours a user has to be logged to automatically become a regular
|
|
*/
|
|
if (action.equalsIgnoreCase('promotehours')) {
|
|
if (isNaN(subject)) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.set.promotehours.usage'));
|
|
return;
|
|
}
|
|
|
|
if (subject < 0) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.set.promotehours.error.negative', $.getGroupNameById(regularsGroupId)));
|
|
return;
|
|
}
|
|
|
|
hoursForLevelUp = parseInt(subject);
|
|
$.inidb.set('timeSettings', 'timePromoteHours', hoursForLevelUp);
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.set.promotehours.success', $.getGroupNameById(regularsGroupId), hoursForLevelUp));
|
|
}
|
|
|
|
/**
|
|
* @commandpath time autolevel - Auto levels a user to regular after hitting 50 hours.
|
|
*/
|
|
if (action.equalsIgnoreCase('autolevel')) {
|
|
levelWithTime = !levelWithTime;
|
|
$.setIniDbBoolean('timeSettings', 'timeLevel', levelWithTime);
|
|
$.say($.whisperPrefix(sender) + (levelWithTime ? $.lang.get('timesystem.autolevel.enabled', $.getGroupNameById(regularsGroupId), hoursForLevelUp) : $.lang.get('timesystem.autolevel.disabled', $.getGroupNameById(regularsGroupId), hoursForLevelUp)));
|
|
}
|
|
|
|
/**
|
|
* @commandpath time autolevelnotification - Toggles if a chat announcement is made when a user is promoted to a regular.
|
|
*/
|
|
if (action.equalsIgnoreCase('autolevelnotification')) {
|
|
timeLevelWarning = !timeLevelWarning;
|
|
$.setIniDbBoolean('timeSettings', 'timeLevelWarning', timeLevelWarning);
|
|
$.say($.whisperPrefix(sender) + (timeLevelWarning ? $.lang.get('timesystem.autolevel.chat.enabled') : $.lang.get('timesystem.autolevel.chat.disabled')));
|
|
}
|
|
|
|
/**
|
|
* @commandpath time offlinetime - Toggle logging a user's time when the channel is offline
|
|
*/
|
|
if (action.equalsIgnoreCase('offlinetime')) {
|
|
keepTimeWhenOffline = !keepTimeWhenOffline;
|
|
$.setIniDbBoolean('timeSettings', 'keepTimeWhenOffline', keepTimeWhenOffline);
|
|
$.say($.whisperPrefix(sender) + (keepTimeWhenOffline ? $.lang.get('timesystem.offlinetime.enabled') : $.lang.get('timesystem.offlinetime.disabled')));
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @commandpath streamertime - Announce the caster's local time
|
|
*/
|
|
if (command.equalsIgnoreCase('streamertime')) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.streamertime', getCurLocalTimeString("MMMM dd', 'yyyy hh:mm:ss a zzz '('Z')'"), $.username.resolve($.ownerName)));
|
|
}
|
|
|
|
/**
|
|
* @commandpath timezone [timezone name] - Show configured timezone or optionally set the timezone. See List: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
|
*/
|
|
if (command.equalsIgnoreCase('timezone')) {
|
|
var tzData;
|
|
|
|
if (!action) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.set.timezone.usage', ($.inidb.exists('settings', 'timezone') ? $.inidb.get('settings', 'timezone') : "GMT")));
|
|
return;
|
|
}
|
|
|
|
tzData = java.util.TimeZone.getTimeZone(action);
|
|
if (tzData.getID().equals("GMT") && !action.equals("GMT")) {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.set.timezone.invalid', action));
|
|
return;
|
|
} else {
|
|
$.say($.whisperPrefix(sender) + $.lang.get('timesystem.set.timezone.success', tzData.getID(), tzData.observesDaylightTime()));
|
|
$.inidb.set('settings', 'timezone', tzData.getID());
|
|
}
|
|
}
|
|
});
|
|
|
|
// Set an interval for increasing all current users logged time
|
|
interval = setInterval(function() {
|
|
var username,
|
|
i;
|
|
|
|
if ($.isOnline($.channelName) || keepTimeWhenOffline) {
|
|
$.inidb.IncreaseBatchString('time', '', $.users, '60');
|
|
}
|
|
}, 6e4, 'scripts::systems::timeSystem.js#1');
|
|
|
|
// Interval for auto level to regular
|
|
inter = setInterval(function() {
|
|
var username,
|
|
i;
|
|
|
|
if (levelWithTime) {
|
|
for (i in $.users) {
|
|
username = $.users[i].toLowerCase();
|
|
if (!$.isMod(username) && !$.isAdmin(username) && !$.isSub(username) && !$.isVIP(username) && $.inidb.exists('time', username) && Math.floor(parseInt($.inidb.get('time', username)) / 3600) >= hoursForLevelUp && parseInt($.getUserGroupId(username)) > regularsGroupId) {
|
|
if (!$.hasModList(username)) { // Added a second check here to be 100% sure the user is not a mod.
|
|
$.setUserGroupById(username, regularsGroupId);
|
|
if (timeLevelWarning) {
|
|
$.say($.lang.get(
|
|
'timesystem.autolevel.promoted',
|
|
$.username.resolve(username),
|
|
$.getGroupNameById(regularsGroupId).toLowerCase(),
|
|
hoursForLevelUp
|
|
)); //No whisper mode needed here.
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}, 9e5, 'scripts::systems::timeSystem.js#2');
|
|
|
|
/**
|
|
* @event initReady
|
|
*/
|
|
$.bind('initReady', function() {
|
|
$.registerChatCommand('./core/timeSystem.js', 'streamertime');
|
|
$.registerChatCommand('./core/timeSystem.js', 'timezone', 1);
|
|
$.registerChatCommand('./core/timeSystem.js', 'time');
|
|
|
|
$.registerChatSubcommand('time', 'add', 1);
|
|
$.registerChatSubcommand('time', 'take', 1);
|
|
$.registerChatSubcommand('time', 'set', 1);
|
|
$.registerChatSubcommand('time', 'autolevel', 1);
|
|
$.registerChatSubcommand('time', 'promotehours', 1);
|
|
$.registerChatSubcommand('time', 'autolevelnotification', 1);
|
|
});
|
|
|
|
/** Export functions to API */
|
|
$.dateToString = dateToString;
|
|
$.getTimeString = getTimeString;
|
|
$.getCountString = getCountString;
|
|
$.getUserTime = getUserTime;
|
|
$.getUserTimeString = getUserTimeString;
|
|
$.getCurLocalTimeString = getCurLocalTimeString;
|
|
$.getLocalTimeString = getLocalTimeString;
|
|
$.getTimeStringMinutes = getTimeStringMinutes;
|
|
$.updateTimeSettings = updateTimeSettings;
|
|
$.getCurrentLocalTimeString = getCurrentLocalTimeString;
|
|
$.getLocalTime = getLocalTime;
|
|
})();
|