|
@@ -0,0 +1,125 @@
|
|
|
+'use strict';
|
|
|
+
|
|
|
+const moment = require('moment');
|
|
|
+
|
|
|
+class Timer {
|
|
|
+ constructor(callback, delay, paused) {
|
|
|
+ this.callback = callback;
|
|
|
+ this.timerId = undefined;
|
|
|
+ this.start = undefined;
|
|
|
+ this.paused = paused;
|
|
|
+ this.remaining = moment.duration(delay, "hh:mm:ss").asSeconds() * 1000;
|
|
|
+ this.timeWhenPaused = 0;
|
|
|
+ this.timePaused = Date.now();
|
|
|
+
|
|
|
+ if (!paused) {
|
|
|
+ this.resume();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ pause() {
|
|
|
+ clearTimeout(this.timerId);
|
|
|
+ this.remaining -= Date.now() - this.start;
|
|
|
+ this.timePaused = Date.now();
|
|
|
+ this.paused = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ ifNotPaused() {
|
|
|
+ if (!this.paused) {
|
|
|
+ this.resume();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ resume() {
|
|
|
+ this.start = Date.now();
|
|
|
+ clearTimeout(this.timerId);
|
|
|
+ this.timerId = setTimeout(this.callback, this.remaining);
|
|
|
+ this.timeWhenPaused = Date.now() - this.timePaused;
|
|
|
+ this.paused = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ resetTimeWhenPaused() {
|
|
|
+ this.timeWhenPaused = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ getTimePaused() {
|
|
|
+ if (!this.paused) {
|
|
|
+ return this.timeWhenPaused;
|
|
|
+ } else {
|
|
|
+ return Date.now() - this.timePaused;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function convertTime (duration) {
|
|
|
+
|
|
|
+ let a = duration.match(/\d+/g);
|
|
|
+
|
|
|
+ if (duration.indexOf('M') >= 0 && duration.indexOf('H') == -1 && duration.indexOf('S') == -1) {
|
|
|
+ a = [0, a[0], 0];
|
|
|
+ }
|
|
|
+
|
|
|
+ if (duration.indexOf('H') >= 0 && duration.indexOf('M') == -1) {
|
|
|
+ a = [a[0], 0, a[1]];
|
|
|
+ }
|
|
|
+ if (duration.indexOf('H') >= 0 && duration.indexOf('M') == -1 && duration.indexOf('S') == -1) {
|
|
|
+ a = [a[0], 0, 0];
|
|
|
+ }
|
|
|
+
|
|
|
+ duration = 0;
|
|
|
+
|
|
|
+ if (a.length == 3) {
|
|
|
+ duration = duration + parseInt(a[0]) * 3600;
|
|
|
+ duration = duration + parseInt(a[1]) * 60;
|
|
|
+ duration = duration + parseInt(a[2]);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (a.length == 2) {
|
|
|
+ duration = duration + parseInt(a[0]) * 60;
|
|
|
+ duration = duration + parseInt(a[1]);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (a.length == 1) {
|
|
|
+ duration = duration + parseInt(a[0]);
|
|
|
+ }
|
|
|
+
|
|
|
+ let hours = Math.floor(duration / 3600);
|
|
|
+ let minutes = Math.floor(duration % 3600 / 60);
|
|
|
+ let seconds = Math.floor(duration % 3600 % 60);
|
|
|
+
|
|
|
+ return (hours < 10 ? ("0" + hours + ":") : (hours + ":")) + (minutes < 10 ? ("0" + minutes + ":") : (minutes + ":")) + (seconds < 10 ? ("0" + seconds) : seconds);
|
|
|
+}
|
|
|
+
|
|
|
+const globals = {
|
|
|
+ // stores the socket.io server
|
|
|
+ io: null,
|
|
|
+ // stores stuff related to the Mongo Database
|
|
|
+ db: {
|
|
|
+ // our connection to the database
|
|
|
+ connection: null,
|
|
|
+ // the models we've defined in the database
|
|
|
+ models: null,
|
|
|
+ // the store express / socket.io uses to store sessions in the database
|
|
|
+ store: null
|
|
|
+ },
|
|
|
+ // various utilities used through out the code base
|
|
|
+ utils: {
|
|
|
+ htmlEntities: str => String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'),
|
|
|
+ generateRandomString: len => {
|
|
|
+ let chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split("");
|
|
|
+ let result = [];
|
|
|
+ for (let i = 0; i < len; i++) {
|
|
|
+ result.push(chars[globals.utils.getRandomNumber(0, chars.length - 1)]);
|
|
|
+ }
|
|
|
+ return result.join("");
|
|
|
+ },
|
|
|
+ getSocketFromId: function(socketId) {
|
|
|
+ return globals.io.sockets.sockets[socketId];
|
|
|
+ },
|
|
|
+ getRandomNumber: (min, max) => Math.floor(Math.random() * (max - min + 1)) + min,
|
|
|
+ convertTime,
|
|
|
+ Timer
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+module.exports = globals;
|