148 lines
4.2 KiB
JavaScript
148 lines
4.2 KiB
JavaScript
const config = require('./config')
|
|
const moment = require('moment')
|
|
|
|
class Helper {
|
|
|
|
/**
|
|
* Normalize our config into a proper timestamp, so we know what emails to purge
|
|
* @returns {Date}
|
|
*/
|
|
purgeTimeStamp() {
|
|
return moment()
|
|
.subtract(config.email.purgeTime.time, config.email.purgeTime.unit)
|
|
.toDate()
|
|
}
|
|
|
|
/**
|
|
* Check if time difference between now and purgeTimeStamp is more than one day
|
|
* @param {Date} now
|
|
* @param {Date} past
|
|
* @returns {Boolean}
|
|
*/
|
|
moreThanOneDay(now, past) {
|
|
const DAY_IN_MS = 24 * 60 * 60 * 1000;
|
|
if((now - past) / DAY_IN_MS >= 1){
|
|
return true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Convert time to highest possible unit (minutes, hours, days) where `time > 1` and `Number.isSafeInteger(time)` (whole number)
|
|
* @param {Number} time
|
|
* @param {String} unit
|
|
* @returns {String}
|
|
*/
|
|
convertAndRound(time, unit) {
|
|
let convertedTime = time;
|
|
let convertedUnit = unit;
|
|
let rounded = false;
|
|
|
|
if (convertedUnit === 'minutes') {
|
|
if (convertedTime > 60) {
|
|
convertedTime = convertedTime / 60
|
|
convertedUnit = 'hours';
|
|
}}
|
|
|
|
if (convertedUnit === 'hours') {
|
|
if (convertedTime > 24) {
|
|
convertedTime = convertedTime / 24;
|
|
convertedUnit = 'days';
|
|
}
|
|
}
|
|
|
|
if (!convertedTime == Number.isSafeInteger(convertedTime)) {
|
|
convertedTime = Math.round(convertedTime);
|
|
rounded = true;
|
|
}
|
|
|
|
if (rounded) {
|
|
convertedTime = `~${convertedTime}`;
|
|
}
|
|
|
|
return `${convertedTime} ${convertedUnit}`;
|
|
}
|
|
|
|
/**
|
|
* Build a purgeTime html element for the page to keep the clutter outside of the twig template
|
|
* @returns {String}
|
|
*/
|
|
purgeTimeElemetBuilder() {
|
|
let time = `${config.email.purgeTime.time} ${config.email.purgeTime.unit}`
|
|
let Tooltip = ''
|
|
if (config.email.purgeTime.convert) {
|
|
time = this.convertAndRound(config.email.purgeTime.time, config.email.purgeTime.unit)
|
|
if (time !== `${config.email.purgeTime.time} ${config.email.purgeTime.unit}`) {
|
|
Tooltip = `Config: ${config.email.purgeTime.time} ${config.email.purgeTime.unit}`
|
|
}
|
|
}
|
|
|
|
const footer = `<label title="${Tooltip}">
|
|
<h4 style="display: inline;"><u><i>${time}</i></u></h4>
|
|
</Label>`
|
|
|
|
return footer
|
|
}
|
|
|
|
/**
|
|
* Shuffle an array using the Durstenfeld shuffle algorithm
|
|
* @param {Array} array
|
|
* @returns {Array}
|
|
*/
|
|
|
|
shuffleArray(array) {
|
|
for (let i = array.length - 1; i >= 0; i--) {
|
|
const j = Math.floor(Math.random() * (i + 1));
|
|
[array[i], array[j]] = [array[j], array[i]];
|
|
}
|
|
return array
|
|
}
|
|
|
|
/**
|
|
* Shuffle first item of array, keeping original order afterwards
|
|
* @param {Array} array
|
|
* @returns {Array}
|
|
*/
|
|
|
|
shuffleFirstItem(array) {
|
|
let first = array[Math.floor(Math.random()*array.length)]
|
|
array = array.filter((value)=>value!=first);
|
|
array = [first].concat(array)
|
|
return array
|
|
}
|
|
|
|
/**
|
|
* Hide other emails in the list and only show first (true) or show all (false)
|
|
* @param {Array} array
|
|
* @returns {Array}
|
|
*/
|
|
hideOther(array) {
|
|
if (config.http.hideOther) {
|
|
return array[0]
|
|
} else {
|
|
return array
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get a domain list from config for use
|
|
* @returns {Array}
|
|
*/
|
|
|
|
getDomains() {
|
|
switch (config.http.displaySort) {
|
|
case 0:
|
|
return this.hideOther(config.email.domains) // No modification
|
|
case 1:
|
|
return this.hideOther(config.email.domains.sort()) // Sort alphabetically
|
|
case 2:
|
|
return this.hideOther(this.shuffleFirstItem(config.email.domains.sort())) // Sort alphabetically and shuffle first item
|
|
case 3:
|
|
return this.hideOther(this.shuffleArray(config.email.domains)) // Shuffle all
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = Helper
|